Skocz do zawartości
ciemo12

Prosty przełacznik czasowy

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

Udostępnij ten post


Link to post
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

Udostępnij ten post


Link to post
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.

Udostępnij ten post


Link to post
Share on other sites

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

 

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!

Gość
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...