Arduino Mega 2560 http://arduino.cc/en/Main/arduinoBoardMega2560
Circuitos integrados:
Maxim DS18B20 http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf
Maxim DS2413 http://datasheets.maximintegrated.com/en/ds/DS2413.pdf
Panasonic AQH3213 http://www.panasonic-electric-works.com/peweu/en/downloads/ds_61613_en_aqh.pdf
UTP cableado con conectores RJ11 (topología de estrella con buses seriales, varios dispositivos en cada bus)
Capaz de manejar:
8 buses de 1-wire (utilizando instancias de la clase dinámica de la biblioteca)
interruptores de 256
256 relés
128 sensores de temperatura (modo no parásito para bus más rápido)
* Interruptor de relé asociaciones son libremente programables
* No hay alto voltaje y cables en los interruptores de pared, sólo 12V DC sobre cable UTP
* Menor la oleada actual y electromágnetica radiación desde SSRs encender y apagar en cero
* Interruptores se analizan continuamente por el Arduino - como resultado de la conmutación de relés/lámparas trabajo inmediatamente al igual que para los interruptores de la lámpara normal (muchos sistemas de automatización del hogar son un poco lentos, con retraso reconocible)
* Solo 3,9 resistencias de pull-up de k en los pines de Arduino (solución al pasivo de pull-up)
* Sensores de movimiento PIR, sensores de luz etc. podría ser utilizado como interruptor así como los dispositivos (monoestable con temporizador ajustable)
* Relés son CA (SSR) o DC (MOSFET) para LED iluminación etc.
* Limitación corriente: corriente máxima de SSR es de 1.2A por lo tanto carga debe ser menor de 250 w (en 220V AC)
* Sensores de temperatura legibles en cualquier momento - están "ocultas" en los interruptores de pared
* Dispositivo datos y ajustes se almacenan en la EEPROM de la placa Arduino - sistema funciona incluso después de la interrupción del suministro eléctrico
* Cambios están programados por comandos serie de la PC, sin embargo funciona standalone así sin un PC conectado
* Por funciones complejas de diseño que no crítico debe ser manejado en el nivel de PC en lugar del micro controlador - por ejemplo activación de calefacción basado en valores de temperatura promedio
Ejemplos de comandos:
R4 > 1 Encienda la lámpara conectada a Relay4
R4:1 (respuesta)
Exploración exploración de nuevos dispositivos conectados
Nuevos dispositivos de añadido (lista con IDs)
¿T8? Temperatura medida por el sensor de temperatura
T8:18.7
¿R14? Estado del Relais
R14:1
S9 > R6 Switch9 obligado a Relay6
S9 > R7 Switch9 también limitados a Relay7 (interruptor de pared 9 controlará otras cargas (o lámparas) 6 y 7 en adelante)
Ejemplo de mensaje de estado:
R2:0 Lámpara conectada al relé 2 se ha apagado por uno de los interruptores asociados o por comando
---
Secciones de código (simplificadas)
Sensor de temperatura de lectura:
#include OneWire.h
#include EEPROM.h
OneWire * ujo; inicialización del valor clase
addr Byte [8]; array para almacenar la dirección del dispositivo 1-wire
flotador de celsius;
bytes m; número de sensor de temperatura (cada dirección sensor utiliza 4 bytes en la EEPROM)
bytes de bus; Pin del Arduino a utilizar (pin = bus + 1)
void MeasureTemp()
{
addr [0] = 40; hex28
addr[1]=EEPROM.Read(m*4); Dirección 1-4 de bytes (bytes significativos) almacenado en esas posiciones
addr[2]=EEPROM.Read(1+m*4);
addr[3]=EEPROM.Read(2+m*4);
addr[4]=(EEPROM.Read(3+m*4)) y 15;
addr [5] = 0; Anuncio de bytes 5 6 de la dirección del dispositivo 1-wire son siempre 0
addr [6] = 0;
addr[7]=addrOneWire::CRC8(addr,7); byte 7 (CRC) se genera de los anteriores 7 bytes
ujo = nuevo OneWire(bus+1); creación de instancia de la clase
ujo -> .reset();
ujo -> select(addr); seleccionar el sensor de temperatura
ujo -> write(68); iniciar la conversión, con zener (bus puede utilizarse durante la conversión)
Delete(OW); cancelación de la instancia de la clase
}
{retardo de 800 ms (con rutina de temporizador) permitiendo el DS18B20 calculando el valor de temperatura de 12 bits}
void ReadTemp()
{
addr [0] = 40;
addr[1]=EEPROM.Read(m*4);
addr[2]=EEPROM.Read(1+m*4);
addr[3]=EEPROM.Read(2+m*4);
addr[4]=(EEPROM.Read(3+m*4)) y 15;
addr [5] = 0;
addr [6] = 0;
addr[7]=addrOneWire::CRC8(addr,7)
ujo = nuevo OneWire(bus+1);
ujo -> reset();
ujo -> select(addr);
ujo -> write(190); comando leer el sensor
datalow = caudal -> read(); lectura de bytes 1 y 2 solamente, el valor de la temperatura real
datahigh = caudal -> read();
Delete(OW);
unsigned int de crudo = (datahigh << 8) | datalow; desplazamiento de bits hasta forma un valor de 12 bits
Celsius = int (((float) crudo / 16.0) * 10);
}
Serial.println (c/10); resultado es en grados Celsius con una precisión de 0.1 grados
---
Estado del interruptor de lectura:
byte PIOdata;
k bytes; cambiar ID
void ReadPIO()
{
ujo -> reset();
addr [0] = 58;
addr[1]=(EEPROM.Read(2048+k*8));
addr[2]=(EEPROM.Read(2049+k*8));
addr[3]=(EEPROM.Read(2050+k*8));
addr[4]=(EEPROM.Read(2051+k*8) y 15); Dirección byte siempre es menos de 15
addr [5] = 0;
addr [6] = 0;
addr[7]=OneWire::CRC8(addr,7);
ujo -> select(addr); Selector de
ujo -> write(245); Comando de lectura de la PIO
PIOdata = caudal -> read();
Si (PIOdata == 30) / / el interruptor A está cerrado *
{
ToggleLamp(); relé de estado invertida y corto retardo añadido para evitar el aleteo
}
}
* Si ambos contactos están abiertos el resultado es 15
bit 0 DS2413 pin 6 (PIO A) nivel de entrada
bit 1 DS2413 pin 6 (PIO A) invertida (!) nivel de salida (controla el transistor de salida), 0 = transistor tira de pin a tierra
bit 2 DS2413 pin 4 (PIO B) nivel de entrada
nivel de salida de bit 3 DS2413 pin 4 (PIO B) invertida
bits 4-7 invierten valores de bits 0-3
como resultado 15 (0000 1111) significa tanto niveles de entrada son altos (bits 0 y 2) debido a las resistencias de pullup 22 kohm y dos transistores de salida están abiertos (bits 1 y 3) permiten la salida de "flotar"
Cuando se cierra el interruptor A pin 6 se pone en cortocircuito a bit resultante tierra 0 para cambiar a la baja:
valor de entrada cambia de 15 (0000 1111) a 30 (0001 1110)
Cuando el interruptor B está cerrado (mientras se suelta el interruptor A) la entrada es de 75 (0100 1011)
---
Inversión relé de estado:
void ToggleLamp()
{
addr [0] = 58;
addr[1]=(EEPROM.Read(1020+m*4));
addr[2]=(EEPROM.Read(1021+m*4));
addr[3]=(EEPROM.Read(1022+m*4));
addr[4]=(EEPROM.Read(1023+m*4) y 15);
addr [5] = 0;
addr [6] = 0;
addr[7]=OneWire::CRC8(addr,7);
ujo -> reset();
ujo -> select(addr); seleccionar relé,
ujo -> write(245); Comando de lectura de la PIO
PIOdata=dv.read();
Si (PIOdata == 15) / / transistores están abiertos (= relé está abierto)
{
ujo -> reset();
ujo -> select(addr);
ujo -> write(90); Comando de escritura PIO
ujo -> write(254); Encienda el transistor A *
ujo -> write(1); byte invertido se debe escribir así para verificación (!)
Serial.Print("R");
Serial.Print (m);
Serial.println (": 1");
}
Si (PIOdata == 120) / / se cierra el relé
{
ujo -> reset();
ujo -> select(addr);
ujo -> write(90); Comando de escritura PIO
ujo -> write(255); Apague el transistor A *
ujo -> write(0); byte invertido se debe escribir así para verificación (!)
Serial.Print("R");
Serial.Print (m);
Serial.println (": 0");
}
}
* LED interno del la SSR es conducido por el transistor A (PIO A la salida) del interruptor 1-wire, pin 6. Cuando el bit 0 se establece en 0 (111111 10) el transistor tira el nivel de salida a GND - activar el LED y la SSR. Por bit de valor 0 a 1 (11 111111) el relé se desactiva.
Salida de B no está en uso en mi circuito, sin embargo por supuesto podría activar del mismo modo con bit 1 (111111 01). El restante seis bits deben ser altos todo el tiempo.
Ya que los interruptores y relés utilizan chips de DS2413 que se distinguen cuando se agrega un nuevo dispositivo. Una rutina activa transistor A por un período corto. En caso de que el dispositivo remoto es un relé lógico bajo será detectado en la entrada B PIO ya que los dos pines están conectados.
En progreso:
* Prueba de sensores PIR y adición de la función de retardo ajustable en el software
* Desarrollo de sensor de presión
* Modificar la librería OneWire para permitir el funcionamiento en paralelo en todos los autobuses (comandos actualmente todo 1-wire son secuenciales)
* Prueba el modo Overdrive 1-wire
* Web basado en administración remota (PHP + UDP)