Stap 6: De Code van de Arduino
Hier is de code die wordt uitgevoerd op de Arduino:/*
Garage Controller
Geschreven door Aram Perez
Beschikbaar onder de GPLv2, beschikbaar op 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-poort
#define NBR_OF_RELAYS 4
Garage deur sensoren & drukknop
#define GARAGE_CLOSED_SENSOR 2 //Connect naar NC terminal, actieve hoge
#define GARAGE_PARTIALLY_OPEN_SENSOR 3 //Connect op geen terminal, actieve hoog
#define RELAY0 4
#define GARAGE_RELAY RELAY0 //Relay voor garage deur knop
#define RELAY1 5
#define RELAY2 6
#define RELAY3 7
#define CR ((char) 13)
#define LF ((char) 10)
Voer een MAC-adres en het IP-adres voor uw controller hieronder.
Het IP-adres zullen afhankelijk van uw lokale netwerk.
gateway en subnet zijn optioneel:
statische byte mac [] {} =
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
statisch IP-adres IP-adres (192, 168, 1, 170);
statische IP-adres gateway (192, 168, 1, 1);
statische IP-adres subnet (255, 255, 255, 0);
statisch EthernetServer server(IOPORT);
statische EthernetClient cliënt;
statische char relayState [NBR_OF_RELAYS];
klasse garagedeur
{
BOOL closedState, partiallyOpenState;
publiek:
GarageDoor();
VOID Init();
VOID SetClosedState(bool st) {}
closedState = st;
}
VOID SetPartiallyOpenState(bool st) {}
partiallyOpenState = st;
}
char State() const;
nietig PushButton();
};
statische garagedeur-garagedeur;
Dit moet een prive-functie in de garagedeur-klasse
dat wil zeggen GarageDoor::StateChangedISR(void),
maar de compiler geeft een fout als er :-(
static void StateChangedISR(void)
{
Als (PCintPort::arduinoPin == GARAGE_CLOSED_SENSOR) {}
garageDoor.SetClosedState(PCintPort::pinState);
}
else {}
De GARAGE_PARTIALLY_OPEN_SENSOR moet zijn:
garageDoor.SetPartiallyOpenState(PCintPort::pinState);
}
}
GarageDoor::GarageDoor()
{
}
VOID GarageDoor::Init()
{
pinMode (GARAGE_CLOSED_SENSOR, INPUT_PULLUP);
PCintPort::attachInterrupt (GARAGE_CLOSED_SENSOR, & StateChangedISR, wijzigen);
pinMode (GARAGE_PARTIALLY_OPEN_SENSOR, INPUT_PULLUP);
PCintPort::attachInterrupt (GARAGE_PARTIALLY_OPEN_SENSOR, & StateChangedISR, wijzigen);
closedState = digitalRead(GARAGE_CLOSED_SENSOR);
partiallyOpenState = digitalRead(GARAGE_PARTIALLY_OPEN_SENSOR);
}
VOID GarageDoor::PushButton()
{
digitalWrite (GARAGE_RELAY, laag);
delay(400); Vertraging.4 secs
digitalWrite (GARAGE_RELAY, hoge);
}
char GarageDoor::State() const
{
Als (closedState) terugkeer 'c';
partiallyOpenState retourneren? 'p' : 'o';
}
VOID Setup {}
#ifdef LOG_SERIAL
Serial.begin(56700);
#endif
initialiseren van het ethernet-apparaat
Ethernet.begin (mac, IP-gateway, subnet);
beginnen met luisteren voor clients
server.begin();
garageDoor.Init();
for (int i = 0; ik < NBR_OF_RELAYS; i ++) {}
pinMode (RELAY0 + i, OUTPUT); Zone 1
digitalWrite (RELAY0 + i, hoge); Relais gebruik omgekeerde logica, hoog = Off
relayState [i] = '0'; Gebruik normaal logica
}
Als (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
retourneren van ch;
}
//
Commando's:
// g? -huidige garage deur status opvragen
c - deur is gesloten
o - deur is volledig open
p - deur is gedeeltelijk open
GB - "push" garage deur knop
RX? -terugkeer relay x staat
rxy - set relay x naar y (0 of 1)
//
void loop {}
statische char lastGarageDoorState = 'c';
char ch, rAsc;
Als (! client.connected()) {}
Als de client niet is verbonden, wachten op een nieuwe klant:
klant = server.available();
}
Als (client.available() > 0) {}
int rNdx;
BOOL err = false;
terwijl (client.available() > 0) {}
schakelaar (ReadNext()) {}
Case 'g':
schakelaar (ReadNext()) {}
geval '?':
CH = garageDoor.State();
client.Print('g');
client.println(CH);
#ifdef LOG_SERIAL
Serial.Print ("> g");
Serial.println(CH);
#endif
breken;
Case "b":
garageDoor.PushButton();
breken;
standaard:
Err = true;
}
breken;
Case 'r':
CH = ReadNext();
schakelaar (ch) {}
Case '1':
Case '2':
Case '3':
rAsc = ch;
rNdx = ch - '1';
CH = ReadNext();
schakelaar (ch) {}
geval '?':
CH = relayState [rNdx];
breken;
Case '0':
digitalWrite (RELAY1 + rNdx, hoge); Omgekeerde logica
relayState [rNdx] = ch;
breken;
Case '1':
digitalWrite (RELAY1 + rNdx, laag); Omgekeerde logica
relayState [rNdx] = ch;
breken;
standaard:
Err = true;
}
Als (! err) {}
client.Print('r');
client.Print(rAsc);
client.println(CH);
#ifdef LOG_SERIAL
Serial.Print('>');
Serial.println(CH);
#endif
}
breken;
standaard:
Err = true;
}
breken;
Case CR:
Case LF:
breken; Negeren CR & LF
standaard:
Err = true;
}
}
Als (err) {}
client.println('?');
#ifdef LOG_SERIAL
Serial.println ("> zeggen wat?");
#endif
}
}
CH = garageDoor.State();
Als (ch! = lastGarageDoorState) {}
lastGarageDoorState = ch;
client.Print('g');
client.println(CH);
#ifdef LOG_SERIAL
Serial.Print ("> g");
Serial.println(CH);
#endif
}
}