Photobioreaktor Code-Dokumentation
Das ist die Dokumentation des Arduino-Codes der den Photobioreaktor steuert. Die Dokumentation enthält auf der linken Seite den vollständigen Code und rechts eine zugehörige Beschreibung des jeweiligen Code-Abschnittes. Einige der Beschreibungen lassen sich durch Anklicken aufklappen, um noch detailliertere Informationen zu erhalten.
Die ArduinoIDE welche zum Hochladen des Codes auf den ESP32 benötigt wird, kann hier heruntergeladen werden.
Die Arduino-Webseite bietet ein Glossar zur Programmiersprache in der Arduino-Programme geschrieben werden. Hier werden alle Funktionen, Variablen und Strukturbefehle die ein Arduino-Programm enthalten kann ausführlich erklärt: Arduino-Glossar
#include <Arduino.h>
|
||
#include <ArduinoJson.h>
#include <ArduinoJson.hpp>
|
||
#include <Wire.h>
|
||
#include <WiFiManager.h>
WiFiManager wfm;
|
||
#include <WiFi.h>
|
||
#include <InfluxDbClient.h>
|
||
#include <InfluxDbCloud.h>
|
||
#include <HTTPClient.h>
HTTPClient http;
|
||
#include <Preferences.h>
Preferences pref
|
||
#include <ezTime.h>
Timezone myTZ
|
||
//Photobioreactor Library
|
||
#include <Photobioreactor.h>
Photobioreactor pb
|
||
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
#define SERIAL SerialUSB
#else
#define SERIAL Serial
#endif
|
||
//TEMP
|
||
#include <OneWire.h>
#include <DallasTemperature.h>
|
||
//Define InfluxDB |
||
#include "Config.h" //You can change your InfluxDB Instance here
|
||
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert);
Point sensor("SampleData");
|
||
//TDS |
||
const int tdsSensorPin = 35;
const int VREF = 3.3; // analog reference voltage(Volt) of the ADC
int analogBuffer[0]; // store the analog value in the array, read from ADC
|
||
//Relay
const int heatPin = 14;
const int stirrerPin = 13;
const int lightPin = 12;
|
||
//Water Level I2C
const int I2C_SDA_PIN = 27;
const int I2C_SCL_PIN = 25;
int lowData[8] = {0};
int highData[12] = {0};
const byte NO_TOUCH = 0xFE;
const int THRESHOLD = 100;
const int ATTINY1_HIGH_ADDR = 0x78;
const int ATTINY2_LOW_ADDR = 0x77;
const int statusLED = 33;
int reconnectAttempt = 0;
|
||
//TEMP
#define ONE_WIRE_BUS 32
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
|
||
//Trigger for Reset
const int RESET_TRIGGER = 26;
int buttonState = 0;
int lastButtonState = 0;
int startPressed = 0;
int endPressed = 0;
int holdTime = 0;
int idleTime = 0;
|
||
//Time Intervall for Data Transfer
bool dataSent = false;
int previousMinute = -1;
|
||
//HalfHourly Time Sync
unsigned long previousMillisSync = 0;
unsigned long previousMillisPrint = 0;
const unsigned long intervalSync = 1800000;
const unsigned long intervalPrint = 60000;
|
||
// Box für Zieltemperatur
WiFiManagerParameter("MaxTemp_Text", "Maximale Temperatur", "32", 2);
// Box für Minimaltemperatur
WiFiManagerParameter("MinTemp_Text", "Minimale Temperatur", "25", 2);
// Box für Abstand zwischen Rühren
WiFiManagerParameter("IntervalStirrer_Text", "Zeit zwischen den Rührvorgängen in Minuten", "30", 4);
// Box für Rührdauer>
WiFiManagerParameter("DurationStirrer_Text", "Dauer eines Rührvorgangs in Minuten", "1", 4);
// Box für Licht an
WiFiManagerParameter("LightOn_Text", "Uhrzeit (0-23) zum anschalten des Lichts", "8", 2);
// Box für Licht aus
WiFiManagerParameter("LightOff_Text", "Uhrzeit (0-23) zum abschalten des Lichts", "20", 2);
|
||
void.setup() {
|
||
Serial.begin(115200);
|
||
pref.begin("Prefs",false);
|
||
if (pref.getBool("namebool") == false)
{ int reactorNumber = (int)random(100000, 999999); String reactorNameGenerated = String("ESP32_" + String(reactorNumber)); pref.putString("reactorNameUser", reactorNameGenerated); pref.putBool("namebool",true); Serial.println("Reaktorname: "); Serial.println(reactorNameGenerated); } |
||
WiFiManagerParameter Token_Text_Box("Token_Text", "Name des Reaktors", pref.getString("reactorNameUser").c_str(), 20);
|
||
Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);
|
||
pinMode(heatPin, OUTPUT);
pinMode(stirrerPin, OUTPUT);
pinMode(lightPin, OUTPUT);
pinMode(RESET_TRIGGER, INPUT_PULLUP);
pinMode(2, OUTPUT);
pinMode(statusLED, OUTPUT);
pinMode(tdsSensorPin, OUTPUT);
|
||
//initialise TEMPsensor
sensors.begin();
|
||
wfm.addParameter(&Token_Text_Box);
wfm.addParameter(&MaxTemp_Text_Box);
wfm.addParameter(&MinTemp_Text_Box);
wfm.addParameter(&IntervalStirrer_Text_Box);
wfm.addParameter(&DurationStirrer_Text_Box);
wfm.addParameter(&LightOn_Text_Box);
wfm.addParameter(&LightOff_Text_Box);
|
||
if (digitalRead(RESET_TRIGGER) == LOW)
{ Serial.println("HARDRESET");
pref.putBool("setupbool", false); pref.putBool("namebool", false); pref.clear(); wfm.resetSettings(); pb.blinkLEDs(1, 500); ESP.deepSleep(10000000*10000000); //Sleep until Reset } |
||
//Try to connect with Wifi network
wfm.setWiFiAutoReconnect(true);
wfm.setConnectRetries(10);
wfm.setConfigPortalTimeout(300);
|
||
bool res = wfm.autoConnect(pref.getString("reactorNameUser").c_str());
|
||
if (!res)
{
waitForSync();
myTZ.setLocation("Europe/Berlin");
|
||
if (pref.getBool("resetbool") == false)
{
pref.putString("MinTemp",MinTemp_Text_Box.getValue());
pref.putString("MaxTemp", MaxTemp_Text_Box.getValue());
pref.putString("IntervalStirrer", IntervalStirrer_Text_Box.getValue());
pref.putString("DurationStirrer", DurationStirrer_Text_Box.getValue());
pref.putString("LightOn", LightOn_Text_Box.getValue());
pref.putString("LightOff", LightOff_Text_Box.getValue());
pref.putBool("resetbool", true);
}
|
||
if (pref.getBool("setupbool") == false)
{
pref.putString("reactorNameUser", Token_Text_Box.getValue());
pref.putBool("setupbool", true);
pb.blinkLEDs(10, 20);
}
}
|
||
String reactorNameUser = pref.getString("reactorNameUser");
const char* Reaktorname = reactorNameUser.c_str();
Serial.print("Your Reactor is called: ");
Serial.println(Reaktorname);
sensor.addTag("Reaktorname", Reaktorname);
|
||
//Write one initial Point for initial User Feedback
pb.addSensorData();
pb.writeSensorData();
}
|
||
void.loop() {
|
||
if (Wifi.status() == WL_CONNECTED)
{ Serial.println("Connected with Wifi!");
pb.setStatusLEDsHigh();
pb.checkResetButton(); // Check Button State and initialize Reset
pb.halfHourlySyncDeviceTime(); // Update Current Time
pb.printValues();
|
||
// Control the Parameters
pb.controlWaterTemp();
pb.controlStirring();
pb.controlLight();
|
||
//Write Points
int currentHour = myTZ.hour();
int currentMinute = myTZ.minute();
if(currentMinute != previousMinute){
dataSent = false;
previousMinute = currentMinute;
}
delay(10);
|
||
if(((currentHour == 0 && currentMinute == 0) ||
(currentHour == 6 && currentMinute == 0) ||
(currentHour == 14 && currentMinute == 15) ||
(currentHour == 18 && currentMinute == 0)) &&
(!dataSent))
{
pb.addSensorData();
pb.writeSensorData();
// Set flag to true to indicate that the data has been sent
dataSent = true;
previousMinute = myTZ.minute();
delay(10);
}
}
else
{
|
||
pb.setStatusLEDsLow();
wfm.disconnect();
if(wfm.getWiFiIsSaved()) wfm.setEnableConfigPortal(false);
wfm.autoConnect("AP");
wfm.autoConnect(pref.getString("reactorNameUser").c_str());
Serial.println("No WiFi");
}
Serial.print(".");
delay(100);
}
|
||