====== Invernadero ====== Arduino Mega y raspberry 4 ====== Arduino ====== Sensor de temperatura digital DHT11 http://www.electronicaembajadores.com/Productos/Detalle/37/SSHU004/modulo-sensor-humedad-y-temperatura---conectar-y-listo {{:informatica:arduino:sshu04.jpg?200|}} Nos tenemos que descargar dos paquetes de bibliotecas (que no librerías) de adafruit de DHT https://github.com/adafruit/DHT-sensor-library {{ :informatica:arduino:dht-sensor-library-master.zip |}} Nos bajamos también las de Adafruit_Sensor y las copiamos en el mismo directorio: https://github.com/adafruit/Adafruit_Sensor {{ :informatica:arduino:adafruit_sensor-master.zip |}} Lo copiamos en: /usr/share/arduino/libraries/DHT He tenido que modificar un fichero porque me daba este error: /usr/share/arduino/libraries/DHT/DHT.cpp: In member function ‘bool DHT::read(bool)’: /usr/share/arduino/libraries/DHT/DHT.cpp:30:3: error: ‘UINT32_MAX’ was not declared in this scope UINT32_MAX /**< Used programmatically for timeout. \ ^ Enlace con la solución: https://forums.adafruit.com/viewtopic.php?f=25&p=847615 He añadido la línea: #define UINT32_MAX 0xffffffff Casi al principio del fichero: /usr/share/arduino/libraries/DHT/DHT.cpp Queda así: #include "DHT.h" #define UINT32_MAX 0xffffffff #define MIN_INTERVAL 2000 /**< min interval value */ #define TIMEOUT En el código descomentamos DHT11 que es nuestro modelo. Está puesto el pin digital 2: #define DHTPIN 2 Queda asi // Example testing sketch for various DHT humidity/temperature sensors // Written by ladyada, public domain #include "DHT.h" #define DHTPIN 2 // what digital pin we're connected to // Uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321 //#define DHTTYPE DHT21 // DHT 21 (AM2301) // Connect pin 1 (on the left) of the sensor to +5V // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1 // to 3.3V instead of 5V! // Connect pin 2 of the sensor to whatever your DHTPIN is // Connect pin 4 (on the right) of the sensor to GROUND // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor // Initialize DHT sensor. // Note that older versions of this library took an optional third parameter to // tweak the timings for faster processors. This parameter is no longer needed // as the current DHT reading algorithm adjusts itself to work on faster procs. DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); Serial.println("DHTxx test!"); dht.begin(); } void loop() { // Wait a few seconds between measurements. delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); Serial.print("Humidity: "); Serial.print(h); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(t); Serial.print(" *C "); Serial.print(f); Serial.print(" *F\t"); Serial.print("Heat index: "); Serial.print(hic); Serial.print(" *C "); Serial.print(hif); Serial.println(" *F"); } La conexión es: ^ SENSOR ^ Arduino ^ | Cable Negro (GND) | GND | | Cable Rojo (VCC) | 5V | | Cable Blanco (NV) | SIN CONEXIÓN | | Cable Amarillo (SIG) | PIN 2 | En Tools > Board seleccionamos: Arduino Mega 2560 Seleccionamos también Tools > Serial Port Pulsamos el botón de compilar y el de upload. Si va bien, abrimos la ventana para ver los resultados, Tools > Serial Monitor (o Ctrl+Shit+M) Nos tiene que salir algo así: Temperature: 22.00°C Humidity: 36.00% Modifico el script para que tenga una salida en una línea del tipo: 36.00 22.00 Código de Arduino #include "DHT.h" #define DHTPIN 2 // what digital pin we're connected to #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup() { Serial.begin(9600); dht.begin(); } void loop() { delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor) float h = dht.readHumidity(); // Read temperature as Celsius (the default) float t = dht.readTemperature(); // Read temperature as Fahrenheit (isFahrenheit = true) float f = dht.readTemperature(true); // Check if any reads failed and exit early (to try again). if (isnan(h) || isnan(t) || isnan(f)) { Serial.println("Failed to read from DHT sensor!"); return; } // Compute heat index in Fahrenheit (the default) float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius (isFahreheit = false) float hic = dht.computeHeatIndex(t, h, false); Serial.print(h); Serial.print(" "); Serial.println(t); } Conecto arduino a la raspberry por usb y le pongo este código. Escribe en el fichero lecturas.txt una línea con la fecha, humedad y temperatura: 03/02/2021 23:30:04 43.00 13.00 Código de fichero leer.py import serial import time from time import localtime, strftime ser = serial.Serial('/dev/ttyACM0', 9600) f = open("lecturas.txt","a") x=ser.readline().split() print x[0] print x[1] f.write(strftime("%d/%m/%Y %H:%M:%S ", localtime())) f.write(x[0]) f.write(" ") f.write(x[1]) f.write("\n") f.close() Pongo en el crontab: */10 * * * * python /root/leer.py ===== Sensor humedad tierra ===== Sensor YL-38 y YL-69 https://www.taloselectronics.com/products/sensor-de-humedad-del-suelo-yl38-y-yl69 Dimensiones YL-38: 30 x 16 mm Dimensiones YL-69: 60 x 30 mm Leémos el pin analógico y normalizamos el valor de 0-1024 a 0-100 void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); } void loop() { // read the input on analog pin 0: int sensorValue = analogRead(A0); int humedad = map(sensorValue, 0,1023,100,0); Serial.println(humedad); delay(5000); } ===== Cámara ===== Con la integrada: Tomar foto raspistill -o foto.jpg Grabar vídeo raspivid -o Desktop/video.h264 ==== Camara HP por USB: ==== La cámara HP es 1280x720. -i es input, 0 es /dev/video0 fswebcam -i 0 -r 1280x720 --jpeg 85 -D 1 fswebcam.jpg Para la cámara genérica he instalado guvcview y reiniciado. La resolución es de 640x480 ==== Cámara amazon ==== streamer -f jpeg -o nueva_streamer_01.jpeg Resolución 1280x960 ===== Orange PI ===== Hacemos nmap Nmap scan report for OrangePi.home (192.168.1.133) Host is up (0.0048s latency). MAC Address: 02:42:A2:2B:D6:90 (Unknown) Usuario: root/orangepi Configuración wifi. Añadimos este fichero y reiniciamos: /etc/network/interfaces.d/wlan0 auto wlan0 iface wlan0 inet dhcp wpa-ssid wpa-psk ************ ==== Camara USB HP ==== lsusb Bus 003 Device 002: ID 03f0:a707 HP, Inc Funciona en la raspberry fswebcam -r 1280x720 --jpeg 85 -D 1 fswebcam.jpg streamer -f jpeg -o image.jpeg ====== Grafana ====== Creamos BBDD en influx curl -i -XPOST http://172.17.0.1:8087/query --data-urlencode "q=CREATE DATABASE invernadero" Si quisieramos borar la BBDD: curl -i -XPOST http://172.17.0.1:8087/query --data-urlencode "q=DROP DATABASE invernadero" Para meter datos: curl -i -XPOST 'http://172.17.0.1:8087/write?db=invernadero&precision=s' --data-binary @todos.txt El fichero todos.txt tiene este formato: invernadero,sensor=interior humedad=83.00,temperatura=12.00 1612428604 invernadero,sensor=interior humedad=83.00,temperatura=12.00 1612429204 invernadero,sensor=interior humedad=82.00,temperatura=12.00 1612429804 invernadero,sensor=interior humedad=80.00,temperatura=14.00 1612430404 invernadero,sensor=interior humedad=75.00,temperatura=15.00 1612431004 invernadero,sensor=interior humedad=73.00,temperatura=14.00 1612431604 invernadero,sensor=interior humedad=73.00,temperatura=13.00 1612432205 invernadero,sensor=interior humedad=73.00,temperatura=14.00 1612432804 Podemos consultarlos: curl -i -XPOST http://172.17.0.1:8087/query --data-urlencode "db=invernadero" --data-urlencode "q=SELECT * FROM invernadero" La gráfica la creamos así. Para que se rellene tenemos que poner en GROUP BY fill(linear) {{:informatica:arduino:grafana01.png|}}