first commit
This commit is contained in:
165
Sonde433/Sonde433.ino
Executable file
165
Sonde433/Sonde433.ino
Executable file
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
* 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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user