Yahoo refuse tous les emails du site. Si vous avez une adresse chez un autre prestataire, c'est le moment de l'utiliser
En cas de soucis, n'hésitez pas à aller faire un tour sur la page de contact en bas de page.
Topic "Capteur de température OneWire + 433 Mhz "
Flux RSS des posts récents dans ce topic ( Flux Atom)
Bonjour, Je suis en terminale STI2D, et pour projet de fin d'année, ma tâche est d'afficher la température d'un liquide, la température et l'humidité de l'air extérieur, et le pH du liquide concerné sur un écran LCD via les modules 433Mhz. Pour la température du liquide, j'utilise un DS18B20. Le programme fonctionne sur une seule carte arduino, mais je n'arrive pas à envoyer la température via le 433Mhz.Voila le code émetteur
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <OneWire.h>
#include <VirtualWire.h>
// ---------- Initialisation des variables ---------------------
// Variables propres au DS18B20
const int DS18B20_PIN=8;
const int DS18B20_ID=0x28;
// Déclaration de l'objet ds
OneWire ds(DS18B20_PIN); // on pin DS18B20_PIN (a 4.7K resistor is necessary)
// Variables générales
float DS18B20_temperature;
const int SERIAL_PORT=9600;
int message;
char Message[VW_MAX_MESSAGE_LEN];
void setup() {
vw_setup(2000); // Bits par seconde
// Initialisation du port de communication avec le PC
Serial.begin(SERIAL_PORT);
Serial.println("Initialisation du programme");
}
void loop() {
DS18B20_temperature = getTemperatureDS18b20(); // On lance la fonction d'acquisition de T°
// on affiche la T°
Serial.print("(DS18B20) =>\t temperature: ");
Serial.println(DS18B20_temperature);
}
/* --------------- Acquisition de la température ----------------------------------- */
float getTemperatureDS18b20(){
byte i;
byte data[12];
byte addr[8];
float temp =0.0;
//Il n'y a qu'un seul capteur, donc on charge l'unique adresse.
ds.search(addr);
// Cette fonction sert à surveiller si la transmission s'est bien passée
if (OneWire::crc8( addr, 7) != addr[7]) {
Serial.println("getTemperatureDS18b20 : <!> CRC is not valid! <!>");
return false;
}
// On vérifie que l'élément trouvé est bien un DS18B20
if (addr[0] != DS18B20_ID) {
Serial.println("L'équipement trouvé n'est pas un DS18B20");
return false;
}
// Demander au capteur de mémoriser la température et lui laisser 850ms pour le faire (voir datasheet)
ds.reset();
ds.select(addr);
ds.write(0x44);
delay(850);
// Demander au capteur de nous envoyer la température mémorisé
ds.reset();
ds.select(addr);
ds.write(0xBE);
// Le MOT reçu du capteur fait 9 octets, on les charge donc un par un dans le tableau data[]
for ( i = 0; i < 9; i++) {
data[i] = ds.read();
}
// Puis on converti la température (*0.0625 car la température est stockée sur 12 bits)
temp = ( (data[1] << 8) + data[0] )*0.0625;
return temp;
itoa(temp,message,10); // 10 car décimal
vw_send((uint8_t *)message, strlen(message));
vw_wait_tx(); // Wait
delay(200);
}
|
Et voila le code récepteur
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | #include <VirtualWire.h>
#include <Wire.h>
#include <rgb_lcd.h>
#include <OneWire.h>
// Variables propres au DS18B20
const int DS18B20_PIN=8;
const int DS18B20_ID=0x28;
// Déclaration de l'objet ds
OneWire ds(DS18B20_PIN); // on pin DS18B20_PIN (a 4.7K resistor is necessary)
// Variables générales
float DS18B20_temperature;
int message;
rgb_lcd lcd;
char Message[VW_MAX_MESSAGE_LEN];
void setup() {
Serial.begin(9600);
Serial.print("Go !");
lcd.begin(16, 2);
lcd.clear();
lcd.home();
lcd.setRGB(0,255,0);
delay(1000);
vw_setup(2000); // Bits par seconde
vw_rx_start();
}
void loop(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen))
{
int i;
for (i = 0; i < buflen; i++)
{
Message [i] = char(buf[i]);
}
Message[buflen] = '\0';
// Conversion du tableau de chars en int:
Temperature = atoi(Message);
Serial.println("Température ");
Serial.print(Temperature);
lcd.print("Temp. eau: ");
lcd.setCursor(2,1);
lcd.print(Temperature);
lcd.print (" Celsius");
delay(2000);
}
}
|
Pour le moment mon but est simplement de tout afficher sur le moniteur série du récepteur
En espérant enfin trouver de l'aide !
Merci !
Derniére modification le
#885 |
Salut Kevin,
tu peux commencer par rajouter ceci dans ton préprocesseur de l'émetteur:
1 | #include <Wire.h>
|
Ensuite, il y a ceci:
1 2 | // Conversion du tableau de chars en int:
Temperature = atoi(Message);
|
Skywodd à fait un article Pour l'amour du C, n'utilisez pas les fonctions atoi, atol, atof et dérivées.
#886 |
Ça roule j'essayerai ça tout à l'heure merci 😅
#895 |
Bonjour,
Le itoa()
fait mal au yeux mais ça passe.
Transmettre l'information en texte, ça c'est vraiment pas terrible.
Tu ferais mieux de transmettre l'information via une structure.
J'ai fait un tuto sur le sujet ici
#898 |
Salut Skywodd J'ai bien lu ton tuto mais il y a un commentaire que je ne comprend pas :
La variable "taille_message" doit impérativement être remise à la taille de la structure avant de pouvoir recevoir un message. Le plus simple est d'utiliser une variable locale pour ne pas avoir à réassigner la valeur à chaque début de loop()
Je comprend pas ce que c'est la taille de la structure, c'est la première fois que j'utilise la transmission de données via le 433Mhz et je n'ai jamais entendu parler de taille de structure.
Tu arriverais à m'expliquer ça simplement stp ?
#902 |
Je dois aussi envoyer la température et l'humidité extérieure grâce à un AM2302 et envoyer le pH de l'eau grâce çà un capteur de pH basique commandé par l'arduino (tous le matos sera connecté a une arduino qui sera sur un bateau au milieu d'un plan d'eau et il y aura une autre arduino connectée a un LCD qui elle sera au bord de l'eau). Je dois donc rassembler mes 3 programmes en seulement 2 programmes (un émetteur et un récepteur). Avec toutes ces données à envoyer est-ce-que ça serait pas plus approprié d'utiliser l'envoi de tableau de valeurs ? Sachant que les trois capteurs sont des capteurs numériques
Merci