Arduino Aquaponics: JSON Pump Controller (2 / 3 steg)
Steg 2: Arduino skiss
Arduino skiss skapar två TimerAlarms. Först kontroller reläet på en sekunders intervall och används för att växla läge. Det andra larmet anropar funktionen sync på 30 sekunders intervall.Funktionen analysera ser ut i slutet av svaret, skapar ett aJson objekt och sedan blir läget. Beroende på värdet som läge händer en av tre saker. Det första läget är Alltid på, så att reläet aktiveras. Om du använder Växla, synkroniseras de springa och tomgång gånger. Slutligen bifogas den status du vill använda pumpen i Manual .
#include < SPI.h >
#include < Ethernet.h > / / Ethernet sköld
#include < aJSON.h > / / tolka JSON. Credit: Interaktiv fråga
#include < Wire.h >
#include "RTClib.h" / / ChronoDot. Credit: Adafruit industrier
#include < Time.h >
#include < TimeAlarms.h >
RTC - ChronoDot
RTC_DS1307 RTC;
DateTime framtid;
osignerade långa växla;
osignerade långa ström;
Ethernet-Shield
byte [mac] = {0x90, 0xA2, 0xD0, 0x0D, 0xA0, 0x00};
byte [] myIP = {192, 168, 1, 15}; Avkommentera här och linje 52 om det behövs.
byte gateway [] = {192, 168, 1, 1};
char server [] = "http://www. myapsystem. appspot.com "; Ändra detta så att de matchar de program-ID du setup i steg 3
EthernetClient klient;
Gör det enkelt att ändra app namn
Sträng webapp = "http://www. myapsystem.appspot.com/ "; Ändra detta så att de matchar de program-ID du setup i steg 3
Pins
int connectedON = 8;
int connectedOFF = 9;
int pumpRelay = 23.
PumpRelay värden
String current_mode = "Manuell"; Standardläget
String pumpState = "off"; Standard-läge
int pumpRunTime = 20; Kör i 20 sekunder
int pumpIdleTime = 40; Sitta sysslolös i 40 sekunder
void setup() {
Aktivera relä första
digitalWrite (pumpRelay, hög);
Inaktivera SD-kort om man i facket
pinMode(4,OUTPUT);
digitalWrite(4,HIGH);
Starta följetong
Serial.BEGIN(9600);
Delay(1000);
Starta Ethernet
Ethernet.BEGIN(Mac);
Ethernet.BEGIN (mac, myIP);
Ethernet.BEGIN (mac, myIP, gateway);
Delay(1000);
Starta RTC
Wire.BEGIN();
RTC.begin();
IF (!. RTC.isrunning()) {
Serial.println ("RTC går inte");
}
DateTime nu = RTC.now();
DateTime sammanställt = DateTime (__DATE__, __TIME__);
om (now.unixtime() < compiled.unixtime()) {
Serial.println ("RTC är äldre än kompileringstid! Uppdatera");
RTC.adjust (DateTime (__DATE__, __TIME__));
}
Ställ in pinkodsskydd lägen
pinMode (connectedON, produktionen);
pinMode (connectedOFF, produktionen);
pinMode (pumpRelay, produktionen);
Ställ in alarm
Alarm.timerRepeat (30, sync);
Alarm.timerRepeat (1, checkRelay);
Sync();
Serial.println ("Setup komplett");
}
void loop() {
Alarm.Delay(1000);
}
void sync() {
Serial.println("syncing");
GAE (webapp + "adacs/synk? State = "+ pumpState);
Serial.println();
}
void checkRelay() {
DateTime nu = RTC.now();
Nuvarande = now.unixtime();
om (current_mode == "Växla") {
om (nuvarande < växla) {
} annat {
Bestämma vilka tillstånd att växla till
om (pumpState == "off") {
Pumpen var avstängd. Aktivera och ställa in nästa växla tid baserat på körning
digitalWrite (pumpRelay, låg);
Serial.println ("vrida pumpen");
pumpState = "on";
Uppsättning nästa växla tid
framtida = now.unixtime() + pumpRunTime;
Toggle = now.unixtime() + pumpRunTime;
} else om (pumpState == "på") {
Pumpen var på. Stänga av och sätta nästa växla tid baserat på ledig tid
digitalWrite (pumpRelay, hög);
Serial.println ("stänga pumpen");
pumpState = "off";
Uppsättning nästa växla tid
framtida = now.unixtime() + pumpIdleTime;
Toggle = now.unixtime() + pumpIdleTime;
}
displayTime();
}
}
}
void displayTime() {
DateTime nu = RTC.now();
Nuvarande = now.unixtime();
Visa aktuell tid
Serial.Print ("aktuell tid:");
Serial.Print(Now.Year(), DEC);
Serial.Print('/');
Serial.Print(Now.month(), DEC);
Serial.Print('/');
Serial.Print(Now.Day(), DEC);
Serial.Print(' ');
Serial.Print(Now.Hour(), DEC);
Serial.Print(':');
Serial.Print(Now.Minute(), DEC);
Serial.Print(':');
Serial.Print(Now.Second(), DEC);
Serial.println();
Nästa växla tid
Serial.Print ("framtid tid:");
Serial.Print(Future.Year(), DEC);
Serial.Print('/');
Serial.Print(Future.month(), DEC);
Serial.Print('/');
Serial.Print(Future.Day(), DEC);
Serial.Print(' ');
Serial.Print(Future.Hour(), DEC);
Serial.Print(':');
Serial.Print(Future.Minute(), DEC);
Serial.Print(':');
Serial.Print(Future.Second(), DEC);
Serial.println();
}
void GAE(String link) {
booleska framgång = httpRequest(link);
om (framgång == true) {
Delay(5000);
booleska currentLineIsBlank = sant;
String readString = "";
char newString [100].
samtidigt (client.connected()) {
om (client.available()) {
char c = client.read();
Serial.write(c); Dev-läge
om (c == '\n' & & currentLineIsBlank) {
While(client.Connected()) {
char f = client.read();
readString += f;
}
}
om (c == "\n") {
currentLineIsBlank = sant;
} else om (c! = '\r') {
currentLineIsBlank = false;
}
}
}
client.stop();
readString.toCharArray (newString, 100);
Det fullt JSON objektet
aJsonObject * jsonObject = aJson.parse(newString);
Få läget
aJsonObject-läge = aJson.getObjectItem (jsonObject, "Mode");
current_mode = läge -> valuestring; Konvertera läge till sträng och tilldela current_mode
Serial.println ("läge:" + current_mode);
Läget villkorligt
om (current_mode == "Alltid på") {
Aktivera pumpen
digitalWrite (pumpRelay, låg);
Uppdatera tillstånd
pumpState = "on";
} else om (current_mode == "Växla") {
Sync bearbetningstiden
aJsonObject * rt = aJson.getObjectItem (jsonObject, "RunTime");
String rString = rt -> valuestring;
pumpRunTime = rString.toInt();
Synkronisera väntetid
aJsonObject * det = aJson.getObjectItem (jsonObject, "Inaktivitet");
String iString = det -> valuestring;
pumpIdleTime = iString.toInt();
Valfri utgång
Serial.Print ("kör tid:");
Serial.Print(pumpRunTime);
Serial.println();
//
Serial.Print ("inaktiv tid:");
Serial.Print(pumpIdleTime);
Serial.println();
} else om (current_mode == "Manual") {
Sync staten
aJsonObject * st = aJson.getObjectItem (jsonObject, "Status");
pumpState = st -> valuestring;
om (pumpState == "på") {
digitalWrite (pumpRelay, låg);
} else om (pumpState == "off") {
digitalWrite (pumpRelay, hög);
} annat {
Serial.println ("okänd pump tillstånd i manuellt läge.");
}
} annat {
Serial.println ("Uknown läge hittas under sync.");
}
} annat {
Serial.println ("inte ansluten.");
}
Ta bort rotobjektet
aJson.deleteItem(jsonObject);
}
booleska httpRequest (sträng länk) {
Om det finns en anslutning
om (client.connect (server, 80)) {
client.println ("Få" + länk + "HTTP/1.0");
client.println();
Aktivera anslutna LED
digitalWrite (connectedOFF, låg);
digitalWrite (connectedON, hög);
return true;
} annat {
Du inte kunde göra anslutningen
Serial.println ("Anslutning misslyckades");
fel + = 1;
client.stop();
Aktivera anslutna LED
digitalWrite (connectedON, låg);
digitalWrite (connectedOFF, hög);
returnera false;
}
}