Files
PlatformIO_WineSensor/src/main.cpp

99 lines
2.9 KiB
C++
Raw Normal View History

2022-09-17 18:02:23 -05:00
#include <Adafruit_SSD1306.h>
2022-09-17 09:31:30 -05:00
#include <Arduino.h>
#include <AsyncElegantOTA.h>
2022-09-17 18:02:23 -05:00
#include <AsyncTCP.h>
2022-09-17 09:31:30 -05:00
#include <ESPAsyncWebServer.h>
2022-09-17 18:02:23 -05:00
#include <WiFi.h>
2022-09-17 09:31:30 -05:00
const char* ssid = "JoNelsDarlings";
const char* password = "Paris2016";
const int BUBBLE_GPIO = 4;
boolean isBubbleFirstContact = true;
unsigned long bubbleFreqSec = 0;
unsigned long lastMillis = millis();
AsyncWebServer server(80);
2022-09-17 18:02:23 -05:00
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// I connected SCL to D22 and SDA to D21
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void writeToOled(String text) {
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.setTextSize(2);
display.print(text);
display.display();
}
2022-09-17 09:31:30 -05:00
void setup(void) {
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
2022-09-17 18:02:23 -05:00
Serial.begin(9600);
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for (;;)
;
}
delay(2000);
writeToOled("Startup");
2022-09-17 09:31:30 -05:00
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
server.on("/", HTTP_GET, [](AsyncWebServerRequest* request) {
request->send(
200, "text/html",
"Hi! This is the Wine-Sensor. Last bubble frequency: every <b>" +
String(bubbleFreqSec) + "</b> Seconds. [" + String(millis()) + "/" +
String(lastMillis) + "/" + String(isBubbleFirstContact) + "/" +
String(digitalRead(BUBBLE_GPIO)) +
"]"
"<script>window.setTimeout(_=>{window.location.reload();}"
",1000)</script>");
});
AsyncElegantOTA.begin(&server); // Start AsyncElegantOTA
server.begin();
Serial.println("HTTP server started");
2022-09-17 18:02:23 -05:00
pinMode(BUBBLE_GPIO, INPUT_PULLUP);
2022-09-17 09:31:30 -05:00
}
void loop(void) {
2022-09-17 18:02:23 -05:00
digitalWrite(LED_BUILTIN, digitalRead(BUBBLE_GPIO));
2022-09-17 09:31:30 -05:00
// This runs real fast, so make sure that only the "first contact" is measured
2022-09-17 18:02:23 -05:00
if ((digitalRead(BUBBLE_GPIO) == LOW) && isBubbleFirstContact) {
2022-09-17 09:31:30 -05:00
if (millis() > lastMillis) { // don't measure if we had an overflow...
bubbleFreqSec = (millis() - lastMillis) / 1000;
2022-09-17 18:02:23 -05:00
writeToOled("Freq: " + String(bubbleFreqSec));
2022-09-17 09:31:30 -05:00
}
lastMillis = millis();
isBubbleFirstContact = false;
2022-09-17 18:02:23 -05:00
} else if ((digitalRead(BUBBLE_GPIO) == HIGH)) {
2022-09-17 09:31:30 -05:00
isBubbleFirstContact = true;
}
// need to slow it down a bit to prevent fluctuating state cahange
delay(100);
}