Skocz do zawartości

Arduino – program do obsługi laboratorium chemicznego


Pomocna odpowiedź

Napisano (edytowany)

Witam,

Programuję aparaturę do laboratorium chemicznego, która ma za zadanie wymieniać roztwory. Układ jest oparty na 8 zaworach elektromagnetycznych i dwóch pompach oraz czujniku poziomu cieczy. całość wyposażona jest w wyświetlacz LCD oraz klawiaturę 4x4. Większość układu zaprogramowałem osobiście ale jest mały problem.

Na chwilę obecną muszę każdy roztwór włączać osobnym przyciskiem z klawiatury, co jest kłopotliwe bo co jakieś 5 h muszę iść do labu i na urządzeniu wybrac od 1 do 8. A chciałbym by na przykłąd po wcisnięciu jednego przycisku z klawiatury cały kod wykonał się automatycznie roztwór po rotworze. Poniżej załączam fragment kodu który aktualnie działa.

 


  while (klawisz=='1')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   1");
  lcd.setCursor(0,1);
  

      if  (digitalRead(3)==0)  // wartość z czujnika poziomu cieczy // wartość 1 albo 0
          {
          digitalWrite(Z1, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z1, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
          }
      
}


while (klawisz=='2')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   2");
  lcd.setCursor(0,1);
  
  
      if  (digitalRead(3)==0)
          {
          digitalWrite(Z2, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z2, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
          }
      
}


while (klawisz=='3')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   3");
  lcd.setCursor(0,1);

      if  (digitalRead(3)==0)
          {
          digitalWrite(Z3, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z3, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
          }
      
}


while (klawisz=='4')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   4");
  lcd.setCursor(0,1);


      if  (digitalRead(3)==0)
          {
          digitalWrite(Z4, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z4, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
          }
      
}


while (klawisz=='5')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   5");
  lcd.setCursor(0,1);

      if  (digitalRead(3)==0)
          {
          digitalWrite(Z5, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z5, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
          }
      
}


while (klawisz=='6')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   6");
  lcd.setCursor(0,1);


      if  (digitalRead(3)==0)
          {
          digitalWrite(Z6, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z6, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
          }
      
}


while (klawisz=='7')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   7");
  lcd.setCursor(0,1);

      if  (digitalRead(3)==0)
          {
          digitalWrite(Z7, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z7, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
          }
      
}


while (klawisz=='8')
{
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   8");
  lcd.setCursor(0,1);
  lcd.print("CHOOSE A METHOD");

      if  (digitalRead(3)==0)
          {
          digitalWrite(Z8, LOW);
          digitalWrite(P1, LOW);
          }
        
      else 
          { 
          digitalWrite(Z8, HIGH);
          digitalWrite(P1, HIGH);
          
          delay(T1);
          digitalWrite(P2, LOW);
          delay(55000);            
          digitalWrite(P2, HIGH);
 
         }
      
}

 

Dziękuję, za pomoc.

Edytowano przez Gieneq
(edytowany)

@chemik110493 witam na forum!

Czyli ma to być coś jak sekwencja wciśnięcia przycisków. A gdybyś tak umieścił to co załączyłeś (przy okazji zachęcam do używania narzędzia wstawiania kodu) w funkcji, gdzie jako argument podajesz numer (char) przycisku i po prostu podał sekwencję klawisz po klawiszu przechowywaną w tablicy. 

Edytowano przez Gieneq
(edytowany)

Chciałbym by to działało w nastepujący sposób:

 

Wciskam klawisz np. klawisz C, następnie za pomocą pętli while leci cała ta sekwencja zawierająca 8 etapów jedna po drugiej. Przy czym testowałem sporo metod i pętli i nie działa, nawet takie coś na for gdzie numeracja idzie po numerach pinów. teraz testowałem coś takiego że robie funkcję dla każdego etapu i np. na pętli for czy if czy case puszczam każda sekwencję ale to tez nie działa. Niby proste zagadnienie ale coś opornie mi to idze.

Ja też jestem samoukiem wiec, może tez coś ze składnią jest nie tak sam juz nie wiem. Wiem że ten kod powyżej się wykonuję idealnie. A jak chce to przerobić na automatyczny tryb to już lipa..

Dziękuję za szybki komentarz.

Edytowano przez chemik110493

Dobrze teraz lepiej rozumiem. Ale moje wątpliwości budzi pętla while, bo to jest takie podtrzymanie stanu.

Czyli klikam przycisk '1', ta informacja zapisuje się do jakiejś zmiennej klawisz, puszczam przycisk i klawisz dalej ma wartość '1'. To jest istotne tu prosze mnie poprawić jeżeli myślę źle.

Odpala się to co jest w pierwszym bloku, wypisuje się tekst, sprawdzany jest czujnik, jak jest 0 to cośtam się ustawia, jak 1 to coś innego się ustawia ale odpala się czekanie 55000 ms czuli 55 sekund. Mija czas, klawisz dalej ma '1' i znowu ta sama procedura.

I teraz to sobie kręci się przez 5 godzin tak? I chodzi o to żeby ten while dla '1' pokręcił się 5 godzin, potem while dla '2' pokręcił się 5 godzin itd... ?

Jeżeli tak miałoby być to można zastosować funkcję milis. Zwraca ona wartość milisekund od startu i np. Przed wejściem do pętli while zapisuje aktualny czas, a wewnątrz z jakimś interwałem sprawdzam czy czas ten już minął. Jeżeli minął to zeruję tą zmienną i do zmiennej klawisz dopisuje coś innego.

Nie będzie to metoda na najładniejszy kod, ale pozwoli ulepszyć to co jest teraz.

void proceduraA() {
 long lastMilis = millis();
 char klawisz = '1';
  
  while(klawisz == '1') {
  lcd.init();                      // initialize the lcd 
  lcd.init();
  lcd.backlight();
  lcd.setCursor(2,0);
  lcd.print("Solution   1");
  lcd.setCursor(0,1);

  if  (digitalRead(3)==0)  // wartość z czujnika poziomu cieczy // wartość 1 albo 0
  {
    digitalWrite(Z1, LOW);
    digitalWrite(P1, LOW);
  }

  else 
  { 
    digitalWrite(Z1, HIGH);
    digitalWrite(P1, HIGH);

    delay(T1);
    digitalWrite(P2, LOW);
    delay(55000);            
    digitalWrite(P2, HIGH);
  }
     if(millis() - lastMillis > 1000*60*5){
     	lastMillis = millis();
       	klawisz = '2'; // przejdz do etapu 2.
     }
}
  
}

Tak napisany kod nie będzie ładny, bo da się to zrobić o wiele lepiej ale zadziała. Jeżeli miały być łatwy, to każdy z etapów wydzieliłbym do osobnej funkcji i zrobił funkcję gdzie wkładam tablicę następujących po sobie etapów, np:

char [] tab = {'1', '2', '4', '2'};
long [] intervalsMs = {500000, 333333, 123123213, 455555};

I przekazując takie coś do funkcji miałbym możliwość tworzyć różne kombinacje etapów o zadanych czasach.

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