Arduino Mega 2560 http://arduino.cc/en/Main/arduinoBoardMega2560
Geïntegreerde schakelingen:
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 kabels met RJ11 connectors (stertopologie met seriële bussen, meerdere apparaten op elke bus)
Geschikt voor behandeling:
8 1-draads bussen (met behulp van dynamische klasse-exemplaren voor de bibliotheek)
256 schakelaars
256 Relais
128 temperatuursensoren (niet-parasiet modus voor snellere bus)
* Schakelaar-aan-relay verenigingen zijn vrij programmeerbaar
* Geen hoogspanning en macht draden op wandschakelaars, alleen 12V DC via UTP kabel
* Lagere surge huidige en elektromagnetische straling aangezien SSRs en uitschakelen bij nul kruising inschakelen
* Switches worden voortdurend gescand door de Arduino - dientengevolge schakelen van Relais/lampen werk onmiddellijk net als voor normale lamp wissels en kruisingen (veel domotica-systemen zijn een beetje traag, met herkenbare vertraging)
* Single 3.9 k pull-up weerstanden op de Arduino pinnen (passieve pull-up oplossing)
* PIR bewegingsmelder, lichtsensoren etc. kan worden gebruikt als Schakel apparaten eveneens (monostabiele mode met instelbare timer)
* Relais zijn AC (SSR) of DC (MOSFET) voor LED verlichting enz.
* De huidige beperking: SSR maximumstroming is 1.2a belasting moet daarom minder dan 250W (op 220V AC)
* Temperatuur sensoren leesbaar op elk gewenst moment - ze zijn "verborgen" in wandschakelaars
* De apparaatgegevens en instellingen worden opgeslagen in de EEPROM van de Arduino board - systeem werkt zelfs na een stroomstoring
* Wijzigingen zijn geprogrammeerd door seriële commando's van de PC, maar het werkt zo goed de standalone zonder een PC aangesloten
* Door het ontwerp van complexe functies die niet moet tijdkritisch worden behandeld op het niveau van de PC in plaats van de micro-controller - bijvoorbeeld activering van verwarming op basis van gemiddelde temperatuur waarden
Opdracht voorbeelden:
R4 > 1 zet lamp aangesloten op Relay4
R4:1 (reactie)
Scan Scan voor nieuwe aangesloten apparaten
Nieuwe apparaten toegevoegd (lijst met id's)
T8? Temperatuur gemeten door temperatuursensor
T8:18.7
R14? Staat voor relay
R14:1
S9 > R6 Switch9 gebonden aan Relay6
S9 > R7 Switch9 ook gebonden aan Relay7 (wandschakelaar 9 zal controle lampen (of andere belastingen) 6 en 7 van nu af aan)
Voorbeeld van de boodschap van de status:
R2:0 Verbonden met Relay2 lamp is uitgeschakeld door een van de bijbehorende schakelopties of opdracht
---
Codesecties (vereenvoudigd)
Lezing temperatuursensor:
#include OneWire.h
#include EEPROM.h
Privacy * ow; initialisatie van de waarde van de klasse
byte addr [8]; matrix voor het opslaan van de 1-wire apparaatadres
zweven celsius;
byte m; temperatuur sensor nummer (elk adres sensor maakt gebruik van 4 bytes in de EEPROM)
bus byte; Arduino pin te gebruiken (pin = bus + 1)
VOID MeasureTemp()
{
addr [0] = 40; hex28
addr[1]=EEPROM.Read(m*4); adres bytes 1-4 (belangrijke bytes) die zijn opgeslagen op deze posities
addr[2]=EEPROM.Read(1+m*4);
addr[3]=EEPROM.Read(2+m*4);
addr[4]=(EEPROM.Read(3+m*4)) & 15;
[5] addr = 0; bytes 5 advertentie 6 van de 1-wire apparaatadres zijn altijd 0
[6] addr = 0;
addr[7]=addrOneWire::crc8(addr,7); byte 7 (CRC) wordt gegenereerd uit de vorige 7 bytes
ow = nieuwe OneWire(bus+1); oprichting van een klasseninstantie
OW -> .reset();
OW -> select(addr); Selecteer temperatuursensor
OW -> write(68); Start conversie, met zener (bus kan worden gebruikt tijdens de conversie)
Delete(OW); verwijderen van klasseninstantie
}
{vertraging van de 800 ms (met timer routine) waardoor de DS18B20 berekening van de waarde van de temperatuur 12 bit}
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)) & 15;
[5] addr = 0;
[6] addr = 0;
addr[7]=addrOneWire::crc8(addr,7)
ow = nieuwe OneWire(bus+1);
OW -> reset();
OW -> select(addr);
OW -> write(190); opdracht om te lezen van de sensor
datalow = ow -> read(); lezen van de bytes 1 en 2 alleen de werkelijke temperatuur waarde
datahigh = ow -> read();
Delete(OW);
unsigned int rauwe = (datahigh << 8) | datalow; verschuiven van bits tot vorm een 12 bit waarde
Celsius = int (((zweven) rauwe / 16.0) * 10);
}
Serial.println (celsius/10); resultaat is in Celsius met een nauwkeurigheid van 0,1 graad
---
De status van de schakelaar van de lezing:
byte PIOdata;
byte k; switch ID
VOID ReadPIO()
{
OW -> 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); adres byte is altijd minder dan 15
[5] addr = 0;
[6] addr = 0;
addr[7]=OneWire::crc8(addr,7);
OW -> select(addr); Selecteer schakelaar
OW -> write(245); PIO lezen opdracht
PIOdata = ow -> read();
Als (PIOdata == 30) / / de schakelaar A is gesloten *
{
ToggleLamp(); estafette staat ondersteboven en korte vertraging toegevoegd om te voorkomen dat fladderende
}
}
* Als beide contacten open zijn is het resultaat 15
bit 0 DS2413 pin 6 (PIO A) ingangsniveau
bit 1 DS2413 pin 6 (PIO A) omgekeerd (!)-uitgangsniveau (bepaalt de transistor uitgang), 0 = transistor trekt pin op grond
bit 2 DS2413 pin 4 (PIO B) ingangsniveau
bit 3 DS2413 pin 4 (PIO B) omgekeerd uitgangsniveau
bit 4-7 omgekeerde waarden van bits 0-3
Als gevolg hiervan 15 (0000 1111) betekent zowel invoer niveaus zijn hoge (bit 0 en 2) als gevolg van de 22 kohm pullup weerstanden en beide output transistors openstaan (bit 1 en 3) zij toestaan dat de output te "zweven"
Wanneer een van de schakelaar is gesloten is pin 6 kortgesloten naar grond resulterende bits 0 tot laag wijzigen:
invoerwaarde zal veranderen van 15 (0000 1111) tot en met 30 (0001 1110)
Wanneer de schakelaar B is gesloten (terwijl de schakelaar A wordt vrijgegeven) bestaat de invoer uit 75 (0100 1011)
---
Omkeren Relay staat:
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) & 15);
[5] addr = 0;
[6] addr = 0;
addr[7]=OneWire::crc8(addr,7);
OW -> reset();
OW -> select(addr); Selecteer doorgifte,
OW -> write(245); PIO lezen opdracht
PIOdata=dv.read();
Als (PIOdata == 15) / / transistoren zijn open (= relay is open)
{
OW -> reset();
OW -> select(addr);
OW -> write(90); Commando ' write ' PIO
OW -> write(254); transistor A * inschakelen
OW -> write(1); omgekeerde byte moet ook worden geschreven voor verificatie (!)
Serial.Print("R");
Serial.Print (m);
Serial.println (": 1");
}
Als (PIOdata == 120) / / relay is gesloten
{
OW -> reset();
OW -> select(addr);
OW -> write(90); Commando ' write ' PIO
OW -> write(255); transistor A * uitschakelen
OW -> write(0); omgekeerde byte moet ook worden geschreven voor verificatie (!)
Serial.Print("R");
Serial.Print (m);
Serial.println (": 0");
}
}
* De SSR de interne LED wordt gedreven door transistor A (PIO A uitgang) van de 1-wire-switch, pin 6. Als bit 0 is ingesteld op 0 (111111 10) trekt de transistor het uitvoerniveau met GND - activeren van de LED en de SSR. Door de instelling bits 0 tot 1 (111111 11) wordt de SSR gedeactiveerd.
Uitgang B wordt niet gebruikt in mijn circuit, maar natuurlijk kan het ook geactiveerd met bit 1 (111111 01). De resterende zes bits moet altijd hoog.
Aangezien zowel schakelaars en Relais DS2413 chips gebruiken ze gedifferentieerd wanneer een nieuw apparaat wordt toegevoegd. Een routine activeert transistor A voor een korte periode. In het geval dat het externe apparaat is een relais logische zal laag worden gedetecteerd op de input van het PIO B aangezien de twee pinnen zijn aangesloten.
In uitvoering:
* Test van PIR sensoren en de toevoeging van instelbare vertraging functie in de software
-De ontwikkeling van druksensor
-De wijziging van de privacy-bibliotheek zodat parallelle werking op alle bussen (momenteel alle 1-draads opdrachten zijn sequentiële)
-De testen van 1-draads Overdrive modus
* Web based telebeheer (PHP + UDP)