Skocz do zawartości

Prosty przełacznik czasowy


Pomocna odpowiedź

Napisano (edytowany)

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

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

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

Temat do zamknięcia udało mi się rozwiązać problem funkcja resetującą czas od startu programu .

Niestety zrobiłem kilka głupich błędów przez co rozwiązanie było ale nie działało prawidłowo

 

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...