Skocz do zawartości

Ardruino NANO ustawienie dodatkowych przekaźników.


Pomocna odpowiedź

Witam jestem poczytujący w ardruino czy można dopisać do tego kodu załączanie na ustalony czas ustawiany na lcd żeby przekaźniki włączały się po koli .
Pirewszy np:2 sek wyłącza i przechodzi do kolejnego przekaźnika znowu na 2 sek.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>  // biblioteka do LCD
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // piny od LCD
int przekaznik1_start = 6;     // wyjscia na przekaznik pin 6
int przekaznik2_start = 7;     // wyjscie na przekaznik pin 7
#define wywolanie_cyklu 5
#define pinUP 3      // klawisz +   pin 12
#define pinDOWN 2   // klawisz -   pin 11
#define pinOK 0       // klawisz OK  pin 10
long start;            // zmienna okreslająca start procesu         
int czas;              // czas trwania procesu, w sekundach
int minuty;            // bez komentarza
int sekundy;           // bez komentarza

// --- uniwersalna funkcja pokazująca aktualny czas procesu, czas jaki upłynął, itp.  ---
void pokazCzas(int c) // c - aktualny czas procesu
{
  char buf[20]; memset(buf,0,sizeof(buf)); // zamiast pozycjonowania LCD proponuję to właśnie
  minuty=c/60;sekundy=c%60;                // obliczamy mniuty i sekundy
  if(minuty>59){minuty=0;sekundy=0;}       // po przekroczeniu 60 minut liczymy od nowa
  snprintf(buf,sizeof(buf),"%02d:%02d",minuty,sekundy); // sprytna funkcja (radzę poczytać o niej :-)
  lcd.setCursor(6,1);lcd.print(buf); // kosmetyka LCD
}


// --- funkcja do odliczania czasu ---
 void odliczanie(int ile)
 {
 start=millis();                     // startujemy funkcją millis()
  int akt_czas=ile;                   // zmienna pomocnicza do żonglerki czasem
  while(akt_czas>0)                   // tak długo, aż odliczanie się nie skończy
    { akt_czas=czas-(millis()-start)/1000; // żonglerka czasem
    pokazCzas(akt_czas);                 // pokaz czasu jaki pozostał
    if(digitalRead(pinOK)==LOW)          // jeśli wciśniesz OK to natychmiastowe przerwanie procesu
      {akt_czas=0;pokazCzas(akt_czas);    //zerowanie czasu
      lcd.clear(); lcd.setCursor(0,1);lcd.print("Proces Przerwany");delay(2000);  // kosmetyka
    }
    }
 }
   
    // --- funkcja do ustawiania czasu trwania procesu -----------------
 int ustaw(int c) // c- defaultowy czas(do ustawienia)
 {
  lcd.clear();
  lcd.setCursor(0,0);lcd.print("<  Ustaw Czas  >");
  pokazCzas(c);                     // pokazujemy czas procesu do ustawienia
  while(digitalRead(pinOK)!=LOW)  // trwa tak długo aż naciśniemy przycisk OK
    {
    if(digitalRead(pinUP)==LOW){delay(30);if(digitalRead(pinUP)==LOW){c+=1;if(c>1800)c=1800;pokazCzas(c);}}     // klawisz +
    if(digitalRead(pinDOWN)==LOW){delay(30);if(digitalRead(pinDOWN)==LOW){c-=1;if(c<0)c=0;pokazCzas(c);}} // klawisz -
    delay(150);                      // aby za szybko nie przeskakiwał czas gdy wciśniemy przycisk na dłużej
    }
  lcd.clear();lcd.setCursor(0,0);lcd.print(" Czas Ustawiony ");delay(2000); // kosmetyka
   return c;  // funkcja zwraca ustawiony czas
}

     
 
 

// --------------------------------------------------------------
void setup () {
  pinMode(pinUP,INPUT_PULLUP);    // klawisz +
  pinMode(pinDOWN,INPUT_PULLUP);  // klawisz -
  pinMode(pinOK,INPUT_PULLUP);    // klawisz OK
  pinMode(wywolanie_cyklu,INPUT_PULLUP);
  pinMode(przekaznik1_start,OUTPUT);       
  pinMode(przekaznik2_start,OUTPUT);                   
  lcd.begin(16,2);                // wyświetlacz 16x2
  digitalWrite(przekaznik1_start, HIGH);          // załączenie przekaznika 1
  digitalWrite(przekaznik2_start, LOW);       // załączenie przekaznika 2
  czas=ustaw(10);
}

// -----------------------------------------------------------
void loop ()
{
   
 //czas=ustaw(5);                      // ustawiamy czas (domyślnie)
  lcd.clear();
  lcd.print("Czas cyklu");             // kosmetyka
  digitalWrite(przekaznik1_start,LOW);
  digitalWrite(przekaznik2_start,HIGH); // przekaznik1 ON  //przekaznik2 OFF             
   odliczanie(czas);                         // start odliczania
  digitalWrite(przekaznik1_start,HIGH);
 digitalWrite(przekaznik2_start,LOW); // przekaznik1 ON // przekaznik2 OFF
  lcd.clear();
  lcd.print("  Koniec Cyklu");
  delay(3000);
  while(digitalRead(wywolanie_cyklu)!=LOW);
}

 

Link do komentarza
Share on other sites

@grzegorz witam na forum 🙂

Oczywiście, że można - na tym dokładnie polega urok Arduino, da się zrobić praktycznie wszystko. Na czym dokładnie utknąłeś? Jakie masz konkretnie pytanie?

Link do komentarza
Share on other sites

(edytowany)

Ustawienia czasu działają tylko na jeden przekaźnik niewiem jak dodać drugi żeby działał i trzeci. Żeby działał jeden po drugim z tymi samymi ustawieniami czasu. 

Edytowano przez grzegorz
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.