Pages: [1]   Go Down
Author Topic: Fusionner 2 sketchs ensemble  (Read 354 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 89
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
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:
#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
« Last Edit: June 25, 2012, 07:59:30 am by Jean-François » Logged

Pages: [1]   Go Up
Jump to: