This repository has been archived on 2024-02-16. You can view files and clone it, but cannot push or open issues or pull requests.
ITSynOpen/ITS_Open_direct_2fb/ITS_Open_direct_2fb.ino
Romedius Weiss 82eef68a1c Added beeper to spaceping functionality
if the space is closed, it beeps once
if the space is open, it beeps three times

The beeper is connected to A5 and needs no PWM, only 5V to work.
2018-11-02 01:13:34 +01:00

398 lines
9.2 KiB
C++

/*
IT-Syndikat Open device Firmware for the wooden Device with two fat buttons
Network Requirements:
* Ethernet port on Router
* DHCP enabled on Router
* Unique MAC Address for Arduino
Additional Credits:
Example sketches from Arduino team, Ethernet by Adrian McEwen
Based on the Ethernet to Thingspeak exaple by Hans Scharler
*/
#include <SPI.h>
#include <Ethernet.h>
#include "APIKey.h"
#include "TimerOne.h"
byte mac[] = { 0xD4, 0xBA, 0xD9, 0x9A, 0x7C, 0x95 }; // Must be unique on local network
// Initialize Arduino Ethernet Client
EthernetClient client;
// Twitter response variables
char serverName[] = "it-syndikat.org"; // URL
String currentLine = ""; // string to hold the text from server
// Specific variables
// Status
int hsopen;
int ethernetstatus;
int ledtimer =0;
const int ledspan =100;
int pingtimer =-1;
const int pingspan =250;
int checktimer = 0;
const int checkspan =1000;
int update = 0;
//debug options
boolean debug = true;
//LED and Switch pins
const int glight = 5;
const int rlight = 6;
const int topen = 2;
const int tclose = 3;
const int beeper = A5;
void setLeds(){
if (pingtimer>=0)
{
if(hsopen){ // If space is not closed, beep three times with
//beep
if((pingtimer> 220)&&((pingtimer/5)%2 ==1)){
digitalWrite(beeper, HIGH);
}else{
digitalWrite(beeper, LOW);
}
}else{ // if closed, beep once
//beep
if((pingtimer> 240)&&((pingtimer/5)%2 ==1)){
digitalWrite(beeper, HIGH);
}else{
digitalWrite(beeper, LOW);
}
}
// blink like crazy
if((pingtimer/2)%2 ==1){
analogWrite(rlight, 255);
analogWrite(glight, 255);
}else{
analogWrite(rlight, 0);
analogWrite(glight, 0);
}
pingtimer--;
}else{
switch(ethernetstatus){
case 0:{ // ethernet fail
//blink red
if(ledtimer < (ledspan/2)){
analogWrite(rlight, 255);
}else{
analogWrite(rlight, 0);
}
analogWrite(glight, 0);
break;
}
case -1:{ // ethernet unknown
// fade green
if(ledtimer < (ledspan/2)){
analogWrite(glight, (255/(ledspan/2)*ledtimer));//fade up
}else{
analogWrite(glight, 255-(255/(ledspan/2)*(ledtimer-(ledspan/2))));//fade down
}
analogWrite(rlight, 0);
break;
}
case 1:{ // ethernet ok
switch(hsopen){
case 0:{ // closed
//red
analogWrite(rlight, 255);
analogWrite(glight, 0);
break;
}
case 1:{ // open
// green
analogWrite(rlight, 0);
analogWrite(glight, 255);
break;
}
case 2:{ // wait
// fade red and green
if(ledtimer < (ledspan/2)){
int tmp=(255/(ledspan/2)*ledtimer);
analogWrite(glight, tmp);//fade up
analogWrite(rlight, tmp);//fade up
}else{
int tmp = 255-(255/(ledspan/2)*(ledtimer-(ledspan/2)));
analogWrite(glight, tmp);//fade down
analogWrite(rlight, tmp);//fade down
}
break;
}
case -1:{ // unknown
// fade red
if(ledtimer < (ledspan/2)){
analogWrite(rlight, (255/(ledspan/2)*ledtimer));//fade up
}else{
analogWrite(rlight, 255-(255/(ledspan/2)*(ledtimer-(ledspan/2))));//fade down
}
analogWrite(glight, 0);
break;
}
}
break;
}
}
ledtimer++;
if ( ledtimer >= ledspan ) {
ledtimer = 0;
}
}
checktimer++;
if ( checktimer >= checkspan ) {
checktimer = 0;
update=1;
}
}
void setEth(int statuss){
ethernetstatus = statuss;
if(debug){
Serial.println("Setting eth ");
Serial.println(statuss);
}
setLeds();
}
void setRoom(int statuss){
hsopen= statuss;
if(debug){
Serial.print("Setting room ");
Serial.println(statuss);
}
setLeds();
}
void startEthernet()
{
client.stop();
if(debug){
Serial.println("Connecting Arduino to network...");
Serial.println();
}
setEth(-1);
delay(1000);
// Connect to network amd obtain an IP address using DHCP
if (Ethernet.begin(mac) == 0)
{
if(debug){
Serial.println("DHCP Failed, reset Arduino to try again");
Serial.println();
}
setEth(0);
}
else
{
if(debug){
Serial.println("Arduino connected to network using DHCP");
Serial.println();
}
setEth(1);
}
if(debug){
Serial.println("DONE");
Serial.println();
}
delay(1000);
}
//reads out the status returned by the server and sets the LED's appropriately.
//the mode is defied by the intended call:
void readServerStatus(int mode) {
char lastsign='0';
boolean readStatus = false;
while(client.connected()) {
if (client.available()) {
// read incoming bytes:
char inChar = client.read();
// add incoming byte to end of line:
currentLine += inChar;
if(debug){Serial.print(inChar);}
// if you get a newline, clear the line:
if (inChar == '\n') {
currentLine = "";
if(lastsign == '\n'){ // /r/n /r/n is the end of a header
readStatus= true; //start to parse the content of the line
if(debug){Serial.println("##END OF HEADER##");}
}
}
if (readStatus) {
if(currentLine.startsWith("true", 0)){
if(debug){Serial.println("");}
switch(mode){
case 0:
setRoom(1);
break;
case 1:
if(debug){Serial.println("Wink Wink");}
pingtimer = pingspan;
break;
}
// close the connection to the server:
client.stop();
return;
}
if(currentLine.startsWith("false", 0)){
if(debug){Serial.println("");}
switch(mode){
case 0:
setRoom(0);
break;
case 1:
if(debug){Serial.println("No Wink");}
break;
}
// close the connection to the server:
client.stop();
return;
}
}
if (inChar != '\r') {// removes /r so we dan test if the header end with two newlines, hacky but works.
lastsign = inChar;
}
}
}
setRoom(-1);
client.stop();
}
void TriggerServerReq(String s, int mode) {
// attempt to connect, and wait a millisecond:
if(debug){Serial.println("connecting to server... Status req");}
if (client.connect(serverName, 80)) {
if(debug){Serial.println("making HTTP request...");}
// make HTTP GET request to server:
client.println("GET "+ s +" HTTP/1.1");
client.println("HOST: it-syndikat.org");
client.println("Connection: close");
client.println();
readServerStatus(mode);
}else{
if(debug){Serial.println("Not connected...");}
}
// note the time of this connect attempt:
}
void RequestState() {
TriggerServerReq("/api/status-s.php",0);
}
// Status LED pins
void setup()
{
pinMode(glight, OUTPUT);
pinMode(rlight, OUTPUT);
pinMode(beeper, OUTPUT);
digitalWrite(beeper,LOW);
// Buttons with pullup resistor
pinMode(topen, INPUT);
pinMode(tclose, INPUT);
digitalWrite(topen,HIGH);
digitalWrite(tclose,HIGH);
// Start Serial for debugging on the Serial Monitor
if(debug){
Serial.begin(9600);
}
// Start Ethernet on Arduino
setEth(-1);
setRoom(2);
Timer1.initialize(20000); // 50 mal die Sekunde
Timer1.attachInterrupt(setLeds);
startEthernet();
delay(1000);
// Get current Status
RequestState();
}
void TriggerServerUpdate(boolean stat) {
// attempt to connect, and wait a millisecond:
if(debug){Serial.println("connecting to server... Update Req");}
if (client.connect(serverName, 80)) {
if(debug){Serial.println("making HTTP request...");}
// make HTTP GET request to server:
String s =(stat?"true":"false");
client.println("GET /api/update.php?open=" + s + "&apikey="+serverAPIKey+" HTTP/1.1");
client.println("HOST: it-syndikat.org");
client.println("Connection: close");
client.println();
readServerStatus(0);
}else{
if(debug){Serial.println("Not connected...");}
}
// note the time of this connect attempt:
}
void readButtons(){
if((digitalRead(topen)==LOW)&&(hsopen!=1)){
//startEthernet();
setRoom(2);
TriggerServerUpdate(true);
}
if((digitalRead(tclose)==LOW)&&(hsopen!=0)){
//startEthernet();
setRoom(2);
TriggerServerUpdate(false);
}
}
void RequestPing() {
TriggerServerReq("/api/ping-get.php?apikey="+pingAPIKey,1);
}
void launchUpdate(){
if(update==1){
RequestPing();
RequestState();
update = 0;
}
}
void loop()
{
readButtons();
launchUpdate();
}
//This just reads the server return and logs it to the serial
// @deprecated
void readServerReturn() {
//if(debug){Serial.println("readServerReturn ... ");}
while(client.connected()) {
if (client.available()) {
char c = client.read();
if(debug){Serial.print(c);}
}
}
if(debug){Serial.println();}
if(debug){Serial.println("disconnecting.");}
client.stop();
}