Go Down

Topic: (resolu)programmation module UHF (Read 3441 times) previous topic - next topic

skywodd

*Juste pour compléter ce que dit barbudor*


j ai bien compris en revanche : que je peu transmettre ma variable à condition qu'elle soit dans un format dans mon cas Binaire. et grace à String je sait convertir n'importe quel nombre en binaire.

Tu peut transmettre n'importe quoi dans la mesure ou il s'agit un tableau de uint8_t (des octets sur 8 bits).

Ce qu'il faut bien te dire c'est que binaire = donnée brute tout droit sorti de la mémoire (non lisible par un humain), et texte (string, char, etc ...) = données textuelle lisible par un humain (mais lourd a gérer pour une machine).

Exemple :
Code: [Select]
int i = 12345;
En binaire : 0x30 0x39 -> 2 octets
En texte : '1', '2', '3', '4', '5' -> 5 octets
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

caco74

Merci du temps que vous me consacrez mais j aborde un coté obscur de la programmation qui me fait defaut et je prefere bien comprendre les tenants et les emboutissants.

je pense que au fur et à mesure de mes apprentissages je puisse enfin y voir une logique flagrante.

Merci pour les bouts de code.

Petite question pendant que je vous tiens : Est ce que toute les transmissions UHF ou Xbee se font de la même sortes ?

skywodd


Petite question pendant que je vous tiens : Est ce que toute les transmissions UHF ou Xbee se font de la même sortes ?

J'ai jamais touché à tout ce qui est Xbee, Zigbee & co ...
A mon avis le principe de transmission par "paquet" est le même, par contre il doit y avoir des subtilité au niveau de la transmission (checksum, entête, etc).
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

caco74

Apres bien des deboires mon code fonctionne bel et bien.

Au niveau de la reception je recoit des données de type 13618 pour 25°C.

Je ne sais pas comment est ce format. mais il change avec la temperature et je lui demande pourtant bien de me l'afficher en DEC.

barbudor

Poste le code des 2 cotés
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

caco74

Voici le code coté emetteur un peu en brouillon dans les commentaires.

Code: [Select]
#include <OneWire.h>
#include <DallasTemperature.h>
int tempC;
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();

  }

}


et voici le code coté recepteur :

Code: [Select]
    #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]);
       
         }
   
   

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


NOTA : j utilise un lcd Deuligne pour l'affichage de la temperature.

Merci BARBUDOR pour le coup de main c'est tres sympa même si des fois tu doit t'arracher les cheveux devant les incompréhensions.



barbudor

Tu t'es un peu mélangé les pattes entre les différentes méthodes.

Soit tu envoies en binaire et tu reçois en binaire :

Code: [Select]
// emetteur
int tempC;
vw_send((uint8_t *)&tempC, sizeof(tempC));

// recepteur
int tempC;
uint8_t buflen = sizeof(tempC);
vw_get_message((uint8_t*)&tempC, &buflen);
Serial.prinln( tempC );


Soit tout en ASCII :
Code: [Select]
// emetteur
int tempC;
char chaine[15];
itoa( tempC, chaine, 10 );
vw_send((uint8_t *)chaine, strlen(chaine)+1);

// recepteur
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 );



Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

caco74

AGGRRR l'erreur de M*****.

Merci bien BARBUDOR et les autres pour les coups de mains. maintenant il ne me reste plus qu'a travailler ces codes dans tout les sens pour me familiariser avec.
et pouvoir passer du ASCII au binaire sans faire de boulettes.
La prochaine etape est la transmission de trames GPS , c'est pas gagné ....

merci encore.

Go Up