-
Notifications
You must be signed in to change notification settings - Fork 0
/
WSNTemperatureSensor.cpp
83 lines (63 loc) · 1.66 KB
/
WSNTemperatureSensor.cpp
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 "WSNTemperatureSensor.h"
Temperature::Temperature()
{
_sensorPin = SensorTempPin;
_sensorvalue = 0;
ds = new OneWire(SensorTempPin);
};
Temperature::Temperature(uint8_t pin)
{
_sensorPin = pin;
_sensorvalue = 0;
ds = new OneWire(pin);
};
float Temperature::getTemperature()
{
return _sensorvalue;
};
uint8_t Temperature::updateTemperature(bool reset_search)
{
byte addr[8];
// addr[] : Adresse du module 1-Wire détecté
/* Reset le bus 1-Wire ci nécessaire (requis pour la lecture du premier capteur) */
if (reset_search) {
ds->reset_search();
}
/* Recherche le prochain capteur 1-Wire disponible */
if (!ds->search(addr)) {
// Pas de capteur
return NO_SENSOR_FOUND;
}
/* Vérifie que l'adresse a été correctement reçue */
if (OneWire::crc8(addr, 7) != addr[7]) {
// Adresse invalide
return INVALID_ADDRESS;
}
/* Vérifie qu'il s'agit bien d'un DS18B20 */
if (addr[0] != 0x28) {
// Mauvais type de capteur
return INVALID_SENSOR;
}
/* Reset le bus 1-Wire et sélectionne le capteur */
ds->reset();
ds->select(addr);
/* Lance une prise de mesure de température et attend la fin de la mesure */
ds->write(0x44, 1);
delay(800);
/* Reset le bus 1-Wire, sélectionne le capteur et envoie une demande de lecture du scratchpad */
ds->reset();
ds->select(addr);
ds->write(0xBE);
mesureTemperature();
return READ_OK;
};
void Temperature::mesureTemperature()
{
byte data[9];
// data[] : Données lues depuis le scratchpad
/* Lecture du scratchpad */
for (byte i = 0; i < 9; i++) {
data[i] = ds->read();
}
_sensorvalue = ((data[1] << 8) | data[0]) * 0.0625;
};