Skocz do zawartości

Prosty przełacznik czasowy


ciemo12

Pomocna odpowiedź

Witam wszystkich mam mały problem i siedzę nad tym już kilka dni po zajęciach a mianowicie chciałem zrobić prosty przełącznik czasowy,  4 przyciski 2 podłączone pod wyjścia analogowe 2 pod cyfrowe do tego wyświetlacz LCD 2x16 ze standardowym sterownikiem do tego przekaźnik sterowany tranzystorem stanem wysokim  4 przyciskami zwiększa sie 2 zmienne a i b które sa odzwierciedleniem czasu w sekundach  zmienna a jest czasem pracy a b czasem przerwy . Mam jednak kłopot z oprogramowaniem w funkcji delay wszystko chodzi jednak ona odpada ze względu na długi czas oczekiwania (cała pętla loop musi przejść aby zwiększyć wartość na zmiennych a i b ) z funkcja millis mam problem taki ze przy większej ilości sekund np 50 w zmiennej b czas jest nie adekwatny do wartości co mnie trochę zdziwiło ale mało dokładne . Znajomy polecił mi zrobić to na jakimś liczniku twierdząc ze to najlepszy pomysł niestety jeszcze z nimi sie nie bawiłem na tyle żeby mi to wyszło tak jak należny dlatego proszę o pomoc  oto kod programu . Po nizej całego kodu dodam fragment który jest problematyczny  PROSZE O POMOC SZANOWNYCH KOLEGÓW FORUMOWICZÓW

Dodam ze pierwotna wersja programu z prawidłową funkcja millis została zformatowana i zapisana dlatego dodałem fragment który posiadam

#include <LiquidCrystal.h>

const int rs = 6, en = 7, d4 = 8, d5 = 9, d6 = 10, d7 = 11;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

float h = 1000 ; // szas wyswietlania nazwy sterownika
int C=0;            // zmienne potrzebne przy wejsciu analogowym
int D=0;  // -||-

unsigned long  aktualnyczas = 0;
unsigned long  zapamietany = 0;

volatile int a=3;
volatile int b=1;

void wyswietl(){
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("czas pracy:");
  lcd.setCursor(13, 0);
  lcd.print(a);
  lcd.setCursor(15, 0);
  lcd.print("s");
  lcd.setCursor(0, 1);
  lcd.print("czas przer:");
  lcd.setCursor(13, 1);
  lcd.print(b);
  lcd.setCursor(15, 1);
  lcd.print("s");
     Serial.print(C);
     Serial.print(D);
}

void setup() {
  Serial.begin(9600);
  lcd.begin(16, 2);
  lcd.clear();
  pinMode(2, OUTPUT); //diada wylaczenia czerwona
  pinMode(3, OUTPUT ); //dioda  wlaczenia zielona
  pinMode(5, OUTPUT);  // przekaznik wyjscie
  pinMode(4, INPUT);    // przycisk  digital
  pinMode(A0 , INPUT_PULLUP);   //pin analogowy 2 przyciski
  pinMode(A1 , INPUT_PULLUP);   //pin analogowy 1 przyciski
  pinMode(12,INPUT);      // przycisk  digital
  digitalWrite(2, LOW);
  digitalWrite(3, LOW);
  digitalWrite(4, HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(5,LOW);
 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Sytem sterowania");
  lcd.setCursor(5, 1);
  lcd.print("Pompy");  
  lcd.clear();
  delay(h);
   
}
void loop()
{  
  aktualnyczas=millis();
      int wl=a*1000;
      int wy=b*1000;
      
  if(aktualnyczas - zapamietany >= wl ){
  zapamietany = aktualnyczas;
           digitalWrite(2, LOW);    // stan niski na diodzie czerwone j
            digitalWrite(5, HIGH);   //wlączamy przekaznik
            digitalWrite(3, HIGH); //zapalamy diode zielona}
                 }
                
 if(aktualnyczas - zapamietany >= wy )
  zapamietany = aktualnyczas;{
        digitalWrite(5, LOW);  //wyłanczamy przekaznik
       digitalWrite(3, LOW);   //gasimy zielona
       digitalWrite(2, HIGH);  // zapalamy czerwona diode
         }
         
      if ( digitalRead(4) == LOW)
     {   a= a+1;
                           delay(100);
                           }
   
        if ( digitalRead(12) == LOW)
     {  a= a-1;
            if( a< 0 || a > 7000 )
                  a=0;
                              delay(100);
     }
               
                        C = analogRead(A1);
                        D = analogRead(A0);
     if (D >= 0 && D <= 50 ){
                            b= b-1;
                              if(b <0|| b> 7000 )
                              b =0;
                            delay(100);
                            }
     if ( C>= 0 && C <= 50 ){
                            b= b+1;
                            delay(100);
                            
     }
         wyswietl();
 }

------------------------------------------------------------------------------------------------------------------------------------------

  if(aktualnyczas - zapamietany >= wl ){
  zapamietany = aktualnyczas;
           digitalWrite(2, LOW);    // stan niski na diodzie czerwone j
            digitalWrite(5, HIGH);   //wlączamy przekaznik
            digitalWrite(3, HIGH); //zapalamy diode zielona}
                 }
                
 if(aktualnyczas - zapamietany >= wy )
  zapamietany = aktualnyczas;{
        digitalWrite(5, LOW);  //wyłanczamy przekaznik
       digitalWrite(3, LOW);   //gasimy zielona
       digitalWrite(2, HIGH);  // zapalamy czerwona diode
         }

 

Edytowano przez Sabre
Link do komentarza
Share on other sites

Kody programów należy umieszczać za pomocą odpowiedniego narzędzia dostępnego w edytorze (przycisk "Wstaw kod"). Programy są wtedy prezentowane w czytelny sposób, a ich składania jest kolorowana. Tym razem poprawiłem to za Ciebie, ale pamiętaj o tej opcji w przyszłości. Z góry dziękuję za zrozumienie i pomoc w utrzymaniu porządku na forum 😉

  • Lubię! 2
Link do komentarza
Share on other sites

@ciemo12 obawiam się, że brak tu żadnej odpowiedzi, bo Twój program jest kompletnie nieczytelny dla osób postronnych. Złe formatowanie i brak komentarzy nie ułatwia tematu. Z tego samego powodu sam narobiłeś błędy w programie. Porównaj te 2 fragmenty z Twojego kodu:

if(aktualnyczas - zapamietany >= wl ){
  zapamietany = aktualnyczas;
if(aktualnyczas - zapamietany >= wy )
  zapamietany = aktualnyczas;{

Widzisz ten błąd w drugim przypadku? 😉

PS wciśnij w Arduino IDE kombinację klawiszy CTRL+T lub wybierz opcję Narzędzia > Automatyczne formatowanie, a Twój program będzie od razu znacznie czytelniejszy.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.