Arduino Polska Forum

Pełna wersja: Prośba o pomoc w napisaniu programu
Aktualnie przeglądasz uproszczoną wersję forum. Kliknij tutaj, by zobaczyć wersję z pełnym formatowaniem.
Stron: 1 2 3 4
<!-- @page { size: 21cm 29.7cm; margin: 2cm } P { margin-bottom: 0.21cm } -->
Witam.
Chciałbym zrobić automatyczną podmianę wody sterowaną przez Arduino Nano.
Plan jest taki ;pojemnik 20 L,2x czujnik poziomu,2x pompa,2 x elektrozawór.W pojemniku zamontowane są 2 pompki oraz 2 czujniki poziomu min i poziom max .Działanie programu:
1.Start
2.Otwiera się elektrozawór E1 wody brudnej.
3.Zawór ma się otworzyć na 1min potem ma się zamknąć.
4.Napełniony zbiornik przy pomocy czujnika Poz.Max uruchamia pomkę P1 która opróznia zbiornik do poziomu min
5.Czujnik Poz Min wyłącza pompke P1 i tym samym załącza elektrozawór wody czystej E2
6.Uruchomiony elektrozawór E2 wpuszcza wode do zbiornika w okreslonym czasie albo do momentu kiedy czujnik poziomu Max go wyłączy i tym samym załączy pompke P2 która oprózni wode ze zbiornika do poziomu czujnika Min który wyłączy pompkę .
7 Koniec programu.
Pomysł był taki aby Arduino wykonało 2 etapy
1.wpuścić wodę brudną i odpompować
2.napełnić pojemnik wodą czystą a następnie ją odpompować .
Program ,który próbuje zlepić ,wykonuje się tak do pkt.5 opisu no i zaczynaja się schody jak to dalej pisać .
Czy możliwe jest aby 2 pompy były obsłużone przez tylko 2 czujniki poziomu?
Czy każda z pomp musi mieć swój oddzielny czujnik poz min/max czyli łącznie 4 szt?Nie mogę sobie właśnie z tym poradzić aby czujniki w etapie pierwszym (woda brudna ) nie sterowały w tym samym czasie pompą i elektrozaworem w etapie drugim (woda czysta) bo póki co tak właśnie jest .
Pomoże ktoś?
Kod:
[code]
int czujMin;              // czujnik min
int czujMax;              //czujnik max
bool E1;                //elektrozawór wody brudnej
bool E2;                //elektrozawór wody czystej



void setup()
{
  pinMode(8,OUTPUT);         //wyj.na elektrozawór E2
  pinMode(6,INPUT_PULLUP);   //przycisk START programu
  pinMode(7,OUTPUT);         //wyj.na elektrozawór E1
  pinMode(4,OUTPUT);         // wyj. na pompe wody brudnej
  pinMode(3,INPUT_PULLUP);    // czujnik poziomu max
  pinMode(5,INPUT);           //czujnik poziomu min
  digitalWrite(7,LOW);
  digitalWrite(8,LOW);
  E1=false;
  E2= false;
}

void loop(){
  if(digitalRead(6)==LOW)
  {digitalWrite(7,HIGH);
  delay(10000);}
  else{digitalWrite(7,LOW);}
  //delay(10000);}
  czujMax = digitalRead(3);
  czujMin = digitalRead(5);
  if(!czujMax==HIGH){E1 = true;}
  if(czujMin==HIGH){
    E1 = false;
  }
  if(E1){
    digitalWrite(4,HIGH);}
    else{digitalWrite(4,LOW);}
    if(czujMin==LOW && !czujMax==HIGH) {E2=true;}
    if(E2){
      digitalWrite(8,HIGH);}
     
      else{digitalWrite(8,LOW);}
    }
   
[/code]
Podzielenie na etapy to fajny pomysł, ale do realizacji brakuje chyba umiejętności.
Trzeba więcej pomigać ledami Big Grin i nabrać doświadczenia. Naucz się używać millis, program ma wykonywać się od początku loop do końca i z powrotem mln x/sekundę, od czasu o czasu ma wejść w obsługę funkcji "obslugaWody()", np. co 10ms, sprawdzić na jakim etapie jest ta funkcja (zapamiętać "rozdział" w zmiennej static, przejść do aktualnego dzięki switch case, zrealizować co ma tutaj do zrobienia i wrócić do loop, za 10ms znowu.
Możesz sobie zrobić enum takich rozdziałów, etapów, ale to nie znaczy, że program ma w to wejść i siedzieć pilnować pompy przez 100s, on ma tu zajrzeć i sprawdzić co 10ms czy już. Może w tym czasie zaczęło zalewać pokój i warto zerknąć na inne czujniki, bo zbiornik pękł i będziesz zalewać sąsiada czekając na napełnienie zbiornika, może wysłać nawet komunikat do innego uprzędzenia by na wszelki wypadek zamknął zawór główny w domu, do pralki, że ma pause do reakcji użytkownika.
Podziel sobie taką pracę na więcej takich etapów, pierwszy to zapewne będzie jakiś standby, czyli czekanie na początek akcji, potem wystarczy zmienną sterującą zrobić etap++ i reazlizować kolejny rozdział, czyli prze 1 start będzie jeszcze jakieś 0 i już jest jak w informatyce.
https://www.youtube.com/watch?v=v8KXa5uRavg zobacz ten film, jak niby prosta banalna czynność powinna być podzielona by była zrobiona w pewny sposób i bez blokowania działania całego uC.
Doświadczenia to brakuje na pewno  Smile .Od pon to magluje
Rozumiem ,że z tymi wypocinami nie ma sensu brnąć dalej ...
Prosze to  pokąż mi chociaż prosty  kod który zapali diodę np na 30 sek a potem ją zgasi
(27-10-2023, 16:36)gintur napisał(a): [ -> ]Doświadczenia to brakuje na pewno  Smile .Od pon to magluje
Rozumiem ,że z tymi wypocinami nie ma sensu brnąć dalej ...
Prosze to  pokąż mi chociaż prosty  kod który zapali diodę np na 30 sek a potem ją zgasi
Kod:
unsigned long LED_timestore;  
int LedPin = 13;
// LedStatus =Status diody
// LED_timestore = czas swiecenia

void setup() {
  pinMode(LedPin, OUTPUT);
}

void loop() {
  if (LedStatus == LOW) {
    if (millis() - LED_timestore > 1000 ) {
      digitalWrite(LedPin, HIGH);
      LED_timestore = millis();
      LedStatus = HIGH;
    }
  } else {
    if (millis() - LED_timestore > 300) {
      digitalWrite(LedPin, LOW);
      LedStatus = LOW;
    }
  }
}
masz swoje swiecidelko
Sorry nie mam PL Klawiatury  Undecided
Sam sobie napiszesz, na początek loop wstaw delay(1), utwórz zmienną static uint32_t licznik=0; w kolejnej linii licznik++,
jak licznik podzielisz przez 3000 i nie będzie reszty (modulo, symbol %) , if ==0, to sobie zmieniasz stan led.
To dla 3s, szkoda czekać 30 przy takiej zabawie.
Albo jak wciśniesz przycisk to zapisz sobie w innej zmiennej ile miał licznik przy wciśnięciu przycisku, zaświecasz led, i jak zliczy więcej od zapisanej wartości o 30000 to sobie wyłączasz led.
To zatrzymuje program na 1ms, a stąd można zrobić śmiało krok dalej.
Jak zrozumiesz jak to działa to wywalasz delay i zamiast zliczać zatrzymania programu na 1ms to korzystasz z licznika ms które upłynęły od uruchomienia programu. Takie zatrzymanie msekundy sprawdziłoby się zresztą bez problemu, każda linia kodu prostych funkcji wykonuje się do kilku us, musiałbyś napisać program na setki funkcji by to zaczęło się mocniej rozjeżdżać z rzeczywistością. Wtedy wchodzi millis który liczy to samo w tle bez większych zakłóceń od tego co napisałeś w kodzie.
Przykład z miganiem led masz w Arduino, blinkWithoutDelay, wystarczy w tym przykładzie zmienić wartość 1000 na inną, ale nie chodzi o to by ją zwiększać, tylko że możesz migać nawet co 10ms, a w między czasie inną co 68, a jedno nie będzie kolidować z drugim.
(27-10-2023, 17:35)kaczakat napisał(a): [ -> ]Sam sobie napiszesz, na początek loop wstaw delay(1), utwórz zmienną static uint32_t licznik=0; w kolejnej linii licznik++,
jak licznik podzielisz przez 3000 i nie będzie reszty (modulo, symbol %) , if ==0, to sobie zmieniasz stan led.
To dla 3s, szkoda czekać 30 przy takiej zabawie.
Albo jak wciśniesz przycisk to zapisz sobie w innej zmiennej ile miał licznik przy wciśnięciu przycisku, zaświecasz led, i jak zliczy więcej od zapisanej wartości o 30000 to sobie wyłączasz led.
To zatrzymuje program na 1ms, a stąd można zrobić śmiało krok dalej.
Jak zrozumiesz jak to działa to wywalasz delay  i zamiast zliczać zatrzymania programu na 1ms to korzystasz z licznika ms które upłynęły od uruchomienia programu. Takie zatrzymanie msekundy sprawdziłoby się zresztą bez problemu, każda linia kodu prostych funkcji wykonuje się do kilku us, musiałbyś napisać program na setki funkcji by to zaczęło się mocniej rozjeżdżać z rzeczywistością. Wtedy wchodzi millis który liczy to samo w tle bez większych zakłóceń od tego co napisałeś w kodzie.
Przykład z miganiem led masz w Arduino, blinkWithoutDelay, wystarczy w tym przykładzie zmienić wartość 1000 na inną, ale nie chodzi o to by ją zwiększać, tylko że możesz migać nawet co 10ms, a  w między czasie inną co 68, a jedno nie będzie kolidować z drugim.
Modulo z Arduino? to juz prawie ze sadyzm Wink
Kod do zapalenia LED na 30 sek i jej zgaszenie  to miało byc dla mnie takie odniesienie za za pomocaą przycisku otwieram elektrozawór nawet na 1min a potem sie zamyka.Miał to być taki START programu. Smile
(27-10-2023, 18:22)gintur napisał(a): [ -> ]Kod do zapalenia LED na 30 sek i jej zgaszenie  to miało byc dla mnie takie odniesienie za za pomocaą przycisku otwieram elektrozawór nawet na 1min a potem sie zamyka.Miał to być taki START programu. Smile
Chciales jak to sie robi to tobie napisalem reszt musisz sam zrobic Wink
Albo idz na niemieskie Forum albo angielskie moze ktos cos spoci
https://forum.arduino.cc/t/halloween-pro...1178798/40
(27-10-2023, 18:22)gintur napisał(a): [ -> ]Kod do zapalenia LED na 30 sek i jej zgaszenie  to miało byc dla mnie takie odniesienie za za pomocaą przycisku otwieram elektrozawór nawet na 1min a potem sie zamyka.Miał to być taki START programu. Smile
Pare pytan
Jak chcesz te zaory i pumpe podlaczyc narysuj schemat, moze byc na kartce papieru-
Wiesch ze Arduino i kazdy inny system nie zdola besposrednio strowac tego
Tak wiem wszystkie elementy beda sterowane poprzez moduły przekaznikowe .
Stron: 1 2 3 4