Skocz do zawartości
Wprost123

Proste podświetlanie schodów na Arduino. Prośba o pomoc w stworzeniu programu

Pomocna odpowiedź

Jestem początkujący, po kursie Arduino z Forbota. Chciałbym stworzyć układ do sterowania podświetlaniem schodów (bez PWM i skomplikowanych efektów świetlnych. Tylko kolejne rozświetlanie i gaszenie). Niestety sam nie mam pomysłu jak się do tego zabrać. Z Waszą pomocą chciałbym po kolei stworzyć kolejne etapy/ części kodu.
Układ miałby mieć dwie czujki PIR. Na górze i na dole schodów.

Pierwsza część kodu jaką chciałbym stworzyć z Waszą pomocą, powinna działać tak, że:
->Na początek mówimy tylko o jednym czujniku i np. 5 diodach.
->Gdy staję na dole, to powinny się rozświetlać kolejne diody w górę, z ustalonym odstępem czasowym np. 1s.
->Gdy zapalą się wszystkie , to powinny świecić jeszcze np. 10 sekund.
->Gdy podczas rozświetlania (np. świecą już 4 z 5 diod) czujnik PIR znów wykryje ruch (wchodzi druga osoba) to kontynuuje rozświetlanie, ale rozpoczyna liczenie czasu świecenia od nowa- czyli 5s (na wszystkie schody po 1s ) + 10s na dodatkowe świecenie na koniec.
->Po rozświetleniu wszystkich diod+ czas dodatkowego świecenia, diody powinny zacząć gasnąć w kolejności takiej jak się rozświetlały.

Nie wiem czy dobrze myślę, ale wydaje mi się, że trzeba zrobić to z użyciem millis(), zamiast delay. Gdyby było delay, to czujka chyba byłaby zablokowana na te 15s (5s rozświetlanie diod i 10s świecenia na koniec) a w tym czasie może na schody wejść druga osoba.
Czy do wykrycia tej drugiej osoby potrzebne będzie przerwanie, czy można się bez niego obejść?

Zamieszczam mój dotychczasowy kod. Wiem, że słabizna straszna, ale nie wiem jak to ugryźć, żeby kolejne diody rozświetlały się np. w pętli "for". Proszę o poradę:
1. Jak "upchnąć" te kolejne podświetlania do pętli for
2. Jak sprawić że gdy podczas rozświetlania (np. świecą już 4 z 5 diod) gdy czujnik PIR znów wykryje ruch (wchodzi druga osoba) to kontynuuje rozświetlanie, ale rozpoczyna liczenie czasu świecenia od nowa- czyli 5s (na wszystkie schody) + 10s na dodatkowe świecenie na koniec.
3. Jak po określonym czasie oczekiwania gdy święcą wszystkie diody, rozpocząć gaszenie od pierwszej do piątej diody. 

Będę wdzięczny za łopatologiczną pomoc.
Wiem, że podobne tematy można znaleźć na innym forum, ale tam był już pewien większy- całościowy kod i nie do końca go rozumiałem. Chciałbym też spróbować stworzyć taki kod z waszą pomocą po kolei. To byłaby lepsza forma nauki.

 

#define PIR 7
#define LED1 2
#define LED2 3
#define LED3 4
#define LED4 5
#define LED5 6

unsigned long aktualnyCzas=0;
unsigned long zapisanyCzasLED1=0;
unsigned long zapisanyCzasLED2=0;
unsigned long zapisanyCzasLED3=0;
unsigned long zapisanyCzasLED4=0;
unsigned long zapisanyCzasLED5=0;
unsigned long odstepPodswietlania=500;


volatile int stanPIR = 1;

void setup(){
  Serial.begin(9600);
  pinMode(PIR,INPUT);
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);
  pinMode(LED4,OUTPUT);
  pinMode(LED5,OUTPUT);
  
}

void loop(){
aktualnyCzas=millis();

  if(digitalRead(PIR)==HIGH){
    stanPIR=1;
  }
  
  switch(stanPIR){
 

  case 1:
 
   if(aktualnyCzas-zapisanyCzasLED1>=odstepPodswietlania){
     zapisanyCzasLED1=aktualnyCzas;
     digitalWrite(LED1,HIGH);
   }
 if(aktualnyCzas-zapisanyCzasLED2>=odstepPodswietlania*2){   //odstępy pomiędzy zaświeceniem kolejnej diody przez mnożenie "podstawy"
     zapisanyCzasLED2=aktualnyCzas;
     digitalWrite(LED2,HIGH);
   } 
   if(aktualnyCzas-zapisanyCzasLED3>=odstepPodswietlania*3){
     zapisanyCzasLED3=aktualnyCzas;
     digitalWrite(LED3,HIGH);
 }
     if(aktualnyCzas-zapisanyCzasLED4>=odstepPodswietlania*4){
     zapisanyCzasLED4=aktualnyCzas;
     digitalWrite(LED4,HIGH);
  }
   
   if(aktualnyCzas-zapisanyCzasLED5>=odstepPodswietlania*5){
     zapisanyCzasLED5=aktualnyCzas;
     digitalWrite(LED5,HIGH);
    }
   break;
   }
   
}

 

ośw schodów 1.jpg

Udostępnij ten post


Link to post
Share on other sites

Po pierwsze nie przełączaj zmiennej stanPIR bo zawsze będziesz miał tylko dwa stany, LOW albo HIGH.

Po drugie inaczej użyj funkcji switch. Machnięte na szybko:
 

void cosTam()
{
  byte zmienna = 0;
  unsigned long oldTime;
  unsigned long newTime;
if(digitalRead(PIR)
{
    newTime = millis();
    if (newTime - oldTime >= 1000)
    {
      oldTime = newTime;
      switch (zmienna)
      {
      case 2:
        digitalWrite(led1, HIGH);
        break;
      case 4:
        digitalWrite(led2, HIGH);
        break;
      case 6:
        digitalWrite(led3, HIGH);
        break;
      case 8:
        digitalWrite(led4, HIGH);
        break;
      }
    }
}
}

 

Udostępnij ten post


Link to post
Share on other sites

@matrix0606  Dziękuję.

Jak wspomniałem, jestem mocno początkujący. Widzę, że jest tutaj nadpisywanie nowego czasu co 1s. Pytanie jednak, jak rośnie tutaj "zmienna" odpowiadającą za wartość która jest potem wybierana w "kejsie" switch-a?  Chyba nie ma tutaj kodu odpowiadającego za wzrost zmiennej "zmienna". Byłbym wdzięczny gdyby Kolega napisał jak taki fragment powinien wyglądać. 

Oraz pytanie, dlaczego przypadki "kejsów" są zwiększane o 2, a nie o 1?  Czy może chodziło o to, żeby przypadki  1,3,5,7 odpowiadały za gaszenie ledów, czy o coś innego?

 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Zmienna o nazwie "zmienna" rośnie co 1sek dzięki kawałkowi kodu:

newTime = millis();
if (newTime - oldTime >= 1000)
{
 oldTime = newTime;
 if(zmienna < iloscDiod)
 {
 zmienna++;
 }
 else
 {
 zmienna = 0;
 }
}

To jest prosty kawałek kodu jeśli podstawisz sobie liczby. Dajmy na to jeśli millis = 5000 i przepiszesz to do zmiennej newTime to ta ostatnia zmienna czyli newTime = 5000 i teraz, jeśli powiedzmy oldTime jeszcze = 0 to w myśl warunku:
If (newTime - oldTime >= 1000) czyli:
if (5000 - 0 >= 1000) to
  { oldTime = newTime;} czyli:
  5000 = 5000
a zmienna millis dalej rośnie i wpisywana jest do zmiennej newTime oraz sprawdzany jest warunek:
if (newTime - oldTime >= 1000)

I teraz jeśli millis a zarazem zmienna newTime osiągnie wartość 6000 czyli zostanie spełniony warunek
if (newTime - oldTime >= 1000)
to zmienna oldTime też będzie miała 6000

i w ten oto sposób sprawdzamy upłynięcie czasu 1sek. W ten sam sposób można mierzyć dowolny inny czas.

Zmienna "zmienna" sprawdzana jest co dwa żeby był czas przerwy 1sek między włączaniem kolejnych diod, ale nie musi być co dwa, może być co 1.

void cosTam()							//funckja nazwana w dowolny sposób
{
  byte iloscDioda = 10;					//ilosc schodów czyli ilość diod
  byte zmienna = 0;						//zmienna do "przemiatania"
  unsigned long oldTime;				//zmienna starego czasu
  unsigned long newTime;				//zmienna nowego czasu
if(digitalRead(PIR)						//jeśli odczytany stan czujki = 0 to
{
    newTime = millis();					//do zmiennej newTime wpisujesz czas z millis
    if (newTime - oldTime >= 1000)		//jeśli nowy czas - stary czas jest >= 1000 czyli mniej więcej 1sek to
    {
      oldTime = newTime;				//stary czas = nowy czas
		if(zmienna < iloscDiod)			//jeśli zmienna mniejsza niż zakładana ilość diod to
        {
          zmienna++;					//można zwiększyć wartość zmiennej - kawałek kodu odpowiadający za zwiększanie zmiennej "zmienna"
        }else
        {
          zmienna = 0;					//jeśli "zmienna" zwiększy swoją wartość powyżej ilości diod to wyzeruj jej wartość
        }
      switch (zmienna)					//dzięki temu że minęla 1sek możemy wybrać co się stanie
      {
      case 2:							//jeśli minęły 2sek włączasz led1
        digitalWrite(led1, HIGH);
        break;
      case 4:							//odliczasz kolejne 2sek i włączasz led2
        digitalWrite(led2, HIGH);
        break;
      case 6:
        digitalWrite(led3, HIGH);		//itd
        break;
      case 8:
        digitalWrite(led4, HIGH);		//ustawione co 2sek żeby była przerwa 1sek, może być co 1sek.
        break;
      }
    }
}
}

 

Edytowano przez matrix0606

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@matrix0606 

Dziękuję.  Przeanalizuję i postaram się skorzystać z tego sposobu w moim projekcie.

Jeszcze pytanie, dlaczego warunek z PIR jest na stan niski z czujki? Czy sekwancja rozświetlania nie powinna się aktywować gdy PIR poda stan wysoki- czyli po wykryciu ruchu? 

Edytowano przez Wprost123

Udostępnij ten post


Link to post
Share on other sites

W warunku:
 

if(digitalRead(PIR)

specjalnie nie dopisywałem == 0 albo ==1 żebyś sam sobie wpisał na jaki stan masz reakcję ponieważ ja nie wiem jak działa Ci hardware.

Udostępnij ten post


Link to post
Share on other sites

Że zadam może głupie pytanie.Czy ten  program obsługuje komunikację dwukierunkową.To znaczy czy jak schodzę ze schodów to najpierw zapalają się diody  te od góry a później jak wchodzę po schodach do góry to zapalają się diody  od dołu.Jak to jest u Ciebie w założeniach konstruktorskich?

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@Wprost123 Jeśli chodzi o mnie i moje założenia, to są takie że diody powinny działać w dwie strony.  

Kolega matrix0606 napisał fragment który odpwiada tylko za jeden czujnik. Dla drugiego byłoby analogicznie. 

Ja próbuję narazie w ten sposób,  że po tych np 5 "kejsach" zapalania diod są 3 "kejsy" które nic nie robią-  to takie podtrzymanie świecenia. Następnie 5 kolejnych kejsów czyli 9-13 tak samo jak w przykładzie, ale zamiast stanu HIGH daję LOW, żeby wygasić diody po kolei.

@matrix0606 

Ok dziękuję.  Wczoraj  nad tym siedziałem, kombinowałem. Udało mi się zrobić rozświetlanie, 3 kejsy które nic nie robią- na podtrzymanie świecenia i potem kolejne na gaszenie. 

Pytanie, czy zamiast kejsów mógłby Kolega napisać  takie rozświetlanie (ze sprawdzaniem czasu czy minęła 1s) ale w pętli for?

Wtedy przez analogię, próbowałbym dopisać  podtrzymanie i wygaszenie.  Myślę,  że wtedy może udałoby mi się   napisać taki kod, w którym można byłoby regulować potencjometrem zmienną odpowiadającą za  czas podtrzymania świecenia. 

Edytowano przez Wprost123

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

W pętli for to będzie kiszka bo pętla for zatrzymuje działanie całego programu póki się nie wykona. Wówczas w pętli for to sobie można nawet delay używać.
Można oczywiście przerwać działanie pętli for ale wówczas po co to jej działanie rozpoczynać ?

Procedura switch wbrew pozorom jest bardzo prosta i przede wszystkim genialna w swoim działaniu. Ja na ten przykład switch kocham, ponieważ diametralnie upraszcza działanie programu i nie zatrzymuje go nawet jeśli w jej przypadku skorzystam z metody poolingu odpytując jakąś funkcję w której switch jest zawarta.
Tak wygląda zapalanie i gaszenie co 1sek 5 schodów za pomocą dyrektywy switch. Mogą występować małe błędy bo pisane na sucho bez testów.

Jeśli będziesz bardzo chciał to napiszę Ci to i dla pętli for...

Za pomocą switch to ja napisałem mini menu dla stacji lutowniczej -> PODGLĄD FILMU <- (jeszcze nie skończone)

 

void cosTam()
{
  byte iloscDiod = 10;       
  byte zmienna = 0;          
  unsigned long oldTime;     //jeśli źle działało by ze zmiennymi lokalnymi to trzeba
  unsigned long newTime;     //zadeklarować je jako globalne
  if (digitalRead(PIR) == 1) 
  {
    newTime = millis();            
    if (newTime - oldTime >= 1000) 
    {
      oldTime = newTime;        
      if (zmienna <= iloscDiod) 
      {
        zmienna++; 
      }
      else
      {
        zmienna = 0; 
      }

      switch (zmienna) 
      {
      case 1: 
        digitalWrite(led1, HIGH);
        break;
      case 2: 
        digitalWrite(led2, HIGH);
        break;
      case 3:
        digitalWrite(led3, HIGH); 
        break;
      case 4:
        digitalWrite(led4, HIGH); 
        break;
      case 5:
        digitalWrite(led5, HIGH); 
        break;
      case 6:
        digitalWrite(led5, LOW); 
        break;
      case 7:
        digitalWrite(led4, LOW); 
        break;
      case 8:
        digitalWrite(led3, LOW); 
        break;
      case 9:
        digitalWrite(led2, LOW); 
        break;
      case 10:
        digitalWrite(led1, LOW); 
        break;
      }
    }
  }
}

 

Edytowano przez matrix0606

Udostępnij ten post


Link to post
Share on other sites

Nie chcę niczego sugerować ale takie coś robi się na 5-ciu czujnikach.Zacznijmy  od tego ,ze weźmiesz kartkę papieru,ołówek i gumkę do wycierania.Narysuj kreskę poziomą
 u góry a na końcach dwie małe kreski pionowe.Ten rysunek symbolizuje schody(jak w casino de Paris, schody które nie mogą wyjść z mody...).Z lewej strony narysuj dwa małe kwadraciki i po prawej też dwa małe kwadraciki.To są symbole czujników podczerwieni.Opisz je 1,2,3,4.Proponuję użyć jako czujników ruchu TSOP31233.Są to  czujniki wysokiej klasy,które jak spojrzysz do datasheet  to dowiesz się,że są odporne na refleksy,zmianę oświetlenia  i inne zakłócenia.Czujnik reaguje na podczerwień pulsująca z częstotliwością ok.33khz.Generator  kupisz gotowy albo zrobisz.Dlaczego 33khz.Bo jest to typowa częstotliwość używana w prostych zegarach a rezonator lub generator jest powszechnie dostępny.Tych czujników będziesz potrzebował 4 szt.Dwa na dole dwa na górze.
  Załóżmy,że jesteś na dole i zbliżasz się do schodów wówczas przecinasz strumień podczerwieni płynący do pierwszego czujnika po czym przecinasz drugi
strumień podczerwieni idący do drugiego czujnika.Kontroler ma zarejestrować tę sekwencję zdarzeń.Jeśli rozpozna to ma za zadanie
włączyć oświetlenie.Teraz idziesz do góry( w środku programu masz bla,bla,bla i diody zapalają się jako sekwencja) i dochodzisz do kolejnych dwóch czujników i sytuacja się powtarza.Ta druga sekwencja wyłącza oświetlenie z pewnym opóźnieniem.Analogicznie jest w odwrotną stronę.Piąty czujnik to fotorezystor wykrywający dzień/noc po to by włączyć/wyłączyć urządzenie.

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

@matrix0606  Dzięki za oświecenie z tą pętlą for. Rzeczywiście trochę by się tu nie sprawdziła, bo w czasie jej wykonywania ktoś może wejść na schody i tego program nie wykryje, jeśli będzie w pętli. 

Z ciekawości i dla nauki, prosiłbym jednak o napisanie fragmentu kodu który rozświetlałby diody w pętli for. 

 

Druga prośba i pytanie. Napisałem kod jak poniżej. Żeby było mi trochę łatwiej to na początku dla sterowania przyciskami a nie PIR-ami. Zrobiłem dla dwóch przycisków, w środku "kejsów" są trzy które nic nie robią- czyli po rozświetleniu jeszcze np. 3 s  świecą wszystkie (u mnie okresy są 300UL bo narazie robię na symulatorze Tinkercad). 

Pytanie, czy mógłbym teraz jakoś regulować czas podtrzymania świecenia wszystkich schodów za pomocą np.  potencjometru?  Teraz, żeby zmienić czas tego podtrzymania, muszę zmienić ilość i akcje we wszystkich "kejsach" np. dodać kolejne dwa puste, żeby przedłużyć podtrzymanie o 2s. Jeśli można to jakoś zmienić tak, żebym mógł zmieniać ten czas np. potencjometrem, to poproszę o pomoc i napisanie takiego fragmentu kodu.

 

#define led1 4
#define led2 5
#define led3 6
#define led4 7
#define led5 8
#define led6 9
#define led7 10


 unsigned long oldTime=0;    //zmienna starego czasu
  unsigned long newTime=0;
  byte iloscKrokow = 17; // il. diod x 2 bo zapalanie i gaszenie + podtrzymanie np 3 okresy nic nie robią- podtrzymanie. 7 diod=>2x7+3=17
  byte zmiennaP1 = 0;  //zmienna dla przycisku 1
  byte zmiennaP2 = 0;  // zmienna dla przycisku 2

  byte stanPrzycisku1=0;   //0-puszczony, 1-wciśnięty
  byte stanPrzycisku2=0;

void setup(){
pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
pinMode(led6,OUTPUT);
pinMode(led7,OUTPUT);
  
pinMode(2,INPUT_PULLUP); //przycisk 1
pinMode(3,INPUT_PULLUP); // przycisk 2
  
Serial.begin(9600);
}

void loop()
{
                         
if(digitalRead(2)==LOW)                        //jeśli wciśnięty przycisk 1 to
{stanPrzycisku1=1;
}
 
  if(stanPrzycisku1==1){ 
    newTime = millis();                    //do zmiennej newTime wpisujesz czas z millis
    if (newTime - oldTime >= 300)        //jeśli nowy czas - stary czas jest >= 1000 czyli mniej więcej 1sek to
    {
      oldTime = newTime;                //stary czas = nowy czas
      Serial.print("nowy czas ");
      Serial.println(oldTime);
      
        if(zmiennaP1 < iloscKrokow)            //jeśli zmienna mniejsza niż ilość  kroków to dodaj 1
        {
          zmiennaP1++;                    // zwiększ wartość zmiennej dla przycisku1
      Serial.print("zmienna P1 ");  
      Serial.println(zmiennaP1);       //wypisuje w jakim kroku jesteśmy
      
        }else
        {
          zmiennaP1 = 0;                    //jeśli "zmienna" zwiększy swoją wartość powyżej ilości ustalonych kroków to wyzeruj jej wartość
             stanPrzycisku1=0;
        }
      switch (zmiennaP1)                    //dzięki temu że minęla 1sek możemy wybrać co się stanie
      {
      case 1:                            //jeśli minęły 1sek włącz  led1
        digitalWrite(led1, HIGH);
        break;
      case 2:                            //odliczasz kolejne 1sek i włączasz led2
        digitalWrite(led2, HIGH);
        break;
      case 3:
        digitalWrite(led3, HIGH);        //itd
        break;
      case 4:
        digitalWrite(led4, HIGH);        
        break;
        case 5:
        digitalWrite(led5, HIGH);        
        break;
        case 6:                            
        digitalWrite(led6, HIGH); 
        break;
      case 7:                          
        digitalWrite(led7, HIGH);
        break;
      case 8:    // puste case-y  jako podtrzymanie świecenia
                  
        break;
      case 9:
                  
        break;
      case 10:
                  
        break;
        
      case 11:
        digitalWrite(led7, LOW);        // gaszenie co sekundę
        break;
        case 12:
        digitalWrite(led6, LOW);       
        break;
        case 13:
        digitalWrite(led5, LOW);       
        break;
        case 14:
        digitalWrite(led4, LOW);      
        break;
        case 15:
        digitalWrite(led3, LOW);      
        break;
        case 16:
        digitalWrite(led2, LOW);        
        break;
        case 17:
        digitalWrite(led1, LOW);       
        break;
  
      }
    }
}
  
  if(digitalRead(3)==LOW)                        //jeśli odczytany stan przycisku 2= 0 to
{stanPrzycisku2=1;
}
 
  if(stanPrzycisku2==1){ 
    newTime = millis();                    //do zmiennej newTime wpisujesz czas z millis
    if (newTime - oldTime >= 300)        //jeśli nowy czas - stary czas jest >= 1000 czyli mniej więcej 1sek to
    {
      oldTime = newTime;                //stary czas = nowy czas
      Serial.print("nowy czas ");
      Serial.println(oldTime);
      
        if(zmiennaP2 < iloscKrokow)            //jeśli zmienna mniejsza niż zakładana ilość  kroków to dodaj 1
        {
          zmiennaP2++;                  
      Serial.print("zmienna P2 ");
      Serial.println(zmiennaP2);
        
        
        }else
        {
          zmiennaP2 = 0;                    //jeśli "zmienna" zwiększy swoją wartość powyżej ustalonej ilości kroków to wyzeruj jej wartość
             stanPrzycisku2=0;
        }
      switch (zmiennaP2)                    //dzięki temu że minęla 1sek możemy wybrać co się stanie
      {
     case 1:                            //jeśli minęła 1 sek włącz led 7 bo tu idziemy od góry
        digitalWrite(led7, HIGH);
        break;
      case 2:                           
        digitalWrite(led6, HIGH);
        break;
      case 3:
        digitalWrite(led5, HIGH);        //itd
        break;
      case 4:
        digitalWrite(led4, HIGH);        
        break;
        case 5:
        digitalWrite(led3, HIGH);        
        case 6:                            
        digitalWrite(led2, HIGH); 
        break;
      case 7:                            
        digitalWrite(led1, HIGH);
        break;
      case 8:
                  
        break;      // puste case-y jako podtrzymanie świecenia wszystkich diod przez 3 okresy
      case 9:
                  
        break;
      case 10:
                  
        break;
        
      case 11:
        digitalWrite(led7, LOW);       // wygaszenie
        break;
        case 12:
        digitalWrite(led6, LOW);        
        break;
        case 13:
        digitalWrite(led5, LOW);        
        break;
        case 14:
        digitalWrite(led4, LOW);        
        break;
        case 15:
        digitalWrite(led3, LOW);        
        break;
        case 16:
        digitalWrite(led2, LOW);       .
        break;
        case 17:
        digitalWrite(led1, LOW);       
        break;
    
       
      }
    }
}
     
}

 

 

Edytowano przez Wprost123

Udostępnij ten post


Link to post
Share on other sites

@szymonw  O tym, żeby sprawdzać wejście na schody przy pomocy dwóch czujek podczerwieni też myślałem. Wiem że jeden PIR może aktywować sekwencję gdy ktoś tylko będzie przechodził obok schodów.  Jednak jestem bardzo początkujący i sam bym takiej bariery nie zrobił. Myślałem o barierach z bram, ale takie nawet najtańsze kosztują ok 40zł, a tu potrzebne byłyby 4, więc robi się już dodatkowe 160zł. Poza tym, projekt jest tylko dla mnie, bardziej w celu nauki programowania, więc nie musi być idealny. 

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

1,96zł ale to za samą diodę, a nie za całą barierę która podawałaby odpowiedni sygnał po wykryciu przerwania wiązki, a tak jak wspomniałem, raczej nie poradziłbym sobie ze zrobieniem odpowiedniego generatora. 

Edytowano przez Wprost123

Udostępnij ten post


Link to post
Share on other sites
(edytowany)

Proszę o podpowiedź co zepsułem, że teraz po naciśnięciu przycisku 1 (lub 2) rozświetla mi się tylko pierwsza dioda. Żeby zapaliła się kolejna, to muszę kolejny raz nacisnąć przycisk.

Chciałem w funkcji loop umieścić tylko wejścia do dwóch funkcji- rozświetlania od dołu lub od góry, ale same funkcje odpowiedzialne za rozświetlanie umieścić już poza funkcją loop. 

void loop()
{
  if(digitalRead(2)==LOW)                       
{ stanPrzycisku1=1;
 rozswietlZdolu();
}
                  


if(digitalRead(3)==LOW)                        
{stanPrzycisku2=1;
 rozswietlZgory();
 }
}


  void rozswietlZdolu(){
  if(stanPrzycisku1==1){
    newTime = millis();                    
    if (newTime - oldTime >= 300)        
    {
      oldTime = newTime;               
      Serial.print("nowy czas ");
      Serial.println(oldTime);
      
        if(zmiennaP1 < iloscKrokow)           
        {
          zmiennaP1++;                    
      Serial.print("zmienna P1 ");
      Serial.println(zmiennaP1);
        
        
        }else
        {
          zmiennaP1 = 0;                    
             stanPrzycisku1=0;
        }
      switch (zmiennaP1)                    
      {
      case 1:                           
        digitalWrite(led1, HIGH);
        break;
      case 2:                            
        digitalWrite(led2, HIGH);
        break;
      case 3:
        digitalWrite(led3, HIGH);        
        break;
      case 4:
        digitalWrite(led4, HIGH);        
        break;
        case 5:
        digitalWrite(led5, HIGH);        
        break;
        case 6:                            
        digitalWrite(led6, HIGH); 
        break;
      case 7:                           
        digitalWrite(led7, HIGH);
        break;
      case 8:
                  
        break;
      case 9:
                  
        break;
      case 10:
                  
        break;
        
      case 11:
        digitalWrite(led1, LOW);        
        break;
        case 12:
        digitalWrite(led2, LOW);        
        break;
        case 13:
        digitalWrite(led3, LOW);        
        break;
        case 14:
        digitalWrite(led4, LOW);        
        break;
        case 15:
        digitalWrite(led5, LOW);        
        break;
        case 16:
        digitalWrite(led6, LOW);        
        break;
        case 17:
        digitalWrite(led7, LOW);        
        break;
        
      }
        
      }
    }

  }    

Myślę, że gdzieś coś z "klamerkami" popsułem. 

Edytowano przez Wprost123

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...