Go Down

Topic: Fusionner 2 sketchs ensemble (Read 398 times) previous topic - next topic

masterbalby

Jun 25, 2012, 02:46 pm Last Edit: Jun 25, 2012, 02:59 pm by Jean-François Reason: 1
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

Code: [Select]
#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

Code: [Select]
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

Code: [Select]
#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

Go Up