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

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!

Gość
Napisz odpowiedź...

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