Nieuwe code in deze post: T.Kreeftmeijer in "Arduino weerstation bouwen en verwerken data"
Ik gebruik nu als basis een Arduino Mega2560 R3 van Elegoo. Daarnaast heb ik nog beschikking over de 37 sensor kit en wat losse dingen (Arduino Nano).
Code gebaseerd op meegeleverde code van de Elegoo set.
Als het goed is werkt dit. Bij mij in ieder geval wel.
Ik heb een ethernet ENC28J60 module. Hoe je die moet gebruiken, lees je hier: https://www.tweaking4all....rduino-enc28j60-ethernet/
Ik heb alle code gecombineerd tot het onderstaande.
Die webpagina moeten we nog maken. Ook hier gebruik ik het voorbeeld van de slimme meter voor.
Dit draait op mijn Qnap TS453A en de database ook. Ik gebruik de interne services. De database heeft twee kolommen, een time (TIMESTAMP, autofill) en een temp (double). Die zou je vanuit de browser kunnen aanroepen op deze manier:
met hierachter de waarde, bijvoorbeeld 30.25. Dus zo:
Nu dit werkt, kan je dus verder gaan met andere metingen. Zelf merkte ik dat de Ethernetmodule niet altijd goed werkte, soms wilde hij geen verbinding maken en dat loopt alles vast. Waar dat precies aan ligt, weet ik niet, het zouden ook zomaar de daadjes kunnen zijn.
Daarnaast misschien hoe heb je het gebouwd, wat meet je en waarom? Hoe verwerk je je data?
En misschien niet geheel onbelangrijk, hoe zorg je voor betrouwbare waardes?
Verder hoop ik een beetje te kunnen doorwerken snel een werkend systeem te hebben. Hoe ik dat ga doen, weet ik nog niet.
Kortom, wordt vervolgd.
Introductie
Met deze warme dagen de Arduino dozen er maar eens bij gepakt. Ik heb al best lang het idee om een eigen weerstation te gaan bouwen. Voordat het zover is, eerst de basis. In dit topic wil ik de voortgang laten zien en de problemen en oplossingen bespreken. Uiteindelijk zal ik alle code openbaar maken, maar zover is het nog niet.Ik gebruik nu als basis een Arduino Mega2560 R3 van Elegoo. Daarnaast heb ik nog beschikking over de 37 sensor kit en wat losse dingen (Arduino Nano).
Eerste stappen
Om tot het daadwerkelijke station te komen, begin ik klein op mijn bureau met de losse componenten. Eerst het uitlezen van de sensor zelf, uitvoer op als Serial over de USB.Uitlezen sensor
Ik begin het begin en dat het uitlezen van de 18B20 sensor. Daarnaast heb ik nog wel een DHT11 of BMP280 sensor die ik gebruiken. Dat maakt ook niet bijzonder veel uit. Stukje voorbeeldcode om de 18B20 sensor uit te lezen.C++:
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
| //Include benodigde libraries #include <DallasTemperature.h> #include <OneWire.h> //Defineer pin waarop de sensor zit #define ONE_WIRE_BUS 10 //In mijn geval 10 //Activeer het oneWire protocol op deze pin OneWire oneWire(ONE_WIRE_BUS); //Geef de waardes van de oneWire door aan de DallasTemperature library, zo kan je die uitlezen. De naam is sensors. DallasTemperature sensors(&oneWire); void setup(void) { //Start serial port Serial.begin(9600); Serial.println("Dallas Temperature IC Control Library Demo"); //Start de library sensors.begin(); } void loop(void) { //Vraag alle temperaturen van sensors die aangesloten zitten. Dit komt in sensors te zitten. Serial.print("Vraag temperatuur... "); sensors.requestTemperatures(); Serial.println("KLAAR!"); //Geef temperatuur van eerste sensor weer. In dit geval de enige. Serial.print("Temperatuur van sensor 1 (index 0) is: "); Serial.println(sensors.getTempCByIndex(0)); } |
Code gebaseerd op meegeleverde code van de Elegoo set.
Als het goed is werkt dit. Bij mij in ieder geval wel.
Gegevens opslaan
Nu kan je de Arduino alleen uitlezen als je deze aan de computer hangt, dat is niet handig. Je wil juist de metingen kunnen opslaan. Hiervoor maak ik gebruik van hetzelfde systeem als @ThinkPad gebruikte voor zijn slimme meter. Die uitleg is hier te lezen: ThinkPad's Tweakblog: Uitlezen van de slimme meter P1-poort met een Arduino e...Ik heb een ethernet ENC28J60 module. Hoe je die moet gebruiken, lees je hier: https://www.tweaking4all....rduino-enc28j60-ethernet/
Ik heb alle code gecombineerd tot het onderstaande.
C++:
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
| //Include benodigde libraries #include <UIPEthernet.h> // Voor Ethernet #include <DallasTemperature.h> #include <OneWire.h> //Defineer pin waarop de sensor zit #define ONE_WIRE_BUS 10 //In mijn geval 10 //Activeer het oneWire protocol op deze pin OneWire oneWire(ONE_WIRE_BUS); //Geef de waardes van de oneWire door aan de DallasTemperature library, zo kan je die uitlezen. De naam is sensors. DallasTemperature sensors(&oneWire); // **** ETHERNET INSTELLINGEN **** byte mac[] = { 0x54, 0x44, 0x41, 0x31, 0x30, 0x36 }; IPAddress ip(10, 0, 1, 200); IPAddress server(10,0,1,15); EthernetClient client; void setup(void) { //Start serial port Serial.begin(9600); // start de Ethernet verbinding: Ethernet.begin(mac, ip); Serial.print("IP Adres: "); Serial.println(Ethernet.localIP()); Serial.print("IP Adres server: "); Serial.println(server); //Start de library Serial.println("Dallas Temperature IC Control Library Demo"); sensors.begin(); } void loop(void) { //Vraag alle temperaturen van sensors die aangesloten zitten. Dit komt in sensors te zitten. Serial.print("Vraag temperatuur... "); sensors.requestTemperatures(); Serial.println("KLAAR!"); //Geef temperatuur van eerste sensor weer. In dit geval de enige. Serial.print("Temperatuur van sensor 1 (index 0) is: "); double temp = sensors.getTempCByIndex(0); //Sla de temperatuur op Serial.println(String(temp)); //Geen de temperatuur weer over de Serial verbinding httpRequest(temp); //Stuur de temperatuur door naar de httpRequest functie. Die roept een webpagina aan en stuurt de waardes door. delay(500); //Wacht tot de volgende waarde, dit is 1.5 seconde, veel te kort dus. Om te testen wel ideaal. } //httpRequest code void httpRequest(double temp) { Serial.println("Probeer verbinding te maken."); if (client.connect(server, 8091)) { //Wanneer de verbinding gelegd kan worden, dan deze code. Serial.println("Open verbinding"); client.print("GET http://10.0.1.15:8091/?temperature="); client.print(temp); client.println(" HTTP/1.1"); client.println("Host: 10.0.1.200"); client.println("User-Agent: arduino-ethernet"); client.println("Connection: close"); client.println(); Serial.println("Einde verbinding"); //Request complete; empty recieve buffer while (client.available()) { //data available char c = client.read(); //gets byte from ethernet buffer } client.println(); } else { //Anders stoppen Serial.println("Geen verbinding mogelijk"); client.stop(); return; } } |
Die webpagina moeten we nog maken. Ook hier gebruik ik het voorbeeld van de slimme meter voor.
PHP:
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
| <?php error_reporting(E_ALL); //Connect to database $MyUsername = "temperaturelog"; // enter your username for mysql $MyPassword = "Kreeft100."; // enter your password for mysql $MyHostname = "10.0.1.15:3306"; // this is usually "localhost" unless your database resides on a different server $dbh = mysql_pconnect($MyHostname , $MyUsername, $MyPassword); $selected = mysql_select_db("temperature",$dbh); //GET variabelen naar andere variabele schrijven $temperature = $_GET["temperature"]; //GET variabelen op 'double' zetten settype($temperature, "double"); //Checken of binnengekomen temperatuur ingevuld is, dan invullen in database if ($temperature != 0) { $SQL = "INSERT INTO temperature.readings (temp) VALUES ($temperature)"; mysql_query($SQL); echo "Gelukt!"; } else { echo "Dit ging niet goed."; }?> |
Dit draait op mijn Qnap TS453A en de database ook. Ik gebruik de interne services. De database heeft twee kolommen, een time (TIMESTAMP, autofill) en een temp (double). Die zou je vanuit de browser kunnen aanroepen op deze manier:
http://10.0.1.15:8091/?temperature=
http://10.0.1.15:8091/?temperature=30.25
Nu dit werkt, kan je dus verder gaan met andere metingen. Zelf merkte ik dat de Ethernetmodule niet altijd goed werkte, soms wilde hij geen verbinding maken en dat loopt alles vast. Waar dat precies aan ligt, weet ik niet, het zouden ook zomaar de daadjes kunnen zijn.
En nu?
Ik ben benieuwd of er meer Tweakers zijn die zoiets hebben gedaan. Hoe heb je dat dan aangepakt, waar liep te tegen aan, wat deed je wel in een keer goed.Daarnaast misschien hoe heb je het gebouwd, wat meet je en waarom? Hoe verwerk je je data?
En misschien niet geheel onbelangrijk, hoe zorg je voor betrouwbare waardes?
Verder hoop ik een beetje te kunnen doorwerken snel een werkend systeem te hebben. Hoe ik dat ga doen, weet ik nog niet.
Kortom, wordt vervolgd.
13 000 Zeemijl - documentaire - Soms maakt al die keus het er niet makkelijker op.