Bonjour à tous.
Je suis toujours en train de bosser sur mon thermomètre GSM en mode PDU.
J'ai réaliser différents sketchs.
Un pour la lecture de la température avec un DS18B20
Un pour l'envoi d'un message d'alerte si la température baisse sous un certain seuil (ici 18°C)
Et un pour allumer ou éteindre la led incorporée au Leonardo (Pin 13) grace à l'envoi d'un SMS depuis un autre portable (On pour allumer et Off pour éteindre).
Ces trois sketchs fonctionnent très bien tout seul.
Par contre que je les fusionne certaines fonctionnalités ne fonctionnent pas.
Voici le sketch pour lire et afficher la température
#include <OneWire.h>
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 10 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
boolean getTemperature(float *temp){
byte data[9], addr[8];
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(800); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0;
i < 9;
i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
*temp = ((data[1] << 8) | data[0]) * 0.0625;
return true;
}
void setup() {
Serial.begin(9600);
}
void loop() {
float temp;
if(getTemperature(&temp)) {
Serial.print("Temperature : ");
Serial.print(temp,0);
Serial.println();
}
}
Voici le code pour allumer et éteindre la Led
String cmd = String("");
int ledPin = 13;
long previousMillis = 0 ;
long interval = 5000;
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
delay(1500);
Serial1.println("AT+CMGF=0");
delay(1500);
Serial1.println("AT+CPMS=\"ME\",\"ME\",\"ME\"");
delay(1500);
Serial1.println("AT+CNMI=1,1");
delay(1500);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
Serial1.println("AT+CMGD=1");
delay(20);
}
if (Serial1.available() > 0) {
char SerialInByte;
SerialInByte = Serial1.read();
if(SerialInByte==10)
{
Serial1.flush();
}
else if(SerialInByte==13){
ProcessCmd();
}
else{
cmd = cmd + String(SerialInByte);
}
}
if(cmd.equals("+CMTI: \"ME\",1")){
ProcessCmd();
}
}
void ProcessCmd() {
Serial.print( "ProcessCmd for [" );
Serial.print( cmd );
Serial.println( "]" );
Serial.println("");
Serial1.println("AT+CMGR=1");
if(cmd.substring(50) == "80024F37") { //On
digitalWrite(ledPin, HIGH);
Serial1.println("AT+CMGD=1");
delay(20);
clearCmd();
}
else if(cmd.substring(50) == "80034FB319") { //Off
digitalWrite(ledPin, LOW);
Serial1.println("AT+CMGD=1");
delay(20);
clearCmd();
}
else{
clearCmd();
}
}
// Réinitialiser le buffer (et vider le port série)
void clearCmd(){
cmd="";
Serial1.flush();
}
et pour finir voila les deux sketchs fusionnés
#include <OneWire.h>
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 10 // Broche utilisée pour le bus 1-Wire
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
boolean getTemperature(float *temp){
byte data[9], addr[8];
if (!ds.search(addr)) { // Recherche un module 1-Wire
ds.reset_search(); // Réinitialise la recherche de module
return false; // Retourne une erreur
}
if (OneWire::crc8(addr, 7) != addr[7]) // Vérifie que l'adresse a été correctement reçue
return false; // Si le message est corrompu on retourne une erreur
if (addr[0] != DS18B20) // Vérifie qu'il s'agit bien d'un DS18B20
return false; // Si ce n'est pas le cas on retourne une erreur
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0x44, 1); // On lance une prise de mesure de température
delay(800); // Et on attend la fin de la mesure
ds.reset(); // On reset le bus 1-Wire
ds.select(addr); // On sélectionne le DS18B20
ds.write(0xBE); // On envoie une demande de lecture du scratchpad
for (byte i = 0;
i < 9;
i++) // On lit le scratchpad
data[i] = ds.read(); // Et on stock les octets reçus
*temp = ((data[1] << 8) | data[0]) * 0.0625;
return true;
}
String cmd = String("");
int ledPin = 13;
long previousMillis = 0 ;
long interval = 5000;
void setup() {
Serial.begin(9600);
Serial1.begin(9600);
delay(1500);
Serial1.println("AT+CMGF=0");
delay(1500);
Serial1.println("AT+CPMS=\"ME\",\"ME\",\"ME\"");
delay(1500);
Serial1.println("AT+CNMI=1,1");
delay(1500);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis > interval) {
previousMillis = currentMillis;
Serial1.println("AT+CMGD=1");
delay(20);
}
if (Serial1.available() > 0) {
char SerialInByte;
SerialInByte = Serial1.read();
if(SerialInByte==10)
{
Serial1.flush();
}
else if(SerialInByte==13){
ProcessCmd();
}
else{
cmd = cmd + String(SerialInByte);
}
}
if(cmd.equals("+CMTI: \"ME\",1")){
ProcessCmd();
}
float temp;
if(getTemperature(&temp)) {
Serial.print("Temperature : ");
Serial.print(temp,0);
Serial.println();
}
}
void ProcessCmd() {
Serial.print( "ProcessCmd for [" );
Serial.print( cmd );
Serial.println( "]" );
Serial.println("");
Serial1.println("AT+CMGR=1");
if(cmd.substring(50) == "80024F37") { //On
digitalWrite(ledPin, HIGH);
Serial1.println("AT+CMGD=1");
delay(20);
clearCmd();
}
else if(cmd.substring(50) == "80034FB319") { //Off
digitalWrite(ledPin, LOW);
Serial1.println("AT+CMGD=1");
delay(20);
clearCmd();
}
else{
clearCmd();
}
}
// Réinitialiser le buffer (et vider le port série)
void clearCmd(){
cmd="";
Serial1.flush();
}
Lorsque je fusionne les deux sktechs la compilation et la programmation se passent bien.
Par contre lorsque le programme est lancé je peux juste récupérer et afficher la température.
Je ne peux plus commander l'allumage ou l'extinction de la led.
Peut être que le code est bouclé à un endroit ??
Bref j'aurais besoin d'un peu d'aide
Par avance merci beaucoup