Page 2 sur 3

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 14:38
par Vincy76
j'ai donc apporté les modifications que tu me propose et donc après téléversement toujours le même problème température ok mais relais toujours pas.

entre temps j'ai rajouter le sleep mode pour le DHT22.

voici le code.

Code : Tout sélectionner

// Enable debug prints to serial monitor
#define MY_DEBUG

// Enable and select radio type attached
#define MY_RADIO_NRF24
//#define MY_RADIO_NRF5_ESB
//#define MY_RADIO_RFM69
//#define MY_RADIO_RFM95

// Enable repeater functionality for this node
#define MY_REPEATER_FEATURE

#include <SPI.h>
#include <MySensors.h> 
#include <DHT.h> 

//zone declarative pour buzzer
#define CHILD_ID_RELAY 2
#define RELAY_PIN 4  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
#define NUMBER_OF_RELAYS 1 // Total number of attached relays
#define RELAY_ON 1  // GPIO value to write to turn on attached relay
#define RELAY_OFF 0 // GPIO value to write to turn off attached relay

//zone declarative pour la sonde DHT22
#define CHILD_ID_TEMP 0  
#define CHILD_ID_HUM 1
#define SLEEP_NODE true // Mettre à True pour activer la mise en sommeil (Sleep Mode) / True to activate Sleep Mode
unsigned long SLEEP_TIME = 30 * 1000; // Temps de mise en sommeil (en ms) / Sleep time between reads (in milliseconds)
 
#define DHTPIN 3        // Broche sur laquelle est branché le DHT / what pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), DHT11
 
float lastTemp;
float lastHum;
boolean metric = true; 
MyMessage msgHum(CHILD_ID_HUM, V_HUM);
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP);


void before()
{
    for (int sensor=1, pin=RELAY_PIN; sensor<=NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);
        // Set relay to last known state (using eeprom storage)
        digitalWrite(pin, loadState(sensor)?RELAY_ON:RELAY_OFF);
    }
}

void setup()
{

}

void presentation()
{
    // Présenttion du sketch / Send the sketch version information to the gateway and Controller
  sendSketchInfo("Sonde Temp/Hum DHT22 + RELAY", "1.0");
 
  // Déclaration des capteurs attachés au noeud
  present(CHILD_ID_TEMP, S_TEMP);
  present(CHILD_ID_HUM, S_HUM);
  present(CHILD_ID_RELAY, S_BINARY);
}

void loop()      
{    
  DHT dht(DHTPIN, DHTTYPE,3); // Creation d'un objet dht dans la loop sinon les valeurs ne sont pas mesurées au réveil
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();
  if (isnan(temperature)) {
      Serial.println("Impossible de lire la temperature sur le DHT");
  } else {
    if (temperature != lastTemp) {
      lastTemp = temperature;
      if (!metric) {
        temperature = dht.readTemperature(true);
      }
      
      Serial.print("T: ");
      Serial.print(temperature);
      Serial.print(" | H: ");
      Serial.println(humidity);
      send(msgTemp.set(temperature, 1));
      send(msgHum.set(humidity, 1));
    } else {
      Serial.println("Temperature identique => on force l'envoi");  
      Serial.print("T: ");
      Serial.print(temperature);
      Serial.print(" | H: ");
      Serial.println(humidity);
      send(msgTemp.set(temperature, 1));
      send(msgHum.set(humidity, 1));
    }
  }

    if (SLEEP_NODE) {
    Serial.println("Sleep");
    sleep(SLEEP_TIME);
  } else {
    delay (SLEEP_TIME);
  }
  }
void receive(const MyMessage &message) {
  // We only expect one type of message from controller. But we better check anyway.
  if (message.isAck()) {
     Serial.println("This is an ack from gateway");
  }

  if (message.type == V_LIGHT) {
     // Change relay state
     state = message.getBool();
     digitalWrite(RELAY_PIN, state ? RELAY_ON : RELAY_OFF);
     // Store state in eeprom
     saveState(CHILD_ID_RELAY, state);

     // Write some debug info
     Serial.print("Incoming change for sensor:");
     Serial.print(message.sensor);
     Serial.print(", New status: ");
     Serial.println(message.getBool());
   } 
}

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 14:47
par vil1driver
Dormir et être à l'écoute d'éventuelles demandes d'activation de relais n'est pas vraiment compatible

N'oublie pas de t'aider des messages de debug de la console (en haut à droite)

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 14:52
par Vincy76
vil1driver a écrit :Dormir et être à l'écoute d'éventuelles demandes d'activation de relais n'est pas vraiment compatible

N'oublie pas de t'aider des messages de debug de la console (en haut à droite)

oui c'est pas faux j'ai pas réfléchi en rajoutant cette fonction :roll: .
je l'ai supprimé.

mais j'ai un message d'erreur qui apparait.

Code : Tout sélectionner

Arduino : 1.8.5 (Windows 10), Carte : "Arduino Nano, ATmega328"

C:\Users\admin\Desktop\station_salon_temp_et_buzzer\station_salon_temp_et_buzzer.ino: In function 'void receive(const MyMessage&)':

station_salon_temp_et_buzzer:103: error: 'state' was not declared in this scope

      state = message.getBool();

      ^

exit status 1
'state' was not declared in this scope

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 16:38
par hbachetti
En C toute variable doit être déclarée en lui donnant un type :
Soit tu la déclare en global au début du fichier, soit tu la déclares en local, au début de ta fonction receive, ou alors au moment ou tu en as besoin, comme ceci :
bool state = message.getBool();
@+

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 16:47
par Vincy76
Ah d accord. Mais du coup pk j ai ce message d erreur ? Il y a un truc qui m échappe.

Envoyé de mon GEM-702L en utilisant Tapatalk

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 16:53
par hbachetti
Je te l'ai expliqué.
En C toute variable doit être déclarée en lui donnant un type avant de l'utiliser. On est pas en langage BASIC.

En PYTHON tu n'aurais pas ce problème. Malheureusement pour programmer en python il te faudrait au moins une RASPBERRY PI.

Dans la dernière version de ton code, la variable n'était pas déclarée non plus.
J'ai vérifié, elle provoque la même erreur à la compilation.

A ta place je commencerais à étudier le C avec un tuto, sinon tu ne pourras jamais aller bien loin.

https://openclassrooms.com/courses/prog ... ec-arduino

@+ et courage

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 17:55
par Vincy76
hbachetti a écrit :Je te l'ai expliqué.
En C toute variable doit être déclarée en lui donnant un type avant de l'utiliser. On est pas en langage BASIC.

En PYTHON tu n'aurais pas ce problème. Malheureusement pour programmer en python il te faudrait au moins une RASPBERRY PI.

Dans la dernière version de ton code, la variable n'était pas déclarée non plus.
J'ai vérifié, elle provoque la même erreur à la compilation.

A ta place je commencerais à étudier le C avec un tuto, sinon tu ne pourras jamais aller bien loin.

https://openclassrooms.com/courses/prog ... ec-arduino

@+ et courage
merci pour le lien.
je vais commencer a étudier cela. c'est pas si facile que ça :D
serait il possible de me dépatouille ?

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 18:33
par hbachetti
Je t'ai déjà donné la solution :
au lieu d'écrire :

Code : Tout sélectionner

state = message.getBool();
écris simplement :

Code : Tout sélectionner

bool state = message.getBool();
Ça compile, c'est sûr.

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 18:54
par Vincy76
je te remercie énormément ça marche!! il es vrai il faut que j'apprenne car un truc qui te parait super simple pour moi c’était le flou. alors j'ai déjà suivi ton conseil je lit le tuto que tu ma donner.
petite question cela fait combien de temps que tu pratique le langage C?

Re: deux programmes mysensors sur un arduino

Publié : 04 févr. 2018, 22:03
par hbachetti
Je suis développeur logiciel embarqué depuis 1987, donc 30 ans.
Bien heureux d'avoir pu te venir en aide. Bonne continuation.
@+