Je souhaite me faire une petite station météo et j'ai trouvé ce superbe capteur pour réaliser ma station.
Co2 cozir : Gas Sensing Solutions |
Cependant, je ne parviens pas à envoyer des commandes pour changer le mode de fonctionnement ou tout
simplement pour afficher une température. J'ai trouvé un exemple qui fait exactement ce que je souhaite (http://www.co2meters.com/Documentation/AppNotes/AN128-%20Cozir_Arduino.pdf ) mais je ne comprend pas pourquoi
je n'arrive pas à envoye rune simple commande.
Je me semble pourtant que lorsque je créé une liaison série (UART) vers le capteur ("SoftwareSerial mySerial(10, 11); // RX, TX")
il me suffit juste d'écrire ensuite : mySerial.print("K 0\r\n"); pour changer de mode.
Ou bien mySerial.print("T\r\n") Pour demander la température.
Mais cela ne change rien.
Quelqu'un aurait il une solution à me proposer ou même un bout de piste à suivre. Cela fait une semaine que j'essaye mais sans succès.
String val= ""; //holds the string of the value
double co2 = 0; // holds the actual value
double multiplier = 10; //each range of sensor has a different value.
// up to 2% =1
// up to 65% = 10
//up to 100% = 100;
uint8_t buffer[25];
uint8_t ind =0;
void setup()
{ Serial.begin(9600);
delay(300);
//Start Serial connection with host
mySerial.begin(9600);
//Start Serial connection with Sensor
delay(300);
mySerial.print("K 0\r\n"); // IT DOESN'T WORK !!! THIS IS MY PROBLEM
}
void loop()
{
//Cozir sensors ship from the factory in streaming mode
//So we read incoming bytes into a buffer until we get '0x0A' which is the ASCII value for new-line
buffer[ind] = mySerial.read();
ind++;
mySerial.print("K 0\r\n"); // IT DOESN'T WORK !!!
mySerial.print("K "); // IT DOESN'T WORK !!!
report(); //Once we get the '0x0A' we will report what is in the buffer
}
//FUNCTION**************
void report()
{
//Cycle through the buffer and send out each byte including the final linefeed
/*
each packet in the stream looks like "Z 00400 z 00360"
'Z' lets us know its a co2 reading. the first number is the filtered value
and the number after the 'z' is the raw value.
We are really only interested in the filtered value
*/
for(int i=0; i < ind+1; i++)
{
if((buffer != 0x0A) && (buffer != 0x0D)) val += buffer*-48; * // we subtract 48 to get to the actual numerical value // example the character '9' has an ASCII value of 57. [57-48=9] } } co2 = (multiplier * val.toInt()); //now we multiply the value by a factor specific ot the sensor. see the Serial.print( "Co2 = "); Serial.print(co2); Serial.println(" ppm"); ind=0; //Reset the buffer index to overwrite the previous packet val=""; //Reset the value string } [/quote]
oui j'ai essayé ça en premier mais il se trouve que le capteur possède trois mode de fonctionnement:
Le mode 0: Le capteur attend 'une commande de l'utilisateur
Le mode 1: Le capteur envoie deux mesures de co2 par seconde en continu (MODE PAR DÉFAUT)
Le mode 2: Le capteur fait l'acquisition de deux mesures de co2 comme le mode 1 mais il ne les envoie pas.
Comme le capteur est dans le mode 1 par défaut, le programme du PDF à l'air de fonctionner.
Mais si on essaye d'envoyer une commande comme l'acquisition de la température ou bien de changer de mode,
Il ne réagit pas.
Le programme du PDF récupère la valeur filtré du capteur. Par défaut, voila ce qu'envoie le capteur:
Z ##### z ##### ( "#" => chiffre )
exemple: Z 00480 z 00500
Lorsqu'on modifie le programme du PDF qui s’arrête au "z" pour qu'il s’arrête en fin de ligne "0X0A && 0X0D" (dans le loop).
on reçoit la même chose qu'auparavant.
Et bien sur l'envoie de commande de température encore moins.
D'ailleurs la LED du RX sur la carte arduino ne s'allume jamais alors que TX est lui clignote.
Je semble donc bien recevoir des mesures du capteur mais je n'arrive pas à le commander
ryan91_FR:
oui j'ai essayé ça en premier mais il se trouve que le capteur possède trois mode de fonctionnement:
Le mode 0: Le capteur attend 'une commande de l'utilisateur
Le mode 1: Le capteur envoie deux mesures de co2 par seconde en continu (MODE PAR DÉFAUT)
Le mode 2: Le capteur fait l'acquisition de deux mesures de co2 comme le mode 1 mais il ne les envoie pas.
Comme le capteur est dans le mode 1 par défaut, le programme du PDF à l'air de fonctionner.
Mais si on essaye d'envoyer une commande comme l'acquisition de la température ou bien de changer de mode,
Il ne réagit pas.
...
Je semble donc bien recevoir des mesures du capteur mais je n'arrive pas à le commander
Bonjour
tu a un lien vers la doc complete (avec les commandes à envoyer , )
tu a essayé avec un simple replicateur de port serie d'envoyer les commandes à la main (ou par script)
si tu es sur un uno essaye d'utiliser ça comme replicateur
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(2, 3); // RX | TX
// RX arduino <--- TX cible
// TX arduino ---> RX cible
void setup()
{
Serial.begin(9600); // vitesse serial monitor
BTSerial.begin(9600); // vitesse software serial
}
void loop()
{
// Keep reading from target and send to Arduino Serial Monitor
if (BTSerial.available())
Serial.write(BTSerial.read());
// Keep reading from Arduino Serial Monitor and send to target
if (Serial.available())
BTSerial.write(Serial.read());
}
Je suis sous Ubuntu mais J'ai essayé de lui envoyer avec un autre ordinateur de simple commande comme tu le suggère via un hyperterminal sous windows . Sans succès....
Je vais essayer tt de suite le code que tu as posté.
Je dois donc mettre : le Tx du capteur sur le Rx de l'arduino (pin 2)
le Rx du capteur sur le Tx de l'arduino (pin 3)
Je suis sous Ubuntu mais J'ai essayé de lui envoyer avec un autre ordinateur de simple commande comme tu le suggère via un hyperterminal sous windows . Sans succès....
Je vais essayer tt de suite le code que tu as posté.
Je dois donc mettre : le Tx du capteur sur le Rx de l'arduino (pin 2)
le Rx du capteur sur le Tx de l'arduino (pin 3)
voilà
comme il y souvent de la confusion entre ce qui est TX et RX vu des uns et des autres ,les sens de flux sont indiqués
je ne suis pas linuxien , mais il doit bien exister des "terminal serie" un peu evolués capables d'envoyer des "scripts ou macro"
Il y a du mieux, en fait, j'avais pas compris que je devait sélectionner "NL&CR" dans le moniteur série.
Il était sur "nouvelle ligne".
Donc le problème était simplement que je ne visualiser rien de juste avec "nouvelle ligne"
Cependant, je ne vois pas bien la différence entre les deux ....
Mais maintenant il répond aux commandes. C'est merveilleux !
ryan91_FR:
j'ai essayé le code et lors de l'envoie d'une commande il me répond avec : ?
J'ai envoyé les commande suivante: T
T\r\n
K 0
K 0\r\n
Mais la réponse est toujours : '?'
Le ? est donc généré par ton capteur
If a command is unrecognized, the sensor will respond with a “?”
ça indique déjà qu'il reçoit "des trucs" , mais ne sait pas quoi en faire
tu es ssur que teminateurs "CR/LF" ne sont pas doublés par ton soft terminal serial?
tu utilise quoi comme soft , si c'est celui de l'IDE , il y a une option de choix juste à coté du selecteur de vitesse
ok vu ta reponse entre temps
alors tant mieux,
je ne connais pas ce capteur , mais il à l'air interessant , tu t'es fourni où ,