Det hele samles i en web-server med en mariadb database.
Først oprettes en database med:
CREATE DATABASE arduinovejr;
CREATE USER 'vejr'@'localhost' IDENTIFIED BY '_DITPASSWORD_';
GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT ON arduinovejr.* TO 'vejr'@'localhost';
FLUSH PRIVILEGES;
USE arduinovejr;
CREATE TABLE vejrdata ( tid DATETIME, temp_inde FLOAT(6,2), temp_ud FLOAT(6,2), tryk FLOAT(6,2), temp_cpu FLOAT(6,2), humid FLOAT(6,2), regn1min FLOAT(6,2), regn5min FLOAT(6,2), temp_1 FLOAT(6,2), temp2 FLOAT(6,2), temp3 FLOAT(6,2) );
Databasen burde nu være klar til brug.
For at hente data til databasen har jeg lavet et lille python script. Python skal være version 3.11 eller derover.
#!/usr/bin/python3.11
import serial
import time
from datetime import datetime
import re
import mysql.connector as mysql
# Setup serial
tty = serial.Serial(port='/dev/ttyUSB0', baudrate=9600, timeout=1)
# Setup mysql connection
vejrDB = mysql.connect(
host = "localhost",
user = "vejr",
password = "DITPASSWORD",
database = "arduinovejr")
def speakToArduino(txt):
tty.write(bytes(txt, 'utf-8'))
time.sleep(0.05)
data = tty.readline().decode('utf-8').rstrip()
return data
time.sleep(2)
svar = "na"
while not (re.search(r'[0-9\.:\?]+', svar)):
svar = speakToArduino('\n')
time.sleep(0.1)
svar = speakToArduino('getPress')
#print("Lufttryk : %8s"%svar)
tryk = svar
svar = speakToArduino('getTempIn')
#print("Temperatur cpu : %8s"%svar)
tempCpu = svar
svar = speakToArduino('getTempOut')
#print("Temperatur ude : %8s"%svar)
tempUd = svar
svar = speakToArduino('getOutHumidity')
#print("Luftfugtighed ude: %8s"%svar)
humid = svar
svar = speakToArduino('getrain5')
#print("5 minuters regn : %8s"%svar)
rain5 = svar
svar = speakToArduino('getrain1')
#print("1 minuters regn : %8s"%svar)
rain1 = svar
vejrCursor = vejrDB.cursor()
now = datetime.now()
tid = now.strftime('%Y-%m-%d %H:%M:%S')
sql = "INSERT INTO vejrdata (tid, temp_cpu, tryk, temp_ud, humid, regn5min, regn1min ) VALUES (%s, %s, %s, %s, %s, %s, %s)"
val = (str(tid), str(tempCpu), str(tryk), str(tempUd), str(humid), str(rain5), str(rain1))
vejrCursor.execute(sql, val)
vejrDB.commit()
Husk DTR skal være klippet i FTDI kablet, da arduinoen ellers resetter hver gang programmet køres. Brugeren der kører scriptet, skal også være i dialout gruppen. Gøres med: ‘sudo usermod -a -G dialout exampleusername’.
Jeg kører scriptet i crontab:
* * * * * /home/BRUGER/arduinoVejr/getWeather
Dernæst skal der laves et lille php script for at displayenheden kan hente data:
<?php
header("Access-Control-Allow-Origin: *");
header("Content-Type: application/json; charset=UTF-8");
error_reporting(0);
# Hent logindata til databasen.
# Disse ligger ikke i web-serverens datapath og kan derfor ikke hentes af andet
# skriptet.
include('/home/BRUGER/vejrgraf/dbinfo.php');
$conn = new mysqli("localhost", $dbuser, $dbpasswd, $dbname);
#$result = $conn->query("SELECT systtamp, t_out, rho, ws, dir0, wc, r1h, r24h FROM vejrlog ORDER BY systtamp DESC LIMIT 1");
$result = $conn->query("SELECT tid, temp_ud, tryk, humid FROM vejrdata ORDER BY tid DESC LIMIT 1");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
$tid = $rs["tid"];
$temp_ud = $rs["temp_ud"];
$humid = $rs["humid"];
$tryk = $rs["tryk"];
}
# Hent summerede data
# find 24 timer regn
#
$result = $conn->query("SELECT SUM(regn1min) AS r24timer FROM vejrdata WHERE tid >= NOW() - INTERVAL 1 DAY;");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
$r24timer = $rs["r24timer"];
}
# find 1 time regn
#
$result = $conn->query("SELECT SUM(regn1min) AS r1timer FROM vejrdata WHERE tid >= NOW() - INTERVAL 1 HOUR;");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
$r1timer = $rs["r1timer"];
}
# find 15 min regn
#
$result = $conn->query("SELECT SUM(regn1min) AS r15min from vejrdata where tid >= NOW() - INTERVAL 15 MINUTE;");
while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
$r15min = $rs["r15min"];
}
$outp = "";
#while ( $rs = $result->fetch_array(MYSQLI_ASSOC) ) {
$outp .= '{"systid":"' . $tid . '",';
$outp .= '"tempout":' . $temp_ud . ',';
$outp .= '"rhout":' . $humid . ',';
$outp .= '"tryk":' . $tryk . ',';
$outp .= '"r1hour":' . $r1timer . ',';
$outp .= '"r24hour":' . $r24timer . ',';
$outp .= '"r15min":' . $r15min . '}';
#}
$conn->close();
echo ($outp);
?>
Logindata filen:
<?php
$dbname = "arduinovejr";
$dbuser = "vejr";
$dbpasswd = "DITPASSWORD";
?>
Min webserver er en apache i et temmelig standard setup.
Har du spørgsmål, så skriv endelig på tcj snabel_a tomas.dk