Files
Arduino/Sonde433/Sonde433.ino
Jérôme Delacotte 7b30d6e298 first commit
2025-03-06 11:15:32 +01:00

166 lines
4.6 KiB
C++
Executable File

/*
* Code pour construction d'une sonde de temperature "maison", récupère une temperature et l'envois sur la fréquence de 433 mhz
* Fréquence : 433.92 mhz
* Protocole : Ridle (Radio Idle, protocole customisé basé sur home easy)
* Licence : CC -by -sa
* Matériel associé : Atmega 328 (+résonateur associé) + emetteur RF AM 433.92 mhz + capteur DS18B20 + led d'etat + résistance 4.7 kohms
* Auteur : Valentin CARRUESCO aka idleman (idleman@idleman.fr - http://blog.idleman.fr)
*/
#include <OneWire.h>
#include <DallasTemperature.h>
//La sonde de température DS18B20 est branchée au pin 10 de l'atmega
#define TEMPERATURE_PIN 10
//L'émetteur radio 433 mhz est branché au pin 9 de l'atmega
#define TRANSMITTER_PIN 9
//Tableaud de stockage du signal binaire à envoyer
bool bit2[26]={};
// On crée une instance de la classe oneWire pour communiquer avec le materiel on wire (dont le capteur ds18b20)
OneWire oneWire(TEMPERATURE_PIN);
//On passe la reference onewire à la classe DallasTemperature qui vas nous permettre de relever la temperature simplement
DallasTemperature sensors(&oneWire);
//Fonction lancée à l'initialisation du programme
void setup(void)
{
//On definis les logs à 9600 bauds
Serial.begin(9600);
//On initialise le capteur de temperature
sensors.begin();
//On définis le pin relié à l'emetteur en tant que sortie
pinMode(TRANSMITTER_PIN, OUTPUT);
}
//Fonction qui boucle à l'infinis
void loop(void)
{
//Lancement de la commande de récuperation de la temperature
sensors.requestTemperatures();
//Affichage de la temparature dans les logs
Serial.println(sensors.getTempCByIndex(0));
//Conversion de la temperature en binaire et stockage sur 7 bits dans le tableau bit2
itob(sensors.getTempCByIndex(0),7);
//Envois du signal radio comprenant la temperature (on l'envois 5 fois parce qu'on est pas des trompettes :p, et on veux être sûr que ça recoit bien)
int i=0;
for(i=0; i<5;i++)
{
transmit();
delayMicroseconds(666);
}
//delais de 5sc avant le prochain envois
delay(5000);
}
//Fonction de tansmission radio
void transmit()
{
// On envois 2 impulsions 1->0 avec un certain delais afin de signaler le départ du siganl( verrou de départ)
//Initialisation radio à 1
digitalWrite(TRANSMITTER_PIN, HIGH);
delayMicroseconds(275);
//Verrou 1
digitalWrite(TRANSMITTER_PIN, LOW);
delayMicroseconds(9900);
digitalWrite(TRANSMITTER_PIN, HIGH);
//Pause entre les verrous
delayMicroseconds(275);
//Verrou 2
digitalWrite(TRANSMITTER_PIN, LOW);
delayMicroseconds(2675);
// End on a high
digitalWrite(TRANSMITTER_PIN, HIGH);
//On envois les 8 bits stockés dans le tableau bit2
int i;
for(i=0; i<8;i++)
{
sendPair(bit2[i]);
}
//On envois le code de la sonde (1010 = code 10)
sendPair(true);
sendPair(false);
sendPair(true);
sendPair(false);
//On envois un verrou de fin pour signaler la fin du signal :)
digitalWrite(TRANSMITTER_PIN, HIGH);
delayMicroseconds(275);
digitalWrite(TRANSMITTER_PIN, LOW);
}
//Fonction d'envois d'un bit pure (0 ou 1)
void sendBit(boolean b) {
if (b) {
digitalWrite(TRANSMITTER_PIN, HIGH);
delayMicroseconds(310); //275 orinally, but tweaked.
digitalWrite(TRANSMITTER_PIN, LOW);
delayMicroseconds(2500); //1225 orinally, but tweaked.
}
else {
digitalWrite(TRANSMITTER_PIN, HIGH);
delayMicroseconds(310); //275 orinally, but tweaked.
digitalWrite(TRANSMITTER_PIN, LOW);
delayMicroseconds(1000); //275 orinally, but tweaked.
}
}
//Fonction d'envois d'un bit codé en manchester (0 = 01 et 1 = 10)
void sendPair(boolean b) {
if(b)
{
sendBit(true);
sendBit(false);
}
else
{
sendBit(false);
sendBit(true);
}
}
//fonction de conversion d'un nombre décimal "integer" en binaire sur "length" bits et stockage dans le tableau bit2
void itob(unsigned long integer, int length)
{
int positive;
if(integer>0){
positive = true;
Serial.println("positif ");
}else{
positive = false;
Serial.println("negatif ");
}
//needs bit2[length]
// Convert long device code into binary (stores in global bit2 array.)
for (int i=0; i<length; i++){
if ((integer / power2(length-1-i))==1){
integer-=power2(length-1-i);
bit2[i]=1;
}
else bit2[i]=0;
}
//Définit le signe (+ ou -)
if(positive){
bit2[length]=1;
}else{
bit2[length]=0;
}
}
//Calcule 2^"power"
unsigned long power2(int power){
unsigned long integer=1;
for (int i=0; i<power; i++){
integer*=2;
}
return integer;
}