[resolu] Arduino deuligne temperature et module UHF

Informations et questions sur les composants tiers de la boutique (émetteur/récepteur RF, capteurs...)

[resolu] Arduino deuligne temperature et module UHF

Message non lude caco74 » Lun 14 Mai 2012 16:42

bonjour à tous dans le cas d'un envoie d'une temperature à l aide de module 434 je me heurte à un probleme de programmation.

Le but etant de transmettre les 2 octets de la temperature tempC en binaire vers le recepteur.( source Dallas 18b20)

je suis du coup vers un code de ce type là mais qui ne fonctionne pas.

Code: Tout sélectionner
 const char chaine[15];
    itoa( tempC, chaine, 10 );
    vw_send((uint8_t *)chaine, strlen(chaine)+1);
    delay(400);


j'aurais besoin d'un petit coup de main ( ou de clavier ! ).

Alors qu'un chaine de caracteres s'envoie avec ce code.( et qui fonctionne )

Code: Tout sélectionner
 const char *msg = " Coucou ";                   // C'est le message à envoyer.
       vw_send((uint8_t *)msg, strlen(msg));
       vw_wait_tx();                                         
       delay(200);                       


Merci.
Dernière édition par caco74 le Mar 15 Mai 2012 23:08, édité 1 fois.
caco74
 
Messages: 59
Inscription: Sam 7 Mai 2011 19:09

Re: Emetteur 434.

Message non lude SesechXP » Lun 14 Mai 2012 17:47

Salut,

Il faudrait commencer par initialiser la chaîne de caractères :
Code: Tout sélectionner
char chaine[15] = { '\0' };

Car on ne sait pas ce que cette variable peut contenir. Vu le code, il est possible que strlen renvoie une mauvaise taille et que par conséquent vw_send n'envoie pas le bon nombre d'octets (trop ou pas assez).

Ensuite tu ne peux pas déclarer chaine comme étant constante, puisqu'elle va être modifiée. Les déclarations de tes deux exemples sont différentes :
Code: Tout sélectionner
const char chaine[15]; // La valeur de la chaine est constante.

Code: Tout sélectionner
const char *msg = " Coucou "; // Le pointeur est constant, pas la valeur de la chaîne.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Emetteur 434.

Message non lude caco74 » Lun 14 Mai 2012 19:54

Merci beaucoup il semble que tout marche mais quand je l incorpore dans mon code avec la sonde de temperature j ai des probleme avec les }.

voici mon code :

Code: Tout sélectionner
#include <OneWire.h>
#include <DallasTemperature.h>
int tempC;
 char chaine[15] = { '\0' };
// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 8
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
#include <VirtualWire.h>
// Pass our oneWire reference to Dallas Temperature.

DallasTemperature sensors(&oneWire);
// arrays to hold device address
DeviceAddress insideThermometer;

void setup(void)
{
 vw_setup(2000);
 vw_set_tx_pin(3);
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

  // locate devices on the bus
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
 
  // assign address manually.  the addresses below will beed to be changed
  // to valid device addresses on your bus.  device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

  // Method 1:
  // search for devices on the bus and assign based on an index.  ideally,
  // you would do this to initially discover addresses on the bus and then
  // use those addresses and manually assign them (see above) once you know
  // the devices on your bus (and assuming they don't change).
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
 
  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices,
  // or you have already retrieved all of them.  It might be a good idea to
  // check the CRC to make sure you didn't get garbage.  The order is
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
 // printAddress(insideThermometer);
  Serial.println();

  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
  sensors.setResolution(insideThermometer, 9);
 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
 
 
 
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  Serial.print("Temp C: ");
  Serial.print(sensors.getTempC(deviceAddress));
  Serial.print(" Temp F: ");
  Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
 
 
// String temp = ((tempC), BIN);
  Serial.print(tempC);
  Serial.print ("");
  Serial.print(" Temp F: ");
  Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit
}


void loop(void)
{
  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
 // Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
 // Serial.println("DONE");
 
  // It responds almost immediately. Let's print out the data
  printTemperature(insideThermometer); // Use a simple function to print out the data

}
// function to print a device address
void printAddress(DeviceAddress deviceAddress);

{

  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
 
  char chaine[15] = { '\0' };
        //const char chaine[15];
        itoa( tempC, chaine, 10 );
        vw_send((uint8_t *)chaine, strlen(chaine)+1);
        delay(400);
       vw_wait_tx();                                          // On attend que le message complet soit envoyé.
      delay(2000);                                              // Très important sinon cela peut brouiller d'autres appareils !
      vw_rx_stop();

  }

}


je ne comprend pas trop l'erreur avec les accolades sur la fin du code.
caco74
 
Messages: 59
Inscription: Sam 7 Mai 2011 19:09

Re: Emetteur 434.

Message non lude Bemolu » Lun 14 Mai 2012 22:31

Je pense qu'il y a une toute petite erreur de syntaxe, responsable de ton erreur de compilation:
error : expected unqualified-id '{' token
Remplace:
Code: Tout sélectionner
void printAddress(DeviceAddress deviceAddress);
{ [...] }

Par
Code: Tout sélectionner
void printAddress(DeviceAddress deviceAddress)
{ [...] }

Il ne faut pas de ; à la fin de la déclaration de fonction.
Bemolu
 
Messages: 63
Inscription: Mer 8 Fév 2012 21:19

Re: Emetteur 434.

Message non lude caco74 » Mar 15 Mai 2012 00:03

Ahhh merci pour l’étourderie. une erreur qui penalise pendant beaucoup de temps.

au passage il semble que mon code complet me pose des problemes car je n entend pas d'emission du module ( transceiver calé sur la frequence en ecoute) une fois incorporé dans le code final.

La reception à l'air d'etre OK mais pas d'emission. je m'y remet demain. du coup.

Merci du coup de main car j'ai du mal à avancer.
caco74
 
Messages: 59
Inscription: Sam 7 Mai 2011 19:09

Re: Emetteur 434.

Message non lude caco74 » Mar 15 Mai 2012 12:11

tout est OK le code fonctione mais la temperature affichée au recepteur n'est pas bonne. De quoi continuer .
caco74
 
Messages: 59
Inscription: Sam 7 Mai 2011 19:09

Re: Emetteur 434.

Message non lude SesechXP » Mar 15 Mai 2012 17:56

Pour voir d'où vient exactement le problème, fixe une valeur de température dans ton code et essaye de la transmettre. Si la valeur est mauvaise à l'arrivée c'est que le problème vient de la transmission.
SesechXP
 
Messages: 228
Inscription: Sam 28 Mai 2011 09:09
Localisation: 35

Re: Emetteur 434.

Message non lude caco74 » Mar 15 Mai 2012 19:22

Alors du coup suivant les conseils j ai bloqué la variable à 23.

et je retrouve coté recepteur une valeur de 13106.

pour une valeur de 25 je trouve 13618.
caco74
 
Messages: 59
Inscription: Sam 7 Mai 2011 19:09

Re: Emetteur 434.

Message non lude caco74 » Mar 15 Mai 2012 23:06

Probleme resolu, il faut envoyer et recevoir dans le même format dans mon cas ASCII .
ces codes permettent de transmettre une temperature issue d'une sonde DALLAS DS 18B20.
A sa reception on affiche la temperature sur un Deuligne.
Voici du coup les codes qui fonctionnent
coté emetteur :

Code: Tout sélectionner
#include <OneWire.h>
#include <DallasTemperature.h>

 char chaine[15] = { '\0' };

#define ONE_WIRE_BUS 8

OneWire oneWire(ONE_WIRE_BUS);
#include <VirtualWire.h>

DallasTemperature sensors(&oneWire);

DeviceAddress insideThermometer;

void setup(void)
{
 vw_setup(2000);
 vw_set_tx_pin(3);
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");

    Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

 
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
 
 
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");
 
      Serial.print("Device 0 Address: ");
   Serial.println();

    sensors.setResolution(insideThermometer, 9);
 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
}

void printTemperature(DeviceAddress deviceAddress)
{
float tempC = sensors.getTempC(deviceAddress);
  Serial.print("Temp C: ");
  Serial.print(sensors.getTempC(deviceAddress));

 //float tempC = sensors.getTempC(deviceAddress);
  Serial.print(" Temp F: ");
  Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit
  Serial.print ("");
  //Serial.print(" Temp F: ");
Serial.println ("");


char chaine[15] = { '\0' };
       // const char chaine[15];
        itoa( tempC, chaine, 10 );
        vw_send((uint8_t *)chaine, strlen(chaine)+1);
        delay(400);
       vw_wait_tx();                                          // On attend que le message complet soit envoyé.
      delay(1000);                                              // Très important sinon cela peut brouiller d'autres appareils !
     // vw_rx_stop();

}


void loop(void)
{
 
  sensors.requestTemperatures(); // Send the command to get temperatures
 
  printTemperature(insideThermometer); // Use a simple function to print out the data

}
// function to print a device address
void printAddress(DeviceAddress deviceAddress)

{

  for (uint8_t i = 0; i < 8; i++)
  {
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
 
  //int tempC = sensors.getTempC(deviceAddress);
 // char chaine[15] = { '\0' };
 
 //      // const char chaine[15];
 //       itoa( tempC, chaine, 10 );
 //       vw_send((uint8_t *)chaine, strlen(chaine)+1);
 //       delay(400);
 //      vw_wait_tx();                                          // On attend que le message complet soit envoyé.
 //     delay(2000);                                              // Très important sinon cela peut brouiller d'autres appareils !
 //     vw_rx_stop();

  }

}


code coté recepteur.

Code: Tout sélectionner
    #include <VirtualWire.h> // Vous devez télécharger et installer la librairie VirtualWire.h dans votre dossier "/libraries" !
#include <Wire.h>
#include <Deuligne.h>

// déclaration de l'objet lcd
Deuligne lcd = Deuligne();

    void setup()
    {
      Wire.begin(); // initialisation bus I2C (obligatoire)
     lcd.init(); // initialisation lcd (obligatoire)
     lcd.clear(); // clear screen 
      Serial.begin(9600);    // On initialise "le serial monitor", j'ai laissé 9600 bauds ici car c'est la valeur par défaut mais vous pouvez la modifier. Attention à bien mettre la même valeur dans votre Serial Monitor et dans votre programme.
        vw_setup(2000);                 // Bits par seconde (vous pouvez le modifier mais cela modifiera la portée). Voir la documentation de la librairie VirtualWire.
        vw_set_rx_pin(11);             // C'est sur cette broche que l'on reliera les broches DATA du récepteur, vous pouvez changez de broche si vous le désirez.
        vw_rx_start();                    // On démarre le récepteur.
    }

    void loop()
    {
       // uint8_t buf[VW_MAX_MESSAGE_LEN];
       // uint8_t buflen = VW_MAX_MESSAGE_LEN;

       // if (vw_get_message(buf, &buflen)) // On test afin de savoir si un message est reçu.
        {
        int i;
         // Un message est reçu.

        //for (i = 0; i < buflen; i++)
        {
       //     Serial.print(buf[i]);  // On affiche le message lettre par lettre. Par exemple buf[4] sera égale à la 5ème lettre du mot envoyé (Snootlab donc "t") car on compte le zéro ici.
          //lcd.print (buf[i]); 
          }
        Serial.println(""); // On saute une ligne afin d'avoir plus de clarté.
        delay(1000);
        lcd.clear();
        lcd.print("Temp :");
       // lcd.print (buf[i]);
       
         }
   
    char chaine[15];
 uint8_t buflen = 15;
 vw_get_message((uint8_t*)chaine, &buflen);
 //Serial.prinln( chaine );
 int tempC;
 tempC = atoi( chaine );
 Serial.println( tempC );

  //  int tempC;
 //   uint8_t buflen = sizeof(tempC);
//    if (vw_get_message((uint8_t*)&tempC, &buflen)) // Non-blocking
    {
//int i;
// Message with a good checksum received, dump HEX
Serial.print("Got: ");
    Serial.println(tempC, DEC);
Serial.println("");
  lcd.print (tempC,DEC) ;
 }
    }

Merci pour les coups de mains car je m’égarais sur des chemins glacés.
caco74
 
Messages: 59
Inscription: Sam 7 Mai 2011 19:09


Retourner vers Composants tiers

Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 2 invités

cron