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)


Pas de photo de profil

keviin5754

Membre

#876 | Signaler ce message


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 ! :p Merci !

Derniére modification le par keviin5754


Pas de photo de profil

weetoz

Membre

#885 | Signaler ce message


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.


Pas de photo de profil

keviin5754

Membre

#886 | Signaler ce message


Ça roule j'essayerai ça tout à l'heure merci 😅


Photo de profil de skywodd

skywodd

Membre

Membre du staff

#895 | Signaler ce message


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


Pas de photo de profil

keviin5754

Membre

#898 | Signaler ce message


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 ?


Pas de photo de profil

keviin5754

Membre

#902 | Signaler ce message


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