
树莓派 – 温度计和家庭网络控制
En este documento veremos los pasos a seguir para instalar sensores de temperatura en una Raspberry Pi, la creación de una BD para almacenar las temperaturas y un script que nos saque la temperatura de forma periódica. Crearemos un sitio web que nos permitirá obtener la temperatura actual así como una gráfica con el histórico de temperatura. Para rizar el rizo, al sitio web le pondremos botones que realizarán tareas como la de encender/apagar un termostato!
Lo primero será hacernos con un sensor de temperatura digital tipo el DS18B20 que en eBay lo sacamos por 1€ incluso sumergibles para el acuario, además necesitaremos una resistencia 4.7k. Podríamos incluso hacernos con un sensor de humedad también para sacar ambas gráficas =).
Lo que haremos será habilitar los módulos para usar los termómetros, instalaremos MySQL para almacenar en una BD el histórico de las gráficas de temperaturas, crearemos un script en Python para que nos llene la BD de información cada 2 minutos y para acabar instalaremos Apache y crearemos un sitio web donde podremos ver en tiempo real las temperaturas además de una gráfica con el historial. Y si enlazamos con el documento anterior donde veíamos como usar un relé con la Raspberry, podremos crear en la misma web unos botones que nos permitan encender o apagar una luz. Empecemos habilitando los módulos:
[源代码]sudo modprobe w1-gpio
sudo modprobe w1-therm[/源代码]
Para cuando botee la Raspberry que lo guarde:
[源代码]sudo vim /etc/modules
w1-gpio
w1-therm[/源代码]
Y probamos con el siguiente comando donde veremos la temperatura de cada sensor:
[源代码]cat /sys/bus/w1/devices/ID_SENSOR/w1_slave[/源代码]
Instalar MySQL, requisitos y crear BD,
Tras dejar los termómetros ya funcionando, lo siguiente será instalar MySQL y todos los requisitos para crear una BD y almacenar las temperaturas de en mi caso 2 sensores de temperatura (ambiente y acuario). La instalación de MySQL Server pedirá establecer la contraseña de ‘root’:
[源代码]sudo apt-get install python-pip
apt-get install python-mysqldb
sudo pip install requests
sudo pip install pymysql
sudo apt-get install mysql-server mysql-client php5-mysql[/源代码]
Entramos en MySQL y creamos una BD llamada ‘Temperaturas’, una tabla llamada ‘temps’ 跟 3 campos ‘temp1’, ‘temp2’ y ‘created_at’:
[源代码]mysql -u root -p
MySQL 的> CREATE DATABASE Temperaturas;
MySQL 的> USE Temperaturas;
CREATE TABLE temps (
temp1 FLOAT, temp2 FLOAT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);[/源代码]
Demonio para sacar temperatura,
Continuamos creando un script en Python que lea las temperaturas y las almacene en la BD anterior, para ello podremos utlizar el siguiente script donde modificaremos con nuestros IDs correspondientes de los sensores en ‘sensorids’, le podemos llamar ‘temperatura_demonio.py’:
[源代码]import requests
import hashlib
导入时间
sensorids = ["28-00000523e071", "28-0000052391f2"]
avgtemperatures = []
for sensor in range(莱恩(sensorids)):
temperatures = []
for polltime in range(0,3):
text = ”;
while text.split("n")[0].找到("YES") == -1:
tfile = open("/sys/bus/w1/devices/"+ sensorids[传感器] +"/w1_slave")
text = tfile.read()
tfile.close()
时间.sleep(1)
secondline = text.split("n")[1]
temperaturedata = secondline.split(" ")[9]
temperature = float(temperaturedata[2:])
temperatures.append(温度 / 1000)
avgtemperatures.append(sum(temperatures) / 浮(莱恩(temperatures)))
acuario = avgtemperatures[0]
ambiente = avgtemperatures[1]
导入 MySQLdb
db = MySQLdb.connect(“本地主机”,“根”,"CONTRASENA_DE_ROOT","Temperaturas")
游标 = db.cursor()
cursor.execute 命令("""INSERT INTO temps (temp1,temp2) 值 (%s,%s) """,(水瓶座,ambiente))
db.commit 文件()[/源代码]
Ejecutamos el script un par de veces para crear un par de registros en la BD con
[源代码]python temperatura_demonio.py[/源代码]
Y comprobamos sencillamente que la BD que tiene datos con:
[源代码]mysql -u root -p
use Temperaturas;
选择 * from temps;[/源代码]
如果一切都正确, programamos el script de Python para que se ejecute cada dos minutos, añadimos la siguiente línea en nuestro cron con ‘crontab -e’
[源代码]*/2 * * * * /usr/bin/python /home/pi/temperatura_demonio.py[/源代码]
Instalando el servidor web,
Una vez que ya tenemos un demonio que nos está capturando la temperatura en una BD, lo siguiente será poner un sitio web con Apache y poner un portal chulo con unas gráficas de JavaScript. 开始:
[源代码]sudo apt-get install apache2 php5 libapache2-mod-php5
WGET HTTP://iada.nl/en/system/files/tempmon_2_0.zip[/源代码]
Descomprimimos el ZIP en ‘/var/www/temp/’ y editaremos en ‘index.php’ todos los datos de conexión correctos, así como realizaremos algunos cambios básicos, en este ejemplo algunas palabras en alemán que trae.
[源代码]$mysqli = new mysqli("HOST", "USER", "PASSWORD", "DATABASE");
Gem laatste 24u –> 媒体
Sensor Binnen –> Acuario
Sensor Buiten –> Ambiente[/源代码]
Y este sería el aspecto de la web una vez que reiniciemos el servicio de Apache! 皮条客, 不?, accederemos al sitio http://IP_RASPBERRY/temp
Añadiendo botones adicionales al sitio web,
Si al sitio web le queremos añadir unos botones para ejecutar cualquier acción, en este ejemplo pondremos un botón para encender el termostato que tiene conectado al otro lado del relé (termostato_enciende.sh) & otro para apagarlo (termostato_apaga.sh); además otros dos botones para encender & apagar la luz del pasillo (pasillo_enciende.sh & pasillo_apaga.sh). Al final del fichero ‘index.php’, antes del fin de body añadimos:
[源代码]
<h1>Calefaccón</h1>
<form id="relay" action="remote_relay.php" method="GET">
<input type="button" id="TermostatosubmitOn" style="border:1px solid #000; 字体大小:40Px;" value="On" onClick="TermostatorelayOn()"/>
<input type="button" id="TermostatosubmitOff" style="border:1px solid #000; 字体大小:40Px;" value="Off" onClick="TermostatorelayOff()"/>
<h1>Pasillo</h1>
<input type="button" id="PasillosubmitOn" style="border:1px solid #000; 字体大小:40Px;" value="On" onClick="PasillorelayOn()"/>
<input type="button" id="PasillosubmitOff" style="border:1px solid #000; 字体大小:40Px;" value="Off" onClick="PasillorelayOff()"/>
</形式>
<?php $state = $_GET["total"]; 如果 ($state == "Termostatoon"){ exec("/home/pi/termostato_enciende.sh"); } 如果 ($state == "Termostatooff"){ exec("/home/pi/termostato_apaga.sh"); } 如果 ($state == "Pasilloon"){ exec("/home/pi/pasillo_enciende.sh"); } 如果 ($state == "Pasillooff"){ exec("/home/pi/pasillo_apaga.sh"); } ?>[/源代码]
Y editamos el script de Java que carga ‘script.js’ añadiendo las siguientes modificaciones:
[源代码]window.onload = function(){
buttonOn = document.getElementById(‘TermostatosubmitOn’);
buttonOn.onClick = TermostatorelayOn;
buttonOff = document.getElementById(‘TermostatosubmitOff’);
buttonOff.onClick = TermostatorelayOff;
buttonOff = document.getElementById(‘PasillosubmitOff’);
buttonOff.onClick = PasillorelayOff;
buttonOff = document.getElementById(‘PasillosubmitOff’);
buttonOff.onClick = PasillorelayOff;
}
function TermostatorelayOn(){
hidden = document.getElementById("total");
hidden.value = "Termostatoon";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}
function TermostatorelayOff(){
hidden = document.getElementById("total");
hidden.value = "Termostatooff";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}
function PasillorelayOn(){
hidden = document.getElementById("total");
hidden.value = "Pasilloon";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}
function PasillorelayOff(){
hidden = document.getElementById("total");
hidden.value = "Pasillooff";
form = document.getElementById("relay");
form.method = "GET";
form.action = "index.php";
form.submit();
}[/源代码]
Y este sería el resultado del sitio web desde un iPad donde veremos por un lado la temperatura actual de esos dos sensores, recordar que se pueden añadir más, o usar un sensor de humedad, 等… Y en la parte inferior podremos poner botones tan sencillos cómo estos para poder apagar o encender un relé y abrir o cerrar un circuito eléctrico! O lo que se nos ocurra, 去… para conectarnos desde fuera (互联网) a este sitio web de nuestra casa, podremos utilizar servicios gratuitos tipo DynDNS o NO-IP para saber en todo momento la IP pública que tengamos además de configurar una VPN para el acceso seguro. Así desde cualquier lugar podremos encender el termostato antes de llegar a casa, o cualquier otra necesidad que tengamos, como una alarma con una cámara…