Skocz do zawartości
Prot1976

Kontrola CO2 w komorze o pojemności 200l

Pomocna odpowiedź

Cześć,

Miał być prosty układ z prostym kodem, ale apetyt rośnie w miarę jedzenia a w lesie coraz ciemniej.

w całym układzie brakuje mi jeszcze zaworu, reduktora i samej komory ale jak do tej pory całość reaguje na zmiany stężenia CO2.

Zamarzyło mi się MENU, możliwość wprowadzania zmian i ich zapis w EEPROM w przypadku utraty zasilania

Kod posklejany i kawałków kilku innych... całość jak na razie działa.

/*Program do kontroli stężenia CO2 w komorze o pojemności około 200l
 * konieczna jest zmiana docelowego stężenia 
 * dopasowanie czasu nastrzyku do różnicy między odczytem a stężeniem docelowym
 * zwłoka z uwagi na czas odpowiedzi czujnika CO2 i czas mieszania gazów w komorze
 * 
 * w skład układu wchodzi
 * DFRDuino UNO v3
 * DFRobot LCD Keypad Shield v1.1
 * DFrobot Gravity - czujnik dwutlenku węgla CO2 IR 0-50000ppm
 * DFRobot 1x Relay Shield
*/



#include <SoftwareSerial.h> //biblioteka komunikacji z czujnikiem
#include <LiquidCrystal.h> // biblioteka dla wyświetlacza 16x2
SoftwareSerial mySerial(1, 2); // RX, TX piny do komunikacji z czujnikiem
unsigned char hexdata[9] = {0xFF,0x01,0x86,0x00,0x00,0x00,0x00,0x00,0x79}; //Read the gas density command /Don't change the order
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); //Piny do komunikacji z LCD
int CO2relay = A2; // analog A2 jako wyjście przekaźnika
float CO2_LCD; // prezentacja CO2 na LCD

/*
 * 
 */
unsigned long previousMillis = 0;
unsigned currentMillis = millis();
long injection = 1000;
int InjState = LOW;
float SetPoint = 5.00;

//przyciski

int lcd_key    = 0;
int adc_key_in = 0;
#define UP       1
#define DOWN     2
#define btnNONE  5

// odczyt przycisku 
int read_LCD_buttons ()
{
   adc_key_in = analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold 
 if (adc_key_in < 250)  return UP; 
 if (adc_key_in < 450)  return DOWN;

 return btnNONE;  // when all others fail, return this...
}

void setup() {
  pinMode(CO2relay, OUTPUT);
  //digitalWrite(CO2relay, LOW);
  
  mySerial.begin(9600);
  lcd.begin(16, 2);              // start bibliotek
  analogWrite(10,2);
}

void loop() {
  unsigned long currentMillis = millis();
  lcd_key = read_LCD_buttons();  // stan przycisków
  /*
   * tylko przyciski góra i dół
   * góra zwiększa wartość SetPoint o 0.1
   * dół zmiejsza o 0.1
   */

 switch (lcd_key)               
 {     
   case UP:
     {
     SetPoint=SetPoint+0.1;
     break;
     }
   case DOWN:
     {
     SetPoint=SetPoint-0.1;
     break;
     }
 }
   mySerial.write(hexdata,9);
   //delay(100);
   
 for(int i=0,j=0;i<9;i++)
 {
  if (mySerial.available()>0)
  {
     long hi,lo,CO2;
     int ch=mySerial.read();

    if(i==2){     hi=ch;   }   //High concentration
    if(i==3){     lo=ch;   }   //Low concentration
    if(i==8) {
               CO2=(hi*256+lo);  //CO2 concentration
               CO2_LCD = CO2/10000.0;
                 
               }

  }

 }               
 
               lcd.setCursor(0,1);
               lcd.print("KOMORA ");
               lcd.print(CO2_LCD,1);
               lcd.print("%");
               lcd.print(" |");
               lcd.setCursor(0,0);
               lcd.print("SETUP  ");
               lcd.print(SetPoint,1);
               lcd.print("%");
               lcd.print(" |");
if ((CO2_LCD < SetPoint - 0.2) && (currentMillis - previousMillis >= injection))
{
previousMillis = currentMillis;
if (InjState == LOW){
  InjState = HIGH;
  lcd.setCursor(13,0);
  lcd.print("INJ");
  lcd.setCursor(13,1);
  lcd.print("CO2");
  //delay(1000);
  //digitalWrite(CO2relay,LOW);
  //delay(2000);
} else {
  InjState = LOW;
  lcd.setCursor(13,0);
  lcd.print("INJ");
  lcd.setCursor(13,1);
  lcd.print("OFF");
  }
  digitalWrite(CO2relay, InjState);
}

}

K.

Udostępnij ten post


Link to post
Share on other sites

@Prot1976 masz jakiś problem z tym programem, ale zapomniałeś dopisać pytania, czy to opis projektu? 🙂 Wybacz pytanie, ale trochę się zgubiłem. Przeniosłem Twój temat z działu o projektach dla początkujących, bo podejrzany był dla mnie brak zdjęć/opisów/schematów, ale teraz chyba widzę, że to jednak projekt. Zgadza się?

Udostępnij ten post


Link to post
Share on other sites

Jest to i projekt i zarazem początkujący jestem ja 🙂  , a że bardziej jestem początkujący i jest to pierwszy projekt wrzuciłem to do początkujących (to zdanie wygląda jak mój program 🤣).

Mam same problemy z tym programem 🙂 , ale jeszcze jakoś daje radę.

 

 

 

Udostępnij ten post


Link to post
Share on other sites

@Prot1976, ok teraz rozumiem. Jak opisujesz projekt to zawsze warto dodać jakieś zdjęcie urządzenia - przynajmniej od razu wiadomo, że coś zbudowałeś 😉 Jak masz jakiś problem z programem, to może zostawię temat jednak tutaj. Opisz swój problem - postaramy się pomóc 😉

Udostępnij ten post


Link to post
Share on other sites

mam problem z wyświetlaczem

przy pracy samego przekaźnika wszystko jest OK, niestety problem pojawia się gdy tylko podaję zasilanie na cewkę elektrozaworu.

zdjęcie poniżej pokazuje tylko co dzieje się na wyświetlaczu

w skład układu wchodzi

DFRDuino UNO v3

* DFRobot LCD Keypad Shield v1.1

* DFrobot Gravity - czujnik dwutlenku węgla CO2 IR 0-50000ppm

* DFRobot 1x Relay Shield

problem jest wyłącznie z wyświetlaczem, sam kontroler pracuje poprawnie i kontroluje zawór w zależności od stężenia CO2

 

Gdzie szukać problemu?

 

obraz.thumb.png.6f598bee2fb300138b3aee36b2b4372c.png

Udostępnij ten post


Link to post
Share on other sites

Złe zasilanie - temat popularny. Masz kilka sposobów na to, między innymi możesz kupić wydajniejszy zasilacz (więcej amperów i mocy), oraz dać równolegle kondensatory przy Arduino oraz wyświetlaczu (dokładnie na zasilanie i masę). 

Udostępnij ten post


Link to post
Share on other sites

zapomniałem dodać że cewka zaworu jest na 230VAC więc nie jest zasilana z zasilacza kontrolera, zasilacz do ardu 12V 2A wiec wystarcza

 

 

Udostępnij ten post


Link to post
Share on other sites

No to w takim razie zadbaj o poprawne filtrowanie zasilania. Dodaj parę kondensatorów elektrolit + ceramiczny na zasilaniu procesora i ceramiczny na zasilaniu samego wyświetlacza, najlepiej przylutuj go bezpośrednio do pinów wyświetlacza.

  • Lubię! 1

Udostępnij ten post


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

×