Smart stepenice

Odgovori
Message
Autoru
Korisnikov avatar
DenisHD
Početnik
Postovi: 363
Pridružio se: Sre Jan 04, 2017 11:32 am

Smart stepenice

#1 Post od DenisHD » Pon Okt 22, 2018 11:08 pm

Ok, ovo na prvu verovatno zvuči ludo i šašavo.. Šta mogu stepenice pametno da rade, a da nisu u pitanju one pokretne? :D
Pa stepenice ništa, ali rasveta na njima može da se isprogramira na mnogo načina! :D

Dakle video sam ovaj klip https://www.youtube.com/watch?v=NHkju5ncC4A i taman da sam hteo da preuzmem kod, da imam i ja kad budem to pravio.. kad ono, nema koda.. Lik koji je to napravio, nije ostavio kod u opisu klipa, i ja sam odlučio da to probam da isprogramiram sam! :)
U nedostatku ARGB trake, improvizovao sam sa klasičnim LED -ovima i jedna polovina toga iz klipa radi! Tj. u jednom smeru radi! Ali u drugom smeru, tj. ako bi išao dole niz stepenice, treba mi da se LEDovi uključuju u suprotnom smeru.. E tu sam već "zakočio", i nemam ideju kako to da rešim.. Tj. probao sam 2-3 varijante, ali nije to to (ne radi)...
Jel ima neko ideju kako postaviti kod, da gde prvo detektuje senzor, da odatle krene uključivanje dioda? :D
Btw evo i koda, koji radi:

Kod: Obeleži sve

#define trigPin 13
#define echoPin 12
#define trigPin_2 2
#define echoPin_2 4

int counter = 0;

long duration, distance;
long duration_2, distance_2;

int timer = 100;
int LEDs[] = {6,7,8,9,10,11};
int LEDcount = 6;

void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin_2, OUTPUT);
  pinMode(echoPin_2, INPUT);

  for (int i = 0; i < LEDcount; i++) {
    pinMode(LEDs[i], OUTPUT);
  }
}

void loop(){
  detection();
  switch_led();
}

void measuring(){
    //Definišemo promenljive za merenje rastojanja

  digitalWrite(trigPin, LOW);  //Naredbe za slanje
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);  //povorke signala na senzor

  duration = pulseIn(echoPin, HIGH);  //pulseIn naredba koja služi kao tajmer i smešta podarke u promenljivu duration
  distance = (duration/2) / 29.1;  //Formula za proračunavanje razdaljine, iz koje se posle podaci smeštaju u promenljivu distance

  

    //Definišemo promenljive za merenje rastojanja

  digitalWrite(trigPin_2, LOW);  //Naredbe za slanje
  delayMicroseconds(2);
  digitalWrite(trigPin_2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin_2, LOW);  //povorke signala na senzor

  duration_2 = pulseIn(echoPin_2, HIGH);  //pulseIn naredba koja služi kao tajmer i smešta podarke u promenljivu duration
  distance_2 = (duration_2/2) / 29.1;  //Formula za proračunavanje razdaljine, iz koje se posle podaci smeštaju u promenljivu distance
}

void detection(){
  measuring();

  if(distance < 25){
    counter = 1;
    }else{}
  
  if(distance_2 < 25){
    counter = 0;
    }else{}
}

void switch_led(){
  switch(counter){
    case 1: for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], HIGH);
              delay(timer);
  }
    break;
    default: for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], LOW);
              delay(timer);
    
    /*for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], LOW);
               delay(timer);
  }*/
  }
  break;
 }
}
I propali "unapredjeni" kod (za ovo drugo, sto sam pomenuo):

Kod: Obeleži sve

#define trigPin 13
#define echoPin 12
#define trigPin_2 2
#define echoPin_2 4

int counter = 0;
int up_down = 0;

long duration, distance;
long duration_2, distance_2;

int timer = 100;
int LEDs[] = {6,7,8,9,10,11};
int LEDcount = 6;

void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin_2, OUTPUT);
  pinMode(echoPin_2, INPUT);

  for (int i = 0; i < LEDcount; i++) {
    pinMode(LEDs[i], OUTPUT);
  }
}

void loop(){
  detection();
  switch_led();
}

void measuring(){
    //Definišemo promenljive za merenje rastojanja

  digitalWrite(trigPin, LOW);  //Naredbe za slanje
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);  //povorke signala na senzor

  duration = pulseIn(echoPin, HIGH);  //pulseIn naredba koja služi kao tajmer i smešta podarke u promenljivu duration
  distance = (duration/2) / 29.1;  //Formula za proračunavanje razdaljine, iz koje se posle podaci smeštaju u promenljivu distance

  

    //Definišemo promenljive za merenje rastojanja

  digitalWrite(trigPin_2, LOW);  //Naredbe za slanje
  delayMicroseconds(2);
  digitalWrite(trigPin_2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin_2, LOW);  //povorke signala na senzor

  duration_2 = pulseIn(echoPin_2, HIGH);  //pulseIn naredba koja služi kao tajmer i smešta podarke u promenljivu duration
  distance_2 = (duration_2/2) / 29.1;  //Formula za proračunavanje razdaljine, iz koje se posle podaci smeštaju u promenljivu distance
}

void detection(){
  measuring();

  if(distance < 25){
    if(distance_2 < 25){
      up_down = 1;
      }
    }else if(distance_2 < 25){
      if(distance < 25){
        up_down = 0;
        }
      }
}

void switch_led(){
  switch(up_down){
  case 1: switch(counter){
            case 1: for (int i = 0; i < LEDcount; i++) {
                      digitalWrite(LEDs[i], HIGH);
                      delay(timer);
  }
            break;
            default: for (int i = 0; i < LEDcount; i++) {
                       digitalWrite(LEDs[i], LOW);
                       delay(timer);
    
    /*for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], LOW);
               delay(timer);
  }*/
  }
  break;
 }
 break;
 default: switch(counter){
            case 1: for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], HIGH);
               delay(timer);
  }
            break;
            default: for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], LOW);
               delay(timer);
  }
  break;
 }
 break;
}
}

Korisnikov avatar
elektricar024
Site Admin
Postovi: 1052
Pridružio se: Ned Maj 15, 2016 1:27 pm
Lokacija: Subotica
Kontakt:

Re: Smart stepenice

#2 Post od elektricar024 » Uto Okt 23, 2018 5:02 am

Mozgaj denise mozgaj :D
Baš mi je drago da si nabacio svoju glavu za samostalan projekat.

Tebi je generalni problem da ti nije odrađen glavna if() petlja. Jedna za gore druga za dole. Ako se kreće sa ove strane ili ako se kreće sa one strane.
Imaš tu još mnogo šta za ispravku, al najbolji način za učenje kada sam shvatiš kako i gde. To je ono pravo...
Ne postoji višak alat, samo retko korišten :confusion-confused:

Korisnikov avatar
DenisHD
Početnik
Postovi: 363
Pridružio se: Sre Jan 04, 2017 11:32 am

Re: Smart stepenice

#3 Post od DenisHD » Sre Okt 24, 2018 7:01 am

Ima napretka! :D
Detektuje i "od gore", ali sad su se pojavili novi bagovi u kodu... :lol: :doh:
Dakle kad detektuje prvi senzor desi se da ako sklonim ruku, poisključuju se diode, dakle odmah predje na case 2..
Ili se desi da tek kad sklonim ruku sa prvog senzora, tek tad predje na case 1.. do tad ništa ne radi..
A dešava se i da kad detektuje prvi senzor i odmah nakon toga i drugi, onda ide prvo case 1, pa case 2..
Au... ne vredi ni da pišem.. upravo sam isprobavao kako radi na odredjene detekcije... svaki put drugi bag... :doh: :doh:
Inače evo i koda:

Kod: Obeleži sve

#define trigPin 13
#define echoPin 12
#define trigPin_2 2
#define echoPin_2 4

int counter = 0;

long duration, distance;
long duration_2, distance_2;

boolean sensorUpperActive;
boolean sensorBottomActive;

int timer = 100;
int LEDs[] = {6,7,8,9,10,11};
int LEDcount = 6;

void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin_2, OUTPUT);
  pinMode(echoPin_2, INPUT);

  for (int i = 0; i < LEDcount; i++) {
    pinMode(LEDs[i], OUTPUT);
  }
}

void loop(){
  detection();
  switch_led();
}

void measuring(){

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;


  digitalWrite(trigPin_2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin_2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin_2, LOW);

  duration_2 = pulseIn(echoPin_2, HIGH);
  distance_2 = (duration_2/2) / 29.1;
}

void FromBottomTrigger() {
  measuring();

  if (distance < 50) {
    sensorBottomActive = true;
  }
}

void FromUpperTriger() {
  measuring();

  if (distance_2 < 50) {
    sensorUpperActive = true;
  }
}

void detection(){
  measuring();
  FromBottomTrigger();
  FromUpperTriger();

  if(sensorBottomActive == true){
    counter = 1;
  }else if(distance_2 < 50){
    counter = 2;
  }

  if(sensorUpperActive == true){
    counter = 3;
  }else if(distance < 50){
    counter = 4;
  }
}

void switch_led(){
  switch(counter){
    case 1: for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], HIGH);
              delay(timer);
  }
    break;
    case 2:  for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], LOW);
              delay(timer);
    }
    break;
    case 3: for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], HIGH);
               delay(timer);
  }
    break;
    case 4: for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], LOW);
               delay(timer);
  }
    break;
    default: for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], LOW);
              delay(timer);
    
    /*for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], LOW);
               delay(timer);
  }*/
  }
  break;
 }
}

Korisnikov avatar
DenisHD
Početnik
Postovi: 363
Pridružio se: Sre Jan 04, 2017 11:32 am

Re: Smart stepenice

#4 Post od DenisHD » Sre Okt 24, 2018 7:13 am

Inače i ovi HC-SR04 senzori su spori za brzu detekciju, tako da ću vrv preći na HC-SR504 senzore pokreta.. imam jedan takav, i dosta se bolje pokazao za brze detekcije! :) Em manje linija koda, em bolja detekcija! :D
Inače i taj lik kod koga sam ovo video, isto preporučuje korišćenje PIR senzora.

Korisnikov avatar
DenisHD
Početnik
Postovi: 363
Pridružio se: Sre Jan 04, 2017 11:32 am

Re: Smart stepenice

#5 Post od DenisHD » Pon Okt 29, 2018 3:57 pm

Ne ide mi baš debagovanje koda.. može mala pomoć, gde sam pogrešio u kodu? :)

Korisnikov avatar
DenisHD
Početnik
Postovi: 363
Pridružio se: Sre Jan 04, 2017 11:32 am

Re: Smart stepenice

#6 Post od DenisHD » Pon Okt 29, 2018 6:28 pm

Uspeo sam nešto, ali ima još bagova... Dakle sad ako prvo detektuje "donji senzor", ukljucuje diode "od dole", i posle na detekciju gornjeg senzora diode bi trebale da se tim istim redosledom iskljuce.. ali ne iskljucuju se.. Isto se desava i kad prvo detektuje gornji senzor, samo obrnutim redosledom... Inace evo i koda:

Kod: Obeleži sve

#define trigPin 13
#define echoPin 12
#define trigPin_2 2
#define echoPin_2 4

int counter = 0;
int switching = 0;

long duration, distance;
long duration_2, distance_2;

boolean sensorUpperActive;
boolean sensorBottomActive;

int timer = 100;
int LEDs[] = {6,7,8,9,10,11};
int LEDcount = 6;

void setup(){
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(trigPin_2, OUTPUT);
  pinMode(echoPin_2, INPUT);

  for (int i = 0; i < LEDcount; i++) {
    pinMode(LEDs[i], OUTPUT);
  }
}

void loop(){
  detection();
  switch_led();
}

int measuring(){

  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;


  digitalWrite(trigPin_2, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin_2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin_2, LOW);

  duration_2 = pulseIn(echoPin_2, HIGH);
  distance_2 = (duration_2/2) / 29.1;
}

int FromDownOrUpper(){
  measuring();
  
  if(distance <= 50 && distance_2 > 50){
  switching = 1;
  }else if(distance_2 <= 50 && distance > 50){
  switching = 2;
  }
}



int detection(){
  measuring();
  FromDownOrUpper();

  switch(switching){
    case 1: Serial.println("From bottom");
            if(distance < 50){
              counter = 1;
              }else if(distance_2 < 50){
                counter = 2;
                }
    break;
    case 2: Serial.println("From upper");
            if(distance_2 < 50){
              counter = 3;
              }else if(distance_2 < 50){
                counter = 4;
                }
    }
}

void switch_led(){
  switch(counter){
    case 1: for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], HIGH);
              delay(timer);
  }
    break;
    case 2:  for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], LOW);
              delay(timer);
    }
    break;
    case 3: for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], HIGH);
               delay(timer);
  }
    break;
    case 4: for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], LOW);
               delay(timer);
  }
    break;
    default: for (int i = 0; i < LEDcount; i++) {
              digitalWrite(LEDs[i], LOW);
              delay(timer);
    
    /*for (int i = LEDcount - 1; i >= 0; i--) {
               digitalWrite(LEDs[i], LOW);
               delay(timer);
  }*/
  }
  break;
 }
}

Odgovori

Ko je OnLine

Korisnika u ovom forumu: Nema registrovanih korisnika i 1 gost