Arduino Mega 2560 http://arduino.cc/en/Main/arduinoBoardMega2560
Circuits intégrés :
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 câble avec connecteurs RJ11 (topologie en étoile avec bus série, plusieurs périphériques sur chaque bus)
Capable de manipulation :
8 1-wire bus (à l’aide des instances de classe dynamique pour la bibliothèque)
commutateurs de 256
Relais de 256
128 capteurs de température (mode non-parasite pour le bus plus rapide)
* Interrupteur à relay associations sont librement programmables
* Pas de haute tension et des câbles d’alimentation à interrupteurs muraux, seulement 12 v DC via câble UTP
* Plus bas contre les surtensions rayonnement actuel et électromagnétique depuis SSRs allumer et éteindre au passage par zéro
* Commutateurs sont continuellement analysés par l’Arduino - ainsi de commutation du relais/lampes travail immédiatement tout comme pour les interrupteurs de lampe normale (nombreux systèmes domotiques sont un peu lents, avec un retard reconnaissable)
* Single 3,9 résistances de pull-up k sur les broches de l’Arduino (solution passive pull-up)
* Capteurs de mouvement PIR, capteurs de lumière etc pourrait être utilisé comme interrupteur dispositifs aussi bien (mode monostable avec minuterie réglable)
* Relais sont AC (SSR) ou DC (MOSFET) pour l’éclairage etc LED.
* Courant : SSR courant maximum est 1. 2 a donc charge doit être inférieure à 250 w (à 220V AC)
* Capteurs de température lisibles en tout temps - ils sont « cachés » dans les interrupteurs muraux
* Paramètres et données appareil sont stockés dans la mémoire EEPROM de la carte Arduino - système fonctionne même après coupure de courant
* Changements sont programmés par des commandes série de PC, mais ça marche autonome aussi bien sans un PC connecté
* Par les fonctions complexes de conception qui ne sont pas temps critiques doivent être traités au niveau du PC au lieu du microcontrôleur - par exemple activation du chauffage basée sur les valeurs de température moyenne
Exemples de commandes :
R4 > 1 Allumez la lampe connectée à Relay4
R4:1 (réponse)
Recherche de balayage de nouveaux périphériques connectés
Ajouté de nouveaux périphériques (liste avec IDs)
T8 ? Température mesurée par la sonde de température
T8:18.7
R14 ? Etat du relais
R14:1
S9 > R6 Switch9 lié à Relay6
S9 > Switch9 R7 est également lié à Relay7 (interrupteur mural 9 commandera des lampes (ou autres charges) 6 et 7 par la suite)
Exemple de message d’État :
R2:0 Lampe connectée au relais 2 a été désactivée par un des interrupteurs associés ou par commande
---
Sections de code (simplifiées)
Capteur de température de lecture :
#include OneWire.h
#include EEPROM.h
OneWire * ow ; initialisation de classe value
addr octet [8] ; Tableau pour stocker l’adresse 1 fil périphérique
flotteur celsius ;
octet m ; nombre de capteur de température (chaque adresse capteur utilise 4 octets dans l’EEPROM)
octet d’autobus ; Goupille de Arduino à utiliser (broche = bus + 1)
Sub MeasureTemp()
{
addr [0] = 40 ; hex28
addr[1]=EEPROM.Read(m*4) ; adresse octets 1-4 (octets significatifs) stockée dans ces positions
addr[2]=EEPROM.Read(1+m*4) ;
addr[3]=EEPROM.Read(2+m*4) ;
addr[4]=(EEPROM.Read(3+m*4)) & 15 ;
addr [5] = 0 ; annonce octets 5 6 de l’adresse 1 fil périphérique sont toujours 0
addr [6] = 0 ;
addr[7]=addrOneWire::crc8(addr,7) ; octet 7 (CRC) est généré à partir du précédents octets 7
UX = new OneWire(bus+1) ; création d’une instance de la classe
oe -> .reset() ;
oe -> select(addr) ; Sélectionnez le capteur de température
oe -> write(68) ; lancer la conversion, avec zener (bus peut être utilisé pendant la conversion)
Delete(ow) ; supprimer de l’instance de la classe
}
{retard ms 800 (avec la routine du temporisateur) permettant le DS18B20 calcul de la valeur de température 12 bits}
Sub 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)) & 15 ;
addr [5] = 0 ;
addr [6] = 0 ;
addr[7]=addrOneWire::crc8(addr,7)
UX = new OneWire(bus+1) ;
oe -> reset() ;
oe -> select(addr) ;
oe -> write(190) ; commande pour lire le capteur
datalow = oe -> read() ; lire des octets 1 et 2 uniquement, la valeur de la température réelle
datahigh = oe -> read() ;
Delete(ow) ;
raw unsigned int = (datahigh << 8) | datalow ; décalage de bits jusqu'à forme une valeur de 12 bits
Celsius = int (((float) brut / 16,0) * 10) ;
}
Serial.println (celsius/10) ; Il en résulte en Celsius avec une précision de 0,1 degré
---
État de lecture de commutation :
octet PIOdata ;
k octets ; ID de l’interrupteur
Sub ReadPIO()
{
oe -> 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) & 15) ; octet de l’adresse est toujours inférieur à 15
addr [5] = 0 ;
addr [6] = 0 ;
addr[7]=OneWire::crc8(addr,7) ;
oe -> select(addr) ; commutateur de sélection
oe -> write(245) ; PIO lire la commande
PIOdata = oe -> read() ;
Si (PIOdata == 30) / / interrupteur A est fermé *
{
ToggleLamp() ; État de relais inversé et court délai ajouté pour empêcher les battement
}
}
* Si les deux contacts sont ouverts le résultat est 15
bit 0 DS2413 broche 6 (PIO A) niveau d’entrée
bit 1 DS2413 broche 6 (PIO A) inversé (!) niveau de sortie (sortie transistor de contrôle), 0 = transistor tire broche à la masse
bit 2 DS2413 broche 4 (PIO B) niveau d’entrée
bit 3 niveau de sortie de broche 4 PIO B inversé DS2413
bits 4 à 7 inversé les valeurs de bits 0-3
ainsi, 15 (0000 1111) signifie les deux niveaux d’entrée sont haute (bits 0 et 2) en raison des 22 kohm pullup résistances et les deux transistors de sortie sont ouverts (bits 1 et 3), ils permettent la sortie de "flotter"
Lorsqu’un interrupteur est fermé broche 6 est court-circuitée pour bit résultant de sol 0 pour passer à la basse :
valeur d’entrée passera de 15 (0000 1111) à 30 (0001 1110)
Lorsque l’interrupteur B est fermé (alors que l’interrupteur A est libéré) l’entrée est 75 (0100 1011)
---
État de relais inverseur :
Sub 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) & 15) ;
addr [5] = 0 ;
addr [6] = 0 ;
addr[7]=OneWire::crc8(addr,7) ;
oe -> reset() ;
oe -> select(addr) ; sélectionner le relais,
oe -> write(245) ; PIO lire la commande
PIOdata=dv.read() ;
Si (PIOdata == 15) / / Transistors sont ouverts (= relais est ouvert)
{
oe -> reset() ;
oe -> select(addr) ;
oe -> write(90) ; Commande "write" PIO
oe -> write(254) ; Allumez transistor A *
oe -> write(1) ; inversé octets doit être écrit aussi bien pour la vérification (!)
Serial.Print("R") ;
Serial.Print (m) ;
Serial.println (": 1") ;
}
Si (PIOdata == 120) / / relais est fermé
{
oe -> reset() ;
oe -> select(addr) ;
oe -> write(90) ; Commande "write" PIO
oe -> write(255) ; Mettez hors tension transistor A *
oe -> write(0) ; inversé octets doit être écrit aussi bien pour la vérification (!)
Serial.Print("R") ;
Serial.Print (m) ;
Serial.println (": 0") ;
}
}
* LED interne de la SSR l’est entraînée par transistor (PIO A sortie) de l’interrupteur 1 fil, broche 6. Lorsque le bit 0 est défini sur 0 (10 111111) le transistor tire le niveau de sortie à GND - activation de la LED et le SSR. En définissant le bit 0 à 1 (11 111111) la SSR est désactivé.
Sortie B n’est pas en usage dans mon circuit, mais bien sûr, il pourrait activé de la même façon avec mèche 1 (111111 01). Les bits restants six doivent être élevées tout le temps.
Puisque les commutateurs et les relais utilisent des puces de DS2413 qu'ils sont dissociés lorsqu’un nouveau périphérique est ajouté. Une routine active transistor A pendant une courte période. Dans le cas où le périphérique distant est un relais logique faible sera détectée sur l’entrée de PIO B puisque les deux broches sont connectés.
En cours :
* Test de capteurs PIR et ajout de la fonction de retard réglable dans le logiciel
Développement de capteur de pression
Modification de la bibliothèque OneWire pour permettre un fonctionnement en parallèle sur tous les autobus (actuellement 1 fil tous les commandes sont séquentielles)
* 1-wire Overdrive mode d’essai
* Web based administration à distance (PHP + UDP)