Skocz do zawartości

Problem z trybem automatycznej regulacji temperatury w arduino


Radzio_

Pomocna odpowiedź

Witam! Robię projekt postawiony na arduino mega, które ma działać jako sterownik wędzarni. Od razu mówię, że nie jestem specem w programowaniu(jestem z zawodu elektrykiem) i się uczyłem jednocześnie robiąc ten projekcik. Jednakże pojawiły się problemy po modyfikacji, zamiast fotorezystora z modułem wstawiłem analogowy czujnik natężenia światła jako czujnik ognia w układzie gazowym(dla zainteresowanych mogę wrzucić zdjęcia jak to wygląda) I zamiast czujnika płomienia(czujka IR) wstawiłem termoparę z modułem MAX6675. Odczyty są i cały tryb manualny nawet działa, pojawił się problem z modułem trybu automatycznego, Czujnik temperatury dymu DS18B20 powinien regulować zależnie od temperatury zadanej obroty wentylatora(regulacja odbywa się za pomocą modułu IRF520, a w trybie automatycznym wstawiłem potencjometr cyfrowyX9C103S który wraca sygnał do arduino jak zwykły potencjometr by regulować obrotami przez owe IRF520, dość prymitywne), a sama termopara po uzyskaniu ustawionej temperatury powinna wyłączyć świecę żarową. I tu jest problem... Nie działa, trochę się już poddaje bo nie wiem gdzie skopałem kod. Miałem plan przerobić to coś w stylu regulatora PID ale jestem dość zielony w tym temacie. Sam kod jest mocno rozbudowany ale jak na niezbyt zaawansowanego wydaje mi się, że dość dobrze napisany. Ma instrukcję obsługi, wykaz kodów błędów, działający tryb manualny i parametry w czasie rzeczywistym + możliwość zmiany trybów, blokadę nastaw i instalacji gazowej w przypadku cofnięcia się ognia, a sama interakcja odbywa się przez klawiaturę 4x4, która umożliwia również wykonywanie nastaw, co przy wędzeniu różnych rzeczy jest niezbędne. Jeśli ktoś byłby w stanie pomóc i wyjaśnić co jest nie tak (przerobić kod na regulację PID, byłbym wdzięczny, wiadomo nic za darmo) ^^ Poniżej kod: 

#include <DigiPotX9Cxxx.h>
#include <Keypad.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h> 
#include <DallasTemperature.h>
#include <OneWire.h>
#include <GyverMAX6675.h>
#define PWM 2
#define ONE_WIRE_BUS 4
#define moc A3
#define CLK_PIN   7  
#define DATA_PIN  5  
#define CS_PIN    6
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
GyverMAX6675<CLK_PIN, DATA_PIN, CS_PIN> sens;
int went;
int out;
DigiPot pot(35,36,37);
unsigned long aktualnyczas = 0;
unsigned long zapamietanyczasczujniki = 0;
unsigned long zapamietanyczaswentylator = 0;
int alarm_gaz = 42;
int blokada_gaz = 41;
int led_gaz = 40;
int blokada = 38;
int zadana_temp = 50;
int alarm = 3;
int przekaznik1 = 31;
int przekaznik2 = 32;
int przekaznik3 = 33;
int przekaznik4 = 34;
int gaz = A1;
int ad_value;
int odczytanaWartosc = 0;//Odczytana wartość z ADC
int Termistor = A1; //przypisanie pinu odczytywania napiecia z termistora
int Vo; //odczyt napiecia dla termistora      
int manualmotor = A2;   // wejscie dla potencjometru
int automotor = A0;
int val = 0;
float R1 = 10000; //Rezystor staly 10kiloomow
float logR2, R2, T, Tc, Tf; //deklaracja danych wejsciowych i wyjsciowych
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;
int napiecie = 0;//Wartość przeliczona na napięcie w V
const byte ROWS = 4; // ile wierszy
const byte COLS = 4; //ile kolumn
byte gaz_alarm = 0;
byte blokada_nastaw = 0;
byte alarmH = 0;
int temp_szczyt =500;
byte temp_dym =200;
byte tryb_nastaw =0;
byte manual = 0;
byte manual1 = 0;
byte automat = 0;
byte automat1 = 0;
byte praca = 0;
byte instrukcja = 0;
byte wentylator = 0;
byte wyjscie = 0;
byte menu =0;
byte rowPins[ROWS] = {22, 23, 24, 25}; //piny wierszy
byte colPins[COLS] = {26, 27, 28, 29}; //piny kolum
byte stopnie[8] = {                //konfigurajca znaku stopnie
   B01100,
   B10010,
   B10010,
   B01100,
   B00000,
   B00000,
   B00000,
   B00000
};
byte swiecazal[8] ={
   B00000,
   B01001,
   B10010,
   B01001,
   B10010,
   B01001,
   B10010,
   B11111
};
byte blokadao[8] ={
  B01110,
  B10000,
  B10000,
  B11111,
  B11011,
  B11011,
  B11111,
  B00000
};
byte blokadaz[8] ={
  B01110,
  B10001,
  B10001,
  B11111,
  B11011,
  B11011,
  B11111,
  B00000
};
char keys[ROWS][COLS] = { //mapowanie klawiatury
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};

LiquidCrystal_I2C lcd(0x27, 20, 4); // I2C address 0x27, 20 column and 4 rows
Keypad klawiatura = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); //inicjalizacja klawiatury

void setup() {
  Serial.begin(9600);
  lcd.init(); 
  lcd.backlight();
  lcd.clear();

  lcd.setCursor(0, 0);            
  lcd.print("STEROWNIK WEDZARNI");         
  lcd.setCursor(0, 1);            
  lcd.print("kliknij:"); 
  lcd.setCursor(0, 2);           
  lcd.print("praca 0");          
  lcd.setCursor(0, 3);           
  lcd.print("instrukcja 8"); 
  lcd.createChar(0, stopnie); 
  lcd.createChar(1, swiecazal);
  lcd.createChar(2, blokadao);
  lcd.createChar(3, blokadaz);
  pinMode(gaz, INPUT); 
  pinMode(przekaznik1, OUTPUT);       //przekaznik1 jako wyjście
  pinMode(przekaznik2, OUTPUT);       //przekaznik2 jako wyjście
  pinMode(przekaznik3, OUTPUT);       //przekaznik3 jako wyjście
  pinMode(przekaznik4, OUTPUT);       //przekaznik4 jako wyjście
  pinMode(alarm_gaz, OUTPUT); 
  pinMode(alarm, OUTPUT);
  pinMode(PWM, OUTPUT);
  pinMode(led_gaz, OUTPUT);
  pinMode(blokada, INPUT_PULLUP);
  pinMode(blokada_gaz, INPUT_PULLUP);
  digitalWrite(przekaznik1, HIGH);
  digitalWrite(przekaznik2, HIGH);
  digitalWrite(przekaznik3, HIGH);
  digitalWrite(przekaznik4, HIGH);
  analogWrite(alarm, LOW);
  digitalWrite(alarm_gaz, LOW);
  
   
}
void loop() {
char klawisz = klawiatura.getKey();
    
    if (klawisz == '8'){
      lcd.clear();
      delay(200);
      instrukcja +=1;
      menu +=1;
    }
    if (klawisz == '9'){
      lcd.clear();
      delay(200);
      instrukcja -=1;
      menu -=1;
    }
    if (klawisz == '0'){
      delay(100);
      lcd.clear();
      menu =1;
      praca =1;
      instrukcja =0;
    }
    if (menu == 0){
  lcd.setCursor(0, 0);            
  lcd.print("STEROWNIK WEDZARNI");         
  lcd.setCursor(0, 1);            
  lcd.print("kliknij:"); 
  lcd.setCursor(0, 2);           
  lcd.print("praca 0");          
  lcd.setCursor(0, 3);           
  lcd.print("instrukcja 8");  
    }
    if (instrukcja == 1){
      lcd.setCursor(0, 0);
      lcd.print("wentylator:");
      lcd.setCursor(0, 1);
      lcd.print("zalaczamy 1");
      lcd.setCursor(0, 2);
      lcd.print("wylaczamy 2");
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wyjscie 9");
    }
    if (instrukcja == 2){
      lcd.setCursor(0, 0);
      lcd.print("swieca zarowa:");
      lcd.setCursor(0, 1);
      lcd.print("zalaczamy 3");
      lcd.setCursor(0, 2);
      lcd.print("wylaczamy 6");
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wstecz 9");
    }
    if (instrukcja == 3){
      lcd.setCursor(0, 0);
      lcd.print("ustawianie temp:");
      lcd.setCursor(0, 1);
      lcd.print("wybor ustawienia 7");
      lcd.setCursor(0, 2);
      lcd.print("parmetr +4 -5");
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wstecz 9");
    }
    if (instrukcja == 4){
      lcd.setCursor(0, 0);
      lcd.print("opuszczanie programu:");
      lcd.setCursor(0, 1);
      lcd.print("wyjscie D");
      lcd.setCursor(0, 2);
      lcd.print("powrot C");
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wstecz 9");
    }
    if (instrukcja == 5){
      lcd.setCursor(0, 0);
      lcd.print("opis symboli:");
      lcd.setCursor(0, 1);
      lcd.print("swieca zarowa: ");
      lcd.print((char)1);
      lcd.setCursor(0, 2);
      lcd.print("blokada nastaw: ");
      lcd.print((char)2);
      lcd.print(" ");
      lcd.print((char)3);
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wstecz 9");
    }
    if (instrukcja == 6){
      lcd.setCursor(0, 0);
      lcd.print("opis kodow:");
      lcd.setCursor(0, 1);
      lcd.print("E1: temp awaryjna");
      lcd.setCursor(0, 2);
      lcd.print("zmniejsz obroty");
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wstecz 9");
    }
    if (instrukcja == 7){
      lcd.setCursor(0, 0);
      lcd.print("opis kodow:");
      lcd.setCursor(0, 1);
      lcd.print("E2: ogien w sys");
      lcd.setCursor(0, 2);
      lcd.print("odblokuj system");
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wstecz 9");
    }

    if (instrukcja == 8){
      lcd.setCursor(0, 0);
      lcd.print("opis kodow:");
      lcd.setCursor(0, 1);
      lcd.print("E3: bład");
      lcd.setCursor(0, 2);
      lcd.print("czujnika ognia");
      lcd.setCursor(0, 3);
      lcd.print("dalej 8 wstecz 9");
    }
    if (praca == 1){
  lcd.setCursor(0, 0);            
  lcd.print("Wybierz tryb pracy:");         
  lcd.setCursor(0, 1);            
  lcd.print("manualny: #"); 
  lcd.setCursor(0, 2);           
  lcd.print("automatyczny: *");          
  lcd.setCursor(0, 3);           
  lcd.print("wybrano:");
  
  if (klawisz == '#'){
  lcd.setCursor(9, 3);           
  lcd.print("manualny");
  analogWrite(alarm, 1200); 
  delay(2000);
  analogWrite(alarm, 0);
  lcd.clear();
  praca = 0;
  manual = 1;
  manual1 = 1;
    }
    
    if (klawisz == '*'){
  lcd.setCursor(9, 3);           
  lcd.print("automat"); 
  analogWrite(alarm, 1200);
  delay(2000);
  analogWrite(alarm, 0);
  lcd.clear();
  praca = 0; 
  automat = 1;
  automat1 = 1; 
    }   
   }
    

    if (manual == 1){
     if(klawisz == 'C'){
  lcd.clear();
  wyjscie =0;
  manual1 =1; 
 }
  if(analogRead(A1)>=50){
  lcd.clear();
  gaz_alarm = 1; 
  manual1 =0;
  lcd.setCursor(0,0);
  lcd.print("KOD: E2");
  lcd.setCursor(0,1);
  lcd.print("ogien w ukladzie gaz");
  lcd.setCursor(0,2);
  lcd.print("odblokuj ststem");
  lcd.setCursor(0,0);
  lcd.print("");
  }
  if(digitalRead(41)==LOW){
  delay(200);  
  lcd.clear();
  gaz_alarm = 0; 
  manual1 =1;
  digitalWrite(przekaznik4, HIGH); 
  digitalWrite(led_gaz, LOW); 
  }
    }
     if(manual1 ==1){ 
      automat =0;
      aktualnyczas = millis();
  lcd.setCursor(0, 0);            
  lcd.print("went:");         
  lcd.setCursor(0, 1);            
  lcd.print("temp:"); 
  lcd.setCursor(0, 2);           
  lcd.print("ogien:");
  lcd.setCursor(12,2);
  lcd.print("swieca:");           
  lcd.setCursor(0, 3);           
  lcd.print("ster:  manual");
 odczytanaWartosc = analogRead(A2);
   napiecie = odczytanaWartosc * (102.5/1024.0);
  lcd.setCursor(7, 0);
  lcd.print(napiecie);
  lcd.print("% ");
  went=analogRead(A2);
  out=map(went,0,1023,0,255);
  analogWrite(PWM,out); 
      if (aktualnyczas - zapamietanyczasczujniki >= 1000UL){
        zapamietanyczasczujniki = aktualnyczas;
  lcd.setCursor(7,1);
    sensors.requestTemperatures(); 
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print((char)0); 
  lcd.print("C ");
      if (sens.readTemp())
  {
       if(sens.getTemp()>=40)
       {
       lcd.setCursor(7, 2);
       lcd.print("jest");        
       }
       else
       {
       lcd.setCursor(7, 2);
       lcd.print("brak");
       }
 }
      else  
      {
      lcd.setCursor(7, 2);
      lcd.print("E3  ");
      }
  
  
      } 
    if(klawisz == '1'){
    digitalWrite(przekaznik1, LOW);
  lcd.setCursor(11,0);
  lcd.print("praca ");
   }
    if(klawisz == '2'){
    digitalWrite(przekaznik1, HIGH);
  lcd.setCursor(11,0);
  lcd.print("stop ");
   }
    
     
     if(klawisz == '3'){
    digitalWrite(przekaznik2, LOW);
  lcd.setCursor(19,2);
  lcd.print((char)1);
   }
   if(klawisz == '6'){
    digitalWrite(przekaznik2, HIGH);
  lcd.setCursor(19,2);
  lcd.print(" ");
   } 
   if(klawisz == 'D'){
  lcd.clear();
  wyjscie =1;
 }  
}

  if(automat == 1){
    if(klawisz == 'C'){
  lcd.clear();
  delay(100);
  wyjscie =0;
  automat1 =1;
  tryb_nastaw =0;
 }
  if(analogRead(A1)>=50){
  lcd.clear();
  gaz_alarm = 1; 
  automat1 =0;
  lcd.setCursor(0,0);
  lcd.print("KOD: E2");
  lcd.setCursor(0,1);
  lcd.print("ogien w ukladzie gaz");
  lcd.setCursor(0,2);
  lcd.print("odblokuj ststem");
  lcd.setCursor(0,0);
  lcd.print("");
  }
  if(digitalRead(41)==LOW){
  delay(200);  
  lcd.clear();
  gaz_alarm = 0; 
  automat1 =1;
  digitalWrite(przekaznik4, HIGH); 
  digitalWrite(led_gaz, LOW);
  }
  }
    if(automat1 == 1){
    manual =0;
  aktualnyczas = millis();
   if(digitalRead(blokada) == LOW){
  lcd.setCursor(19, 3);           
  lcd.print((char)2); 
   if(klawisz == '7'){
   delay(200);
   lcd.clear();
   tryb_nastaw =1;
   automat1 =0;
   }
   }
   else
   { 
  lcd.setCursor(19, 3);           
  lcd.print((char)3);
   }
  lcd.setCursor(0, 0);            
  lcd.print("went:");         
  lcd.setCursor(0, 1);            
  lcd.print("temp:"); 
  lcd.setCursor(0, 2);           
  lcd.print("ogien:");
  lcd.setCursor(12,2);
  lcd.print("swieca:");           
  lcd.setCursor(0, 3);           
  lcd.print("ster:  automat");
 if (aktualnyczas - zapamietanyczasczujniki >= 1000UL){
        zapamietanyczasczujniki = aktualnyczas;
     lcd.setCursor(7,1);
    sensors.requestTemperatures(); 
  lcd.print(sensors.getTempCByIndex(0));
  lcd.print((char)0); 
  lcd.print("C ");
 }
 if (aktualnyczas - zapamietanyczaswentylator >= 100UL){
        zapamietanyczaswentylator = aktualnyczas;
    
   if(sens.readTemp()){
     if(sens.getTemp()>=temp_dym)
       { 
     lcd.setCursor(7, 2);
     lcd.print("jest");
     digitalWrite(przekaznik2, HIGH);
     lcd.setCursor(19,2);
     lcd.print(" ");
     if(Tf >= temp_szczyt){
     alarmH = 1;
     lcd.setCursor(17,0);
     lcd.print("E1");
     digitalWrite(przekaznik1, HIGH);
     }
       else
     {
     alarmH = 0;
     lcd.setCursor(16,0);
     lcd.print("  "); 
     }
    }
     else
  {
     lcd.setCursor(7, 2);
     lcd.print("brak");
     digitalWrite(przekaznik2, LOW);
     digitalWrite(przekaznik1, LOW);
     lcd.setCursor(19,2);
     lcd.print((char)1);
     lcd.setCursor(11,0);
     lcd.print("praca"); 
   } 

   if(Tf>=zadana_temp){
     lcd.setCursor(11,0);
     lcd.print("stop ");
    delay(50);
   pot.decrease(1);
    }
  
     } 
      else  
      {
      lcd.setCursor(7, 2);
      lcd.print("E3  ");
      } 
        if(Tf<=zadana_temp){
        lcd.setCursor(11,0);
     lcd.print("praca");
     digitalWrite(przekaznik1, LOW);
       delay(50);
   pot.increase(1);
    }  
   odczytanaWartosc = analogRead(A0);
   napiecie = odczytanaWartosc * (103.5/1024.0);
  lcd.setCursor(7, 0);
  lcd.print(napiecie);
  lcd.print("% ");
  went=analogRead(A0);
  out=map(went,0,1023,0,255);
  analogWrite(PWM,out);
 }
 if(klawisz == 'D'){
  lcd.clear();
  wyjscie =1;
  }
 }
if(alarmH == 1){
  analogWrite(alarm, 3127);
  delay(50);
  analogWrite(alarm,0);
  delay(50);
}


 if(tryb_nastaw == 1){
  lcd.setCursor(5, 0);            
  lcd.print("TRYB NASTAW");
  lcd.setCursor(0, 1);            
  lcd.print("temp:");
  lcd.print(zadana_temp);
  lcd.print((char)0); 
  lcd.print("C ");
  lcd.setCursor(0, 2);           
  lcd.print("parametr: +4 -5     ");
  lcd.setCursor(0, 3);           
  lcd.print("powrot C dalej B"); 
  if(klawisz == '4'){
    zadana_temp += 1;
  }
  if(klawisz == '5'){
    zadana_temp -= 1;
  }
 }
 if(tryb_nastaw == 2){
  lcd.setCursor(5, 0);            
  lcd.print("TRYB NASTAW");
  lcd.setCursor(0, 1);            
  lcd.print("temp szczyt:");
  lcd.print(temp_szczyt);
  lcd.print((char)0); 
  lcd.print("C ");
  lcd.setCursor(0, 2);           
  lcd.print("parametr: +4 -5");
  lcd.setCursor(0, 3);           
  lcd.print("powrot A dalej B");
  if(klawisz == '4'){
    temp_szczyt += 1;
  }
  if(klawisz == '5'){
    temp_szczyt -= 1;
  } 
 }
  if(tryb_nastaw == 3){
  lcd.setCursor(5, 0);            
  lcd.print("TRYB NASTAW");
  lcd.setCursor(0, 1);            
  lcd.print("temp dymu:");
  lcd.print(temp_dym);
  lcd.print((char)0); 
  lcd.print("C ");
  lcd.setCursor(0, 2);           
  lcd.print("parametr: +4 -5");
  lcd.setCursor(0, 3);           
  lcd.print("powrot A dalej B");
  if(klawisz == '4'){
    temp_dym += 1;
  }
  if(klawisz == '5'){
    temp_dym -= 1;
  } 
 }
  if(klawisz == 'B'){
   lcd.clear();
   tryb_nastaw +=1; 
  }
   if(klawisz == 'A'){
   lcd.clear();
   tryb_nastaw -=1; 
  }
 
 if(wyjscie == 1){
  automat1 =0;
  manual1 =0;
  lcd.setCursor(6, 0);            
  lcd.print("!UWAGA!");         
  lcd.setCursor(0, 1);            
  lcd.print("Opuszczasz program?"); 
  lcd.setCursor(0, 2);           
  lcd.print("tak: kliknij 0");           
  lcd.setCursor(0, 3);           
  lcd.print("nie: kliknij C");
  digitalWrite(przekaznik1, HIGH);
  digitalWrite(przekaznik2, HIGH);
  digitalWrite(przekaznik3, HIGH);
  digitalWrite(przekaznik4, HIGH);
 }
 if(klawisz == '0'){
  lcd.clear();
  delay(300);
  wyjscie =0;
  manual1 =0;
  manual =0;
  automat1 =0;
  automat= 0;
     }
  if(gaz_alarm == 1){ 
  digitalWrite(przekaznik1, HIGH);
  digitalWrite(przekaznik2, HIGH);
  digitalWrite(przekaznik3, HIGH);    
  digitalWrite(przekaznik4, LOW);
  digitalWrite(led_gaz, HIGH);
  digitalWrite(alarm_gaz, HIGH);
  delay(50);
  digitalWrite(alarm_gaz, LOW);
  delay(50);
  }
    
}  

 

Edytowano przez Radzio_
Link do komentarza
Share on other sites

i przerób to na coś czytelnego dla siebie i sprzętu, masz same IF nie wiadomo co i w ogóle ma się wykonywać, trzeba godzin i dni by to ogarnąć w taki sposób jak napisałeś. Zacznij of podziału na funkcje, wykorzystaj SWITCH CASE i jak wspomniał kolega Santiago SCHEMAT BLOKOWY na kartce

 

// ---------------------------------------------------------------------------------------
// OBSŁUGA KEY 8, 9, 0
// ---------------------------------------------------------------------------------------

void key8()
{
	lcd.clear();
    delay(200);
    instrukcja +=1;
    menu +=1;
}

void key9()
{
	lcd.clear();
    delay(200);
    instrukcja -=1;
    menu -=1;	
}

void key0();
{
	delay(100);
    lcd.clear();
    menu =1;
    praca =1;
    instrukcja =0;
}

// ---------------------------------------------------------------------------------------
// OBSŁUGA KLAWIATURY
// ---------------------------------------------------------------------------------------

void F_Klawiatura()
{
	char klawisz = klawiatura.getKey();
	
	switch (klawisz)
	{
		case '8' : key8(); break;
		case '9' : key9(); break;
		case '0' : key0(); break;
		default  : break;
	}	
}

// ---------------------------------------------------------------------------------------
// OBSŁUGA MENU
// ---------------------------------------------------------------------------------------

void F_Menu()
{
	// ...
}
// ---------------------------------------------------------------------------------------
// L O O P
// ---------------------------------------------------------------------------------------

void loop() 
{
		F_Klawiarura();
		F_Menu();

 

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

@PowerTGS440  tak z ciekawości rzuciłem okiem na wędzarnie i nie jest to prosty temat. Wchodzi tu w rolę wiele czynników. No ale jednak jak podejrzewałem jedno jest pewne, ta klawiatura jest zbędna. Proces powinien odbywać się automatycznie. Tak samo to co jest wyświetlane nie jest wiele warte jeżeli czujnik się zawiesi albo uC, 

Nie widzę tutaj żadnych zabezpieczeń (no bo ciężko je tu upchać),  dlatego nalegam abyś po prostu przemyślał wszystko od początku. 

Link do komentarza
Share on other sites

I żeby nie było że moja wypowiedź jest totalnie pozbawiona merytoryki 😉 @PowerTGS440 czy nie lepiej zamiast pisać x razy
 

void key9()
{
	lcd.clear();
    delay(200);
    instrukcja -=1;
    menu -=1;	
}

zrobić funkcję 
 

void key_nr(int key_number)
{
	lcd.clear();
    delay(200);
    
  if(key_number).... // rób co pod tym numerem kl
  
  instrukcja -=1;
    menu -=1;	
}

 

Edytowano przez _LM_
Link do komentarza
Share on other sites

@_LM_ tak wiem , jakoś tak wyszło , że można to inaczej interpretować. Jednak nie ma sensu abym cokolwiek więcej tutaj pisał. Chociaż byłoby to ciekawe zadanie logiczne. Rozmiar, czas nagrzewania (aż temperatura osiągnie pożądany próg), czas wędzenia, ile i grzejników, kiedy wentylator, no i naj ważniejsze co się dzieje po osiągnięciu stanu krytycznego ... rozmieszczenie czujników temperatury itp. 

Link do komentarza
Share on other sites

Przed chwilą, Santiago napisał:

Jednak nie ma sensu abym cokolwiek więcej tutaj pisał

No nie gadaj że focha strzeliłeś xD ja bym popatrzył jak to robicie. Jest listopad a płatki śniegu już topnieją? 

Link do komentarza
Share on other sites

 @_LM_ Haha, zgodzę się bo jak pisałem to mój 1 program wielozadaniowy...  @Santiago Owszem zachodzi tu wiele czynników, klawiatura jest potrzebna by móc zmieniać nastawy, ale równie dobrze można by było zrobić to na enkoderze... Klawiaturę miałem pod ręką i jakoś bardziej poręczna dla mnie, po co nastawy? By móc regulować temperaturę we wnętrzu wędzarni. Dla każdego rodzaju mięsa jest inaczej. Wołowina, wieprzowina, drób, ser, ryby, baranina itp.  Wyświetlacz pomaga bo widać jakie są aktualnie parametry, w razie uszkodzenia czujników pokazuje się błąd odpowiadający za dany element. W przypadku cofnięcia się ognia do układu, elektrozawór odcina gaz przy butli, poprzedzony komunikatem E2. Przegrzanie tak samo jest zabezpieczone kodem E1. Wszystko jest tam po coś jednak z programowania orłem nie jestem i nie ogarniałem robienia nowych funkcji void() dlatego zapytałem jak można to zrobić lepiej. Program sam w sobie wczoraj i dziś testowałem i działa, wyświetla komunikaty, rozpala ogień i utrzymuje temperaturę jaką mu się zada, przegrzanie nie wchodzi w grę bo zamyka dopływ tlenu. Więc jest jak być powinno. Jednakże chodzi mi o sam fakt czy dałoby się zrobić to lepiej. Jak widzę da się co pokazał @PowerTGS440 ale, napisałem, że nie jestem spec w tym temacie dlatego nie wiedziałem też za bardzo jak można to rozdzielić na nowe funkcje. Ale dzięki za uświadomienie. 😉 

Link do komentarza
Share on other sites

8 minut temu, Santiago napisał:

@_LM_ tak wiem , jakoś tak wyszło , że można to inaczej interpretować. Jednak nie ma sensu abym cokolwiek więcej tutaj pisał. Chociaż byłoby to ciekawe zadanie logiczne. Rozmiar, czas nagrzewania (aż temperatura osiągnie pożądany próg), czas wędzenia, ile i grzejników, kiedy wentylator, no i naj ważniejsze co się dzieje po osiągnięciu stanu krytycznego ... rozmieszczenie czujników temperatury itp. 

Proste, termopara na rurze dolotowej do wędzarni a czujnik DS18B20 w samej wędzarni, czujnik natężenia światła zamknięty w obudowie w której jest przezroczysta rurka, w razie cofnięcia gazu wykrywa zawahanie odczytu i odcina gaz. Wentylator w trybie manualnym sterujesz potencjometrem a w automacie w zależności od temperatury reguluje obrotami. Czas wędzenia jest dla kazdego razu indywidualny, nie ma ustalonego moze byc kilka godzin a moze byc kilkanascie dni... 

Link do komentarza
Share on other sites

4 minuty temu, Radzio_ napisał:

DS18B20 w samej wędzarni

to mi się nie podoba, te układy są do 120°C (nie wiem nie sprawdzałem dokładnie) raczej dałbym tam termoparę lub PTC bo ds może nie wytrzymać zbyt długo w tych warunkach.

Co do kodu, mniejsza teraz o czujniki. Twoim problemem w tym przypadku są wszechobecne delaye, chcąc "upłynnić" działanie swojego programu musisz zapoznać się z timerami, funkcją millis i maszyną stanów. Są na forbocie odpowiednie artykuły na ten temat - pozwól że nie przytoczę linków znajdziesz to bez problemu - w każdym razie twój sterownik jest wykonalny i będzie działał ale wymaga zmiany podejścia do pisania softu nie jest to trudne w końcu i ja się nauczyłem oraz wielu innych programistów. Także zacznij od tematów wielowątkowości musisz przez to przebrnąć i niema że boli

  • Lubię! 2
Link do komentarza
Share on other sites

@Radzio_  Dni, godziny 🙂 , naprawdę nie jest to prosty temat.@_LM_ No co ty ja tutaj się uczę i na pewno wiesz więcej niż ja. 

Ale co do pomysłu kolegi to po prostu jestem ostrożny - co prawda jest elektrykiem i na pewno wie co robi. Tak na marginesie to w wolnym czasie przeanalizuję te wszystkie czujniki, ale jednak już teraz wiem , że nie jest to do końca dobre.  

Sam dla zabawy stworzę sobie schemat blokowy i oczywiście wykluczę ten typ klawiatury. Dziękuję za zajęcie 🙂 (

  • Lubię! 2
Link do komentarza
Share on other sites

@Santiago to co wiem to nie jest żadna wiedza tajemna, a ostatnio przy pewnym niby prostym projekcie życie znów zweryfikowało mój zasób (który ostatecznie został powiększony - do czasu aż zaś wyleci z bani) wiedzy. A co do bezpieczeństwa tego urządzenia nie popadajmy w skrajności widziałem na prawdę zaawansowane urządzenia budowane na podstawie AVR i ktoś przecież to wykonuje? No i przecież to nie jest sterownik 100kg drona z paczką z aliekspres na pokładzie. Także powoli i do przodu  

Edytowano przez _LM_
Link do komentarza
Share on other sites

Dnia 16.11.2024 o 17:27, Radzio_ napisał:

Od razu mówię, że nie jestem specem w programowaniu(jestem z zawodu elektrykiem) i się uczyłem jednocześnie robiąc ten projekcik.

Tu znajdziesz informacje o podobnym projekcie ze sterownikiem na bazie Arduino

https://forum.arduino.cc/t/new-to-arduino-how-to-start-building-a-temperature-regulated-bbq-smoker/473690

A tu też gość już coś takiego zbudował i zebrał pewne doświadczenia.

https://www.youtube.com/watch?v=CFRV67BF89M

https://github.com/archywigglestyn/Smoke-A-Matic

  • Lubię! 1
Link do komentarza
Share on other sites

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

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.