Go Down

Topic: Sensore co2 mh-z14a  (Read 1 time) previous topic - next topic

megaciro

Puoi usare benissino una seriale software, visto che la comunicazione è a 9600, e lasciare quella hardware per il debug.
Grazie carissimo per l'aiuto,  potresti farmi un esempio in modo da capire... scusa la ciucciaggine..

zoomx

Basta guardare l'esempio SoftwareSerialExample cambiando 
Code: [Select]
mySerial.begin(4800);
in
Code: [Select]
mySerial.begin(9600);

Puoi anche cambiare
Code: [Select]
Serial.begin(57600);
a seconda delle tue esigenze.

I pin da usare nell'esempio sono 10 per RX e 11 per TX che andranno collegati rispettivamente ai pin TX e RX del modulo CO2 (RX e TX vanno incrociati).

L'esempio non fa altro che prendere ciò che arriva da una seriale e stamparlo sull'altra. Si usa esattamente come serial con alcune limitazioni descritte qui
https://www.arduino.cc/en/Reference/softwareSerial

megaciro

I pin da usare nell'esempio sono 10 per RX e 11 per TX che andranno collegati rispettivamente ai pin TX e RX del modulo CO2
Sempre tramite convertitore logico? Il sensore accetta 3.3v

zoomx

Si, a meno che usi una scheda a 3.3V.

megaciro

Mi sono accorto mentre testavo diversi codici anche suggeriti  da  voi che il sensore di co2 ha qualcosa che non va... si surriscalda e fa andare in blocco sia Arduino che il modulo di alimentazione...

zoomx

Succede anche se lo alimenti e basta? non è che hai sbagliato piedini di alimentazione? Oppure la tensione è superiore ai 5V?

megaciro

Succede anche se lo alimenti e basta? non è che hai sbagliato piedini di alimentazione? Oppure la tensione è superiore ai 5V?
Anche se lo alimento solo...ho provato da Arduino e con alimentatore esterno tramite modulo.. adesso mi sono arrivati i commutatore logici per tx rx...

megaciro

ho restituito il sensore mh-z14 ed ho ordinato mh-z19.
appena arriva procediamo.
grazie

megaciro

Code: [Select]

#include <LiquidCrystal.h> //LIBRERIA PER UTILIZZO LCD
#define BACKLIGHT 10 //PIN DIGITALE PER CONTROLLO RETROILLUMINAZIONE
 
int BUTTON; //VARIABILE DI GESTIONE DEI PULSANTI
int CLICK; //VARIABILE DI GESTIONE DEI PULSANTI
unsigned long STARTINGTIMELCD; //GESTIONE TIMEOUT LCD
const unsigned long TIMEOUTLCD = 2000; //GESTIONE TIMEOUT LCD (2000Ms = 2 Sec)
 
// INIZIALIZZO LA LIBRERIA CON I RELATIVI PIN
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
void setup() {
  //---------------------------------------------------------------
  // IMPOSTAZIONI DI STARTUP DEL KEYPAD LCD
  //---------------------------------------------------------------
  pinMode(BACKLIGHT, OUTPUT);//SET DEL PIN DELLA RETRIULLUMINAZIONE
  digitalWrite(BACKLIGHT, LOW); //SPENGO RETROILLUMINAZIONE
  lcd.begin(16, 2);//INIZIALIZZO LCD, 16 (DA 0 A 15) CARATTERI PER 2 RIGHE (0 e 1)
  lcd.setCursor(0, 0);//MI POSIZIONE SUL DISPLAY
  lcd.print("mistaloba");//SCRIVO UN MESSAGGIO
  lcd.noDisplay(); //SPENGO LCD
}
 
void loop() {
  //---------------------------------------------------------------
  //GESTIONE TIMEOUT: DOPO 2 SECONDI DALL' ACCENSIONE SPENGO LCD
  //---------------------------------------------------------------
  if ((millis() - STARTINGTIMELCD) > TIMEOUTLCD) {
    digitalWrite(BACKLIGHT, LOW); //SPENGO LA RETROILLUMINAZIONE
    lcd.noDisplay(); //SPENGO LCD
  }
 
  //---------------------------------------------------------------
  //GESTIONE AZIONI A SEGUITO PRESSIONE DEI PULSANTI
  //---------------------------------------------------------------
  BUTTON = ctrlButton(CLICK); //ASSEGNO ALLA VARIABILE BUTTON IL VALORE PASSATO DALLA ROUTINE
  lcd.setCursor(0, 1); //INDICO DI INIZIARE A SCRIVERE AL CARATTERE 0 DELLA RIGA 1
 
  if (BUTTON != 0) {//VERIFICO SE E' STATO PREMUTO UN PULSANTE
    STARTINGTIMELCD = millis(); //IMPOSTO IL CLOCK PER IL TIMEOUT
  }
  switch (BUTTON) {
    case 1:
      lcd.print("HAI PREMUTO Dx  ");//SCRIVO SU LCD
      break;
    case 2:
      lcd.print("HAI PREMUTO Su  ");//SCRIVO SU LCD
      break;
    case 3:
      lcd.print("HAI PREMUTO Giu' ");//SCRIVO SU LCD
      break;
    case 4:
      lcd.print("HAI PREMUTO Sx  ");//SCRIVO SU LCD
      break;
    case 5:
      lcd.print("HAI PREMUTO Slct");//SCRIVO SU LCD
      break;
  }
 
  //---------------------------------------------------------------
  //SE E' STATO PREMUTO UN PULSANTE ACCENDO RETROILLUMINZIONE E LCD
  //---------------------------------------------------------------
  if (BUTTON != 0) { //VERIFICO SE E' STATO PREMUTO UN PULSANTE
    digitalWrite(BACKLIGHT, HIGH); //ACCENDO LA RETROILLUMINAZIONE
    lcd.display();//ACCENDO LCD
    STARTINGTIMELCD = millis(); //INIZIO TIMEOUT PER RETROILLUMINAZIONE
  }
}
//---------------------------------------------------------------
// ROUTINE DI CONTROLLO PRESSIONE PULSANTI
//---------------------------------------------------------------
int ctrlButton(int CLICK) {
  int x;
  x = analogRead (0); //leggo il valore del pin analogico 0
  if (x < 60) {
    return 1;
  }
  else if (x < 200) {
    return 2;
  }
  else if (x < 400) {
    return 3;
  }
  else if (x < 600) {
    return 4;
  }
  else if (x < 800) {
    return 5;
  }
  return 0;
}

salve ragazzi, nel frattempo che arrivi il sensore di co2 stravo giocherellando con lcd keypad.
questo è il codice iniziale con cui sto sperimentando le varie funzioni. la mia domanda è questa:come faccio ad assegnare un comando ad un pulsante?
mi spiego: voglio comandare la retro illuminazione del display con un pulsante, andando nei vari case ed aggiungendo il comando digitalwrite riesco a farlo, ma se volessi farlo in pwm con analogwrite? come riesco a richiamare quel pulsante?

zoomx

Immagino che tu voglia controllare il livello di retroilluminazione.

In questo caso avrai una variabile, diciamo Level, intera ad 8 bit senza segno.
uint8_t Level;
Quindi scegli due pulsanti e la loro unica azione sarà incrementare o decrementare la variabile.
Nel loop invece assegnerai continuamente il valore con analogWrite.

Tieni conto che ancora non ho preso un caffè!

megaciro

salve a tutti, mi è arrivato il sensore co2 mh-z19b.

ho iniziato con questo... ma mi da valori inverosimili..

Code: [Select]

#include "MHZ.h"

// pin for uart reading
#define CO2_IN 10

// pin for pwm reading
#define MH_Z19_RX A0  // D7
#define MH_Z19_TX  A1 // D6

MHZ co2(MH_Z19_RX, MH_Z19_TX, CO2_IN, MHZ19B);

void setup() {
  Serial.begin(9600);
  pinMode(CO2_IN, INPUT);
  delay(100);
  Serial.println("MHZ 19B");

  // enable debug to get addition information
   co2.setDebug(true);

 
}

void loop() {
  Serial.print("\n----- Time from start: ");
  Serial.print(millis() / 1000);
  Serial.println(" s");

  int ppm_uart = co2.readCO2UART();
  if (ppm_uart > 0) {
    Serial.print("PPMuart: ");
    Serial.print(ppm_uart);
  }

  int ppm_pwm = co2.readCO2PWM();
  Serial.print(", PPMpwm: ");
  Serial.print(ppm_pwm);

  int temperature = co2.getLastTemperature();
  if (temperature > 0) {
    Serial.print(", Temperature: ");
    Serial.println(temperature);
  }

  Serial.println("\n------------------------------");
  delay(5000);
}

megaciro

poi ho provato questo
Code: [Select]

void setup() {
  Serial.begin(9600);
  // initialize the sensor pin as an input
  pinMode(sensorPin, INPUT);
  // Read starting value for millis... (just some value)
while(digitalRead(sensorPin) == LOW) {;}
  hoog = millis();
}
 
void loop(){
  // Check for high and low timing - low time * 2 = PPM
  while(digitalRead(sensorPin) == HIGH) {;}
  laag = millis();
  hoogTijd = laag - hoog;
  
  while(digitalRead(sensorPin) == LOW) {;}
  hoog = millis();
  laagTijd = hoog - laag;
 
  // Validity check high+low = 1004 (small margin or error allowed -> 990)
  if(laagTijd + hoogTijd > 990)
  {
    Serial.print("H: ");
    Serial.println(hoogTijd,DEC);
    Serial.print("L: ");
    Serial.println(laagTijd,DEC);
    Serial.print("CO2  -  ");
    Serial.print(laagTijd * 2,DEC);
    Serial.println(" ppm");    
  } else {
    // Output in case of invalid check: value instead of 1004 ms
    Serial.print("-- CK:");
    Serial.println(laagTijd+hoogTijd, DEC);
  }
}


ancora peggio...

megaciro

sarò io difettoso.... o sfortunato con i sensori...
ho provato con questo codice che è la base..
Code: [Select]
#include <SoftwareSerial.h>

#define MH_Z19_RX 7
#define MH_Z19_TX 6

SoftwareSerial sensorSerial(MH_Z19_RX, MH_Z19_TX);

void setup() {
  Serial.begin(9600);
  sensorSerial.begin(9600);

  Serial.println("Welcome to Hello MH-Z19 CO2 reading application.");
}

void loop() {
  Serial.println(readCO2());
  delay(1000);
}

int readCO2() {

  byte cmd[9] = {0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79};

  byte response[9];

  sensorSerial.write(cmd, 9);
  sensorSerial.readBytes(response, 9);

//  for (int i = 0; i < 9; i++) {
//    Serial.print(response[i], HEX);
//  }
// 
 
  if (response[0] != 0xFF) {
    Serial.print("Wrong starting byte from co2 sensor, got: ");   
    Serial.println(response[0], HEX);
    return -1;
  }

  if (response[1] != 0x86) {
    Serial.println("Wrong command from co2 sensor!");
    return -1;
  }

  int responseHigh = (int) response[2];
  int responseLow = (int) response[3];
  int ppm = (256 * responseHigh) + responseLow;
  return ppm;
}

la risposta è:

-1
Wrong command from co2 sensor!
-1
Wrong command from co2 sensor!
-1
Wrong command from co2 sensor!
-1
Wrong command from co2 sensor!
-1
Wrong command from co2 sensor!
-1
Wrong command from co2 sensor!
-1
Wrong command from co2 sensor!
-1
Wrong command from co2 sensor!
-1
 


non so più che fare... :'(  :'(  :'(  :'(  :'(  :'(

zoomx

Il primo sketch usa una libreria che non conosco.
Il secondo credo che cerchi di interpretare il segnale PWM che questo sensore emette su un piedino.
Il terzo scrive direttamente il comando sulla seriale.
Leggendo il PDF
https://www.winsen-sensor.com/d/files/infrared-gas-sensor/mh-z19b-co2-ver1_0.pdf

leggo che il comando per avere la concentrazione è prorio quello usato.

Magari prova a decommentare le righe
Code: [Select]
//  for (int i = 0; i < 9; i++) {
//    Serial.print(response[i], HEX);
//  }
//

e vedi cosa effettivamente risponde il sensore. Già sappiamo che il primo byte della risposta è FF altrimenti avremmo un errore diverso ma sospetto che possano essere tutti FF.



megaciro

amici,
ho risolto... il difetto era dovuto ad un errore di collegamento... non avevo messo in comune i gnd di arduino, sensore, modulo di alimentazione.
me asino ahahahah

Go Up