[résolu] Problème de controle relais avec comparaison temp via transmetteur 433

Bonsoir à tous,
Je me lance.
Je tiens à préciser que je débute dans la programmation.
Voilà le projet, j'ai un arduino nano équipé d'une sonde ds18b20 qui envoi une température avec un chiffre après la virgule via une table.
Jusque là tout va bien.
De l'autre côté, j'ai un arduino uno avec un récepteur 433, un écran 20x4 i2c et un relai.
J'arrive à capter la température, l'afficher sur l’écran, mais je n'arrive pas à traiter la variable temp pour faire fonctionner mon relai.
Je suppose que c'est un problème de type de variable mais je suis sec sur le sujet (même après avoir lu des forums sur le sujet).
Je vais poster mon code et j'attends vos coups de bâtons :o

Bonne soirée à vous

rec_ds18b20_v4.ino (2.08 KB)

Peux tu joindre ton code dans le message? Tel que, ce n’est pas lisible depuis une tablette ou un smartphone

#include <LiquidCrystal_I2C.h>  
#include <VirtualWire.h>  

LiquidCrystal_I2C lcd(0x27, 20, 4);  

#define PINRELAIS 13


 void setup()  
 { 
  digitalWrite(13, LOW);
 // initialise l'afficheur LCD
  lcd.begin();
 // efface l'ecran et place le curseur en 0,1
  lcd.clear();
 // allumer retroeclairage
  lcd.backlight();
 // activer l'affichage
  lcd.display(); 
    lcd.setCursor(0,0);  
  lcd.print("TempExt:"); // print a simple message  
  
  Serial.begin(9600);  
  vw_set_ptt_inverted(true); // Required for DR3100  
  vw_set_rx_pin(11);  
  vw_setup(4000); // Bits per sec  
  vw_rx_start(); 
 
 }  
 void loop()  
 {
 
 int temperaturedeg = 2; 
 
 pinMode(PINRELAIS, OUTPUT);   
  
  uint8_t buf[VW_MAX_MESSAGE_LEN];  
  uint8_t buflen = VW_MAX_MESSAGE_LEN;    
  if (vw_get_message(buf, &buflen)) // Non-blocking  
    {
    lcd.setCursor(8,0);     
    char temp=0;//mod:tim:added a temporary character    
    for (int i = 0; i < buflen; i++)
        {   
     temp=(char)buf[i];//mod:tim:convert uint to char
     Serial.print(temp); //mod:tim:changed buff[i] to temp here  
     lcd.print(temp);
     }  
     Serial.println("");      
    if(buf[0]=='1'){   
    digitalWrite(17,1);  //blink with active rf link
    }   
    if(buf[0]=='0'){  
    digitalWrite(17,0);  
    }  
  
        
 if (temp < temperaturedeg) { //Si la température lue est inférieure à la température de consigne, on active le relais

digitalWrite(13, HIGH); //le relais est haut si la consigne de temperature est atteinte
lcd.setCursor(0,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("Mode hors gel");
                         
 }
     
    else
{
  digitalWrite(13, LOW); // le relais est bas si la consigne de temperature n'est pas atteinte
  lcd.setCursor(0,1); //on place le curseur de l'écran LCD au début de la 1ère ligne
lcd.print("Mode normal");
}
}
   }

Bonjour,

On ne sais pas si ta température est envoyée en binaire ou ascii. Et je ne comprend pas ce que tu veux faire avec ta boucle for (qu'est ce qu'il y a dans buf[0] la température ou '0'/'1' ?).

Mets ton programme d'émission.

Voici le code transmetteur.

 //simple wireless temperature tranmitter   
 // DS18S20 sensor is connected to pin 8  
 // Rf modules tranmit (data) pin is connected to pin 7 on the arduino 
 // More info: http://blog.riyas.org/2014/06/cheap-remote-wireless-temperature-sensor-with-arduino-uno-433mhz-rfmodule.html 
 #include <VirtualWire.h>  
 #include <OneWire.h>   
 int DS18S20_Pin = 2; //DS18S20 Signal pin on digital 2  
 OneWire ds(DS18S20_Pin); // on digital pin 2  
 char *controller;  
 char msg[6];  
 void setup()   
   {  
      Serial.begin(9600);  
      pinMode(13,OUTPUT);  
      vw_set_ptt_inverted(true); //  
      vw_set_tx_pin(12);  
      vw_setup(4000);// speed of data transfer Kbps  
   }  
 void loop()  
   {   
      float temperature = getTemp();  
      Serial.println(temperature);  
      dtostrf(temperature, 6, 1, msg);  
      digitalWrite(13,0);  
      vw_send((uint8_t *)msg, strlen(msg)); // Send temperature.  
      vw_wait_tx();  
      delay(500);  
      digitalWrite(13,1); // blink the led on pin13  
      delay(500);  
   }  
 float getTemp()  
 {  
  //returns the temperature from one DS18S20 in DEG Celsius  
  byte data[12];  
  byte addr[8];  
  if ( !ds.search(addr)) {  
    //no more sensors on chain, reset search  
    ds.reset_search();  
    return +100;  
  }  
  if ( OneWire::crc8( addr, 7) != addr[7]) {  
    Serial.println("CRC is not valid!");  
    return +100;  
  }  
  if ( addr[0] != 0x10 && addr[0] != 0x28) {  
    Serial.print("Device is not recognized");  
    return +100;  
  }  
  ds.reset();  
  ds.select(addr);  
  ds.write(0x44,1); // start conversion, with parasite power on at the end  
  byte present = ds.reset();  
  ds.select(addr);    
  ds.write(0xBE); // Read Scratchpad  
  for (int i = 0; i < 9; i++) { // we need 9 bytes  
   data[i] = ds.read();  
  }  
  ds.reset_search();  
  byte MSB = data[1];  
  byte LSB = data[0];  
  float tempRead = ((MSB << 8) | LSB); //using two's compliment  
  float TemperatureSum = tempRead / 16;  
  return TemperatureSum;  
 }

kamill:
Bonjour,

On ne sais pas si ta température est envoyée en binaire ou ascii. Et je ne comprend pas ce que tu veux faire avec ta boucle for (qu'est ce qu'il y a dans buf[0] la température ou '0'/'1' ?).

Mets ton programme d'émission.

J'ai testé en mettant // devant ces lignes de programme et je n'ai pas eu d'incidence au niveau du resultat à savoir la température qui s'affiche.

C'est tout simple:

pour envoyer

  vw_send((uint8_t *)&temperature, sizeof temperature); // Send temperature.

pour recevoir

  float temp;
  uint8_t buflen = sizeof temp;
  if (vw_get_message((uint8_t *)&temp, &buflen)) // Non-blocking
  {
    Serial.print(temp);
    // ...
  }

kamill:
C'est tout simple:

pour envoyer

  vw_send((uint8_t *)&temperature, sizeof temperature); // Send temperature.

pour recevoir

  float temp;

uint8_t buflen = sizeof temp;
  if (vw_get_message((uint8_t *)&temp, &buflen)) // Non-blocking
  {
    Serial.print(temp);
    // ...
  }

Super ca fonctionne
Encore mille mercis car cela fait des semaines que je bute sur cela.
Ma question est : où dois je aller pour apprendre sur ce sujet?