
via Instagram http://ift.tt/1JYnH1D
/* =============================================================================================
CONFIGURACION PARTICULAR
============================================================================================= */
#define DEBUG_ON
#ifdef DEBUG_ON
#define debug(x) Serial.println(x)
#else
#define debug(x)
#endif
const long PERIODO_ACTUADOR = 5L * 1000L; // Cada minuto pregunta por el estado del actuador.
const long PERIODO_TEMPERATURA = 10L * 60L * 1000L; // Cada 10 minutos informa sobre la temperatura.
#define SW_TEMPERATURA 0 // Indica si queremos leer temperatura y enviarla al servidor
#define USAR_RELE // Indica si queremos que el actuador funcione con un Relé
#define USAR_IR // Indica si queremos usar códigos IR para
const int PIN_DISPOSITIVO = 8;
const int PIN_ERROR = 7;
const int ID_SENSOR_TEMPERATURA=1236;
const int ID_ACTUADOR=1235;
#define PIN_TERMOMETRO 2 // EL PIN DEL SENSOR DE TEMPERATURA
const long CODIGO_IR_OFF = 0xFFE01F; // El código para encender el aparato a controlar
const long CODIGO_IR_ON = 0xFF609F; // El código para apagar el aparato a controlar
#define PIN_IR 6
int estadoDispositivo = 0;
/* ============================================================================================= */
#ifdef USAR_IR
#include
IRsend irsend; // Parece ser que no se puede definir el PIN sino que es siempre el 5.
#endif
long milisActuador;
long milisTemperatura;
char server[]= "php-domos.rhcloud.com";
char query[]="GET /insert.php?sensor=%d&valor=%d HTTP/1.1";
char actuador[]="GET /actuador.php?id=%d HTTP/1.1";
char actuador_off[]="GET /set.php?actuador=%d&estado=OFF HTTP/1.1";
char host[]="Host: php-domos.rhcloud.com";
#define DHTTYPE DHT11
DHT dht(PIN_TERMOMETRO, DHTTYPE);
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,6);
EthernetClient clientTemperatura;
EthernetClient clientActuador;
void setup() {
Serial.begin(9600);
debug("Setup");
pinMode(PIN_DISPOSITIVO, OUTPUT);
pinMode(PIN_ERROR,OUTPUT);
apagarDispositivo();
if(SW_TEMPERATURA) {
dht.begin();
}
debug("Inicializando Ethernet.");
if(Ethernet.begin(mac)==0) {
mostrarError("Error obteniendo la IP. La ponemos fija");
Ethernet.begin(mac, ip);
}
debug(Ethernet.localIP());
delay(1000);
long time = millis();
enviarTemperatura();
milisTemperatura=time;
ponerActuadorOff();
estadoDispositivo=0;
consultarActuador();
milisActuador=time;
}
void mostrarError(char *Mensaje) {
Serial.println(Mensaje);
digitalWrite(PIN_ERROR, 1);
}
void limpiarError() {
digitalWrite(PIN_ERROR, 0);
}
void enviarTemperatura() {
if(!SW_TEMPERATURA) {
return;
}
int t = (int)dht.readTemperature();
if(!clientTemperatura.connect(server, 80)) {
mostrarError("Error conectando a temperatura");
return;
}
char aux[256];
debug("Conectado para enviar temperatura");
sprintf(aux, query, ID_SENSOR_TEMPERATURA, t);
clientTemperatura.println(aux);
clientTemperatura.println(host);
clientTemperatura.println("Connection: close");
clientTemperatura.println();
clientTemperatura.stop();
}
void ponerActuadorOff() {
debug("Poniendo el actuador en OFF");
int ret=clientActuador.connect(server, 80);
if(ret != 1) {
char aux[256];
sprintf(aux, "Error %d connect", ret);
mostrarError(aux);
return;
}
char aux[256];
debug("Conectado para leer actuador");
sprintf(aux, actuador_off, ID_ACTUADOR);
clientActuador.println(aux);
clientActuador.println(host);
clientActuador.println("Connection: close");
clientActuador.println();
delay(5000);
clientActuador.stop(); // Me da lo mismo lo que responda...
}
void consultarActuador() {
debug("Consultar actuador");
int ret=clientActuador.connect(server, 80);
if(ret != 1) {
char aux[256];
sprintf(aux, "Error %d connect", ret);
mostrarError(aux);
return;
}
char aux[256];
debug("Conectado para leer actuador");
sprintf(aux, actuador, ID_ACTUADOR);
clientActuador.println(aux);
clientActuador.println(host);
clientActuador.println("Connection: close");
clientActuador.println();
delay(100); // Esperamos un poco a ver si hay respuesta.
if(clientActuador.connected()) {
limpiarError();
leerRespuesta();
clientActuador.stop();
} else {
mostrarError("Error conectando");
}
}
void apagarDispositivo() {
#ifdef USAR_RELE
digitalWrite(PIN_DISPOSITIVO, 0);
#endif
#ifdef USAR_IR
if(estadoDispositivo==1) {
debug("Enviando OFF");
irsend.sendNEC(CODIGO_IR_ON, 32);
estadoDispositivo=0;
}
#endif
}
void encenderDispositivo() {
#ifdef USAR_RELE
digitalWrite(PIN_DISPOSITIVO, 1);
#endif
#ifdef USAR_IR
if(estadoDispositivo==0) {
debug("Enviando ON");
irsend.sendNEC(CODIGO_IR_OFF, 32);
estadoDispositivo=1;
}
#endif
}
void leerLinea(EthernetClient &client, char aux[], int max) {
int i=0;
while(client.available() && i < max) {
char c=client.read();
if(c=='\n') {
break;
} else {
aux[i++]=c;
}
}
aux[i]=0;
}
void leerRespuesta() {
debug("Leyendo respuesta...");
int intentos=0;
// Esperando a datos disponibles, un maximo de 5 segundos
for(intentos=0; intentos<500 && clientActuador.connected(); intentos++) {
if(clientActuador.available()) {
break;
}
delay(10);
}
// Leemos los datos disponibles...
for(intentos=0; intentos<100 && clientActuador.connected(); intentos++) {
if(clientActuador.available()) {
char linea[256];
leerLinea(clientActuador, linea,100);
if(!strcmp(linea,"ON")) {
debug("ON!!");
encenderDispositivo();
break;
}
if(!strcmp(linea,"OFF")) {
debug("OFF!!");
apagarDispositivo();
break;
}
}
delay(10);
}
}
void loop() {
long time=millis();
if(time > milisTemperatura + PERIODO_TEMPERATURA) {
enviarTemperatura();
milisTemperatura=time;
}
if(time > milisActuador + PERIODO_ACTUADOR) {
consultarActuador();
milisActuador=time;
}
delay(100);
}
/*
* Detector de código infrarrojo con el estándar NEC
*/
#define PIN 7
NECIRrcv ir(PIN) ;
void setup() {
Serial.begin(9600);
Serial.println("Detector de IR");
ir.begin();
}
void loop() {
unsigned long codigo;
while(ir.available()) {
codigo=ir.read();
Serial.print("Leido codigo 0x");
Serial.println(codigo, HEX);
}
}
ON-OFF : 0xED12FE01
TURBO : 0xEE11FE01
ECO : 0xEF10FE01
PROG : 0xE41BFE01
TEMP+ : 0xE51AFE01
TEMP- : 0xEC13FE01
<?php
require ("comun.php");
conectar();
$actuador=$_GET["id"];
$sql = <<<EOT
SELECT actuador.estado FROM actuador
WHERE id=$actuador
EOT;
$result=mysql_query($sql);
if(!$result) {
$error=mysql_error();
echo "???";
}
while ($row = mysql_fetch_row($result)) {
echo $row[0];
}
?>
/*
* Sensor de Temperatura que registra el valor en Internet llamando a la
* aplicación con la URL
* http://php-domos.rhcloud.com/insert.php?sensor=1236&valor=xx
*/
#include "DHT.h"
#include "SPI.h"
#include "Ethernet.h"
char server[]= "php-domos.rhcloud.com";
char query[]="GET /insert.php?sensor=1236&valor=%d HTTP/1.1";
char host[]="Host: php-domos.rhcloud.com";
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,6);
EthernetClient client;
void setup() {
Serial.begin(9600);
dht.begin();
if(Ethernet.begin(mac)==0) {
Serial.println("Error inicializando!");
Ethernet.begin(mac, ip);
}
delay(1000);
}
void loop() {
int t = (int)dht.readTemperature();
Serial.print("Leida la temperatura:");
Serial.println(t);
if(client.connect(server, 80)) {
char aux[256];
Serial.println("Conectado");
sprintf(aux, query, t);
client.println(aux);
client.println(host);
client.println("Connection: close");
client.println();
client.stop();
} else {
Serial.println("Error conectando");
}
delay(60 * 1000);
}