Go Down

Topic: [résolu] Problème de controle relais avec comparaison temp via transmetteur 433 (Read 175 times) previous topic - next topic

drefparadise

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

Jambe

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

drefparadise

Code: [Select]

 
#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");
}
}
   } 

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.

drefparadise

Voici le code transmetteur.



Code: [Select]

 //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; 
 } 

drefparadise

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.

kamill

C'est tout simple:

pour envoyer
Code: [Select]
  vw_send((uint8_t *)&temperature, sizeof temperature); // Send temperature.

pour recevoir
Code: [Select]
  float temp;
  uint8_t buflen = sizeof temp;
  if (vw_get_message((uint8_t *)&temp, &buflen)) // Non-blocking
  {
    Serial.print(temp);
    // ...
  }

drefparadise

C'est tout simple:

pour envoyer
Code: [Select]
  vw_send((uint8_t *)&temperature, sizeof temperature); // Send temperature.

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

Go Up