-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathReduinoRadio.ino
266 lines (229 loc) · 7.27 KB
/
ReduinoRadio.ino
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
#include <EEPROM.h>
#include <OneWire.h> // Inclusion de la librairie OneWire
#define DS18B20 0x28 // Adresse 1-Wire du DS18B20
#define BROCHE_ONEWIRE 49 // Broche utilisée pour le bus 1-Wire
#define reserve A0// broche analogique 0 = niveau reserve eau osmosé
OneWire ds(BROCHE_ONEWIRE); // Création de l'objet OneWire ds
int pinLed = 13;
int pinEmetteur = 12;
long codeKit = 1001; // Code de notre couple arduino + sonde dans notre systeme radio
int BytesTypeTemp[] = {1, 0, 1, 0}; // Code du type de transmission, ici 10 pour émission d'une temperature, exprimé en binaire
int BytesTypeNiv[] = {1, 0, 1, 1}; // Code du type de transmission, ici 11 pour émission du niveau, exprimé en binaire
int Bytes[14]; //Message binaire à envoyer
int BytesData[14]; //Temperature
int BytesNiveau[14]; //Niveau
// Servent à transformer des données numériques en tableaux de bits
void itob(unsigned long integer, int length)
{
for (int i = 0; i < length; i++) {
if ((integer / power2(length - 1 - i)) == 1) {
integer -= power2(length - 1 - i);
Bytes[i] = 1;
}
else Bytes[i] = 0;
}
}
// Sert à transformer des données numériques de la temperature en tableaux de bits
void itobTemperature(unsigned long integer, int length)
{
for (int i = 0; i < length; i++) {
if ((integer / power2(length - 1 - i)) == 1) {
integer -= power2(length - 1 - i);
BytesData[i] = 1;
}
else BytesData[i] = 0;
}
}
// Sert à transformer des données numériques du niveau en tableaux de bits
void itobNiveau(unsigned long integer, int length)
{
for (int i = 0; i < length; i++) {
if ((integer / power2(length - 1 - i)) == 1) {
integer -= power2(length - 1 - i);
BytesNiveau[i] = 1;
}
else BytesNiveau[i] = 0;
}
}
unsigned long power2(int power) { //gives 2 to the (power)
unsigned long integer = 1;
for (int i = 0; i < power; i++) {
integer *= 2;
}
return integer;
}
/**
* Crée notre signal sous forme binaire
**/
void buildSignal()
{
Serial.println(codeKit);
// Converti les codes respectifs pour le signal en binaire
itob(codeKit, 14);
for (int j = 0; j < 14; j++) {
Serial.print(Bytes[j]);
}
Serial.println();
}
//Envoie d'une paire de pulsation radio qui definissent 1 bit réel : 0 =01 et 1 =10
//c'est le codage de manchester qui necessite ce petit bouzin, ceci permet entre autres de dissocier les données des parasites
void sendPair(bool b) {
if (b)
{
sendBit(true);
sendBit(false);
}
else
{
sendBit(false);
sendBit(true);
}
}
//Envois d'une pulsation (passage de l'etat haut a l'etat bas)
//1 = 310µs haut puis 1340µs bas
//0 = 310µs haut puis 310µs bas
void sendBit(bool b) {
if (b) {
Serial.print('1');
digitalWrite(pinEmetteur, HIGH);
delayMicroseconds(310); //275 orinally, but tweaked.
digitalWrite(pinEmetteur, LOW);
delayMicroseconds(1340); //1225 orinally, but tweaked.
}
else {
Serial.print(0);
digitalWrite(pinEmetteur, HIGH);
delayMicroseconds(310); //275 orinally, but tweaked.
digitalWrite(pinEmetteur, LOW);
delayMicroseconds(310); //275 orinally, but tweaked.
}
}
/**
* Transmit Temperature
* @param boolean positive temperature negative ou positive
* @param int temperature temperature en centièmes de degrés 2015 = 20,15°C
**/
void transmitTemp(boolean positive, int temperature)
{
int i;
itobTemperature(temperature, 14);
digitalWrite(pinLed, HIGH);
// Sequence de verrou anoncant le départ du signal au recepeteur
digitalWrite(pinEmetteur, HIGH);
delayMicroseconds(275); // un bit de bruit avant de commencer pour remettre les delais du recepteur a 0
digitalWrite(pinEmetteur, LOW);
delayMicroseconds(9900); // premier verrou de 9900µs
digitalWrite(pinEmetteur, HIGH); // high again
delayMicroseconds(275); // attente de 275µs entre les deux verrous
digitalWrite(pinEmetteur, LOW); // second verrou de 2675µs
delayMicroseconds(2500);
digitalWrite(pinEmetteur, HIGH); // On reviens en état haut pour bien couper les verrous des données
// Envoie du code du kit en binaire
for (i = 0; i < 14; i++)
{
sendPair(Bytes[i]);
}
// Envoie du code de type de transmission
for (int j = 0; j < 4; j++)
{
sendPair(BytesTypeTemp[j]);
}
// Envoie du type de la temperature (negative ou positive)
// Envoie du bit définissant si c'est une commande de groupe ou non (26em bit)
sendPair(positive);
// Envoie de la temperature
for (int j = 0; j < 14; j++)
{
sendPair(BytesData[j]);
}
// Sequence de verrou finale
digitalWrite(pinEmetteur, HIGH);
delayMicroseconds(275); // un bit de bruit avant de commencer pour remettre les delais du recepteur a 0
digitalWrite(pinEmetteur, LOW);
digitalWrite(pinLed, LOW);
}
/*
**
* Transmit Niveau
* @param boolean positive temperature negative ou positive ( a corriger)
* @param int niveau. C'est la valeur analogique du niveau
**/
void transmitNiv(boolean positive, int niveau)
{
int i;
itobNiveau(niveau, 14);
digitalWrite(pinLed, HIGH);
// Sequence de verrou anoncant le départ du signal au recepeteur
digitalWrite(pinEmetteur, HIGH);
delayMicroseconds(275); // un bit de bruit avant de commencer pour remettre les delais du recepteur a 0
digitalWrite(pinEmetteur, LOW);
delayMicroseconds(9900); // premier verrou de 9900µs
digitalWrite(pinEmetteur, HIGH); // high again
delayMicroseconds(275); // attente de 275µs entre les deux verrous
digitalWrite(pinEmetteur, LOW); // second verrou de 2675µs
delayMicroseconds(2500);
digitalWrite(pinEmetteur, HIGH); // On reviens en état haut pour bien couper les verrous des données
// Envoie du code du kit en binaire
for (i = 0; i < 14; i++)
{
sendPair(Bytes[i]);
}
// Envoie du code de type de transmission
for (int j = 0; j < 4; j++)
{
sendPair(BytesTypeNiv[j]);
}
// Envoie du type de la temperature (negative ou positive)
// Envoie du bit définissant si c'est une commande de groupe ou non (26em bit)
sendPair(positive);
// Envoie de la temperature
for (int j = 0; j < 14; j++)
{
sendPair(BytesNiveau[j]);
}
// Sequence de verrou finale
digitalWrite(pinEmetteur, HIGH);
delayMicroseconds(275); // un bit de bruit avant de commencer pour remettre les delais du recepteur a 0
digitalWrite(pinEmetteur, LOW);
digitalWrite(pinLed, LOW);
}
void setup()
{
pinMode(pinEmetteur, OUTPUT);
pinMode(pinLed, OUTPUT);
Serial.begin(9600);
Serial.println("setup");
digitalWrite(pinLed, HIGH);
buildSignal();
digitalWrite(pinLed, LOW);
}
void loop()
{
float temp;
Serial.println("in loop");
// Lit la température ambiante à ~1Hz
if (getTemperature(&temp)) {
// Affiche la température
Serial.print("Temperature : ");
Serial.print(temp);
Serial.write(176); // caractère °
Serial.write('C');
Serial.println();
temp = temp * 100;
int tempInt = (int) temp;
Serial.println(tempInt);
transmitTemp(true, tempInt);
}
delay (6000);
float niv;
if (getNiveau(&niv)) {
// Affiche le niveau
Serial.print("Niveau eau : ");
Serial.print(niv);
Serial.println();
int nivInt = (int) niv;
Serial.println(nivInt);
transmitNiv(true, nivInt);
}
delay(6000);
}