Arduino Garage Controller (6 / 8 steg)
Steg 6: Arduino koden
Här är koden körs på Arduino:/*
Garage Controller
Skrivet av Aram Perez
Licensierat under GPLv2, tillgänglig på http://www.gnu.org/licenses/gpl-2.0.txt
*/
#define LOG_SERIAL
#include < SPI.h >
#include < Ethernet.h >
#include < Wire.h >
#define NO_PORTA_PINCHANGES
#define NO_PORTC_PINCHANGES
#include < PinChangeInt.h >
#define IOPORT 23 //Normal telnet port
#define NBR_OF_RELAYS 4
Garage dörren sensorer & tryckknapp
#define GARAGE_CLOSED_SENSOR 2 //Connect till NC terminal, aktiv hög
#define GARAGE_PARTIALLY_OPEN_SENSOR 3 //Connect till ingen terminal, aktiv hög
#define RELAY0 4
#define GARAGE_RELAY RELAY0 //Relay för garage door-knappen
#define RELAY1 5
#define RELAY2 6
#define RELAY3 7
#define CR ((char) 13)
#define LF ((char) 10)
Ange en MAC-adress och IP-adressen för din controller nedan.
IP-adressen kommer att bero på ditt lokala nätverk.
Gateway och undernät är valfria:
statiska byte mac [] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
statisk IP-adress ip (192, 168, 1, 170);
statisk ipadress gateway (192, 168, 1, 1);
statisk IP-adress undernät (255, 255, 255, 0);
statisk EthernetServer server(IOPORT);
statisk EthernetClient klient;
statiska char relayState [NBR_OF_RELAYS];
klass GarageDoor
{
bool closedState, partiallyOpenState;
offentlig:
GarageDoor();
void Init();
void SetClosedState(bool st) {
closedState = st;
}
void SetPartiallyOpenState(bool st) {
partiallyOpenState = st;
}
char State() const;
void PushButton();
};
statisk GarageDoor garageDoor;
Detta bör vara en privat funktion i klassen GarageDoor
dvs GarageDoor::StateChangedISR(void),
men kompilatorn ger ett fel om det är :-(
statisk void StateChangedISR(void)
{
om (PCintPort::arduinoPin == GARAGE_CLOSED_SENSOR) {
garageDoor.SetClosedState(PCintPort::pinState);
}
annat {
Ha måste varit GARAGE_PARTIALLY_OPEN_SENSOR:
garageDoor.SetPartiallyOpenState(PCintPort::pinState);
}
}
GarageDoor::GarageDoor()
{
}
void GarageDoor::Init()
{
pinMode (GARAGE_CLOSED_SENSOR, INPUT_PULLUP);
PCintPort::attachInterrupt (GARAGE_CLOSED_SENSOR & StateChangedISR, ändra);
pinMode (GARAGE_PARTIALLY_OPEN_SENSOR, INPUT_PULLUP);
PCintPort::attachInterrupt (GARAGE_PARTIALLY_OPEN_SENSOR & StateChangedISR, ändra);
closedState = digitalRead(GARAGE_CLOSED_SENSOR);
partiallyOpenState = digitalRead(GARAGE_PARTIALLY_OPEN_SENSOR);
}
void GarageDoor::PushButton()
{
digitalWrite (GARAGE_RELAY, låg);
Delay(400); Dröjsmål 4 SEK
digitalWrite (GARAGE_RELAY, hög);
}
char GarageDoor::State() const
{
om (closedState) return 'c';
tillbaka partiallyOpenState? 'p' : 'o';
}
void setup() {
#ifdef LOG_SERIAL
Serial.BEGIN(56700);
#endif
initiera Ethernetenheten
Ethernet.BEGIN (mac, ip, gateway, undernät);
börja lyssna för klienter
Server.BEGIN();
garageDoor.Init();
för (int jag = 0; jag < NBR_OF_RELAYS; i ++) {
pinMode (RELAY0 + i, matas); Zon 1
digitalWrite (RELAY0 + i, hög); Reläer användning inverterad logik, hög = Off
relayState [i] = "0"; Använda normal logik
}
om (client.connected()) {
client.flush();
}
#ifdef LOG_SERIAL
Serial.println("\r\nOK");
#endif
}
char ReadNext()
{
char ch = client.read();
#ifdef LOG_SERIAL
Serial.Print(CH);
#endif
returnera ch;
}
//
Kommandon:
// g? -returnera garage dörren nuläge
c - dörren är stängd
o - dörren är helt öppen
p - dörren är delvis öppen
GB - "push" garage door-knappen
RX? -retur relay x staten
rxy - set relay x till y (0 eller 1)
//
void loop() {
statiska char lastGarageDoorState = 'c';
char ch, rAsc;
om (! client.connected()) {
Om klienten inte är ansluten, vänta en ny klient:
kund = server.available();
}
om (client.available() > 0) {
int rNdx;
bool err = false;
samtidigt (client.available() > 0) {
växel (ReadNext()) {
fallet "g":
växel (ReadNext()) {
fallet "?":
CH = garageDoor.State();
client.Print('g');
client.println(CH);
#ifdef LOG_SERIAL
Serial.Print ("> g");
Serial.println(CH);
#endif
bryta;
fallet "b":
garageDoor.PushButton();
bryta;
standard:
ERR = sant;
}
bryta;
fallet "r":
CH = ReadNext();
Växla (ch) {
fall '1':
fallet "2":
fallet "3":
rAsc = ch;
rNdx = ch - '1';
CH = ReadNext();
Växla (ch) {
fallet "?":
CH = relayState [rNdx];
bryta;
fallet "0":
digitalWrite (RELAY1 + rNdx, hög); Inverterad logik
relayState [rNdx] = ch;
bryta;
fall '1':
digitalWrite (RELAY1 + rNdx, låg); Inverterad logik
relayState [rNdx] = ch;
bryta;
standard:
ERR = sant;
}
om (! err) {
client.Print('r');
client.Print(rAsc);
client.println(CH);
#ifdef LOG_SERIAL
Serial.Print('>');
Serial.println(CH);
#endif
}
bryta;
standard:
ERR = sant;
}
bryta;
fall CR:
fall LF:
bryta; Ignorera CR & LF
standard:
ERR = sant;
}
}
om (err) {
client.println('?');
#ifdef LOG_SERIAL
Serial.println ("> säga vad?");
#endif
}
}
CH = garageDoor.State();
om (ch! = lastGarageDoorState) {
lastGarageDoorState = ch;
client.Print('g');
client.println(CH);
#ifdef LOG_SERIAL
Serial.Print ("> g");
Serial.println(CH);
#endif
}
}