#include <WiFiClientSecure.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
//define inputs
#define levelSensor 33
//define outputs
#define pumpPin 5
#define percent20out 16
#define percent40out 4
#define percent60out 0
#define percent80out 2
#define percent100out 15
// SSID и парола за WiFi мрежата
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqttUser = "Esp32test";
const char* mqttPassword = "Esp32test";
/*
// Адрес на MQTT брокера и порт
const char* mqtt_server = "4ce472250c414c7c8cbae253a1b72747.s1.eu.hivemq.cloud";
const int mqtt_port = 8883;
// Инициализация на WiFi и MQTT клиенти
WiFiClientSecure espClient;
PubSubClient client(espClient);
*/
int currentLevel=0;
void config()
{
//water level sensor
pinMode(levelSensor, INPUT);
//Pump initialization
pinMode(pumpPin, OUTPUT);
//Level indicator inicialization
pinMode(percent20out, OUTPUT);
pinMode(percent40out, OUTPUT);
pinMode(percent60out, OUTPUT);
pinMode(percent80out, OUTPUT);
pinMode(percent100out,OUTPUT);
}
/*
void setup_wifi()
{
int retries = 0;
unsigned long startTime = millis();
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi ");
Serial.println(ssid);
while (WiFi.status() != WL_CONNECTED && retries < 3)
{
if (millis() - startTime > 10000)
{ //timeout 10 seconds
Serial.println("Connection Timeout. Retrying...");
retries++;
WiFi.disconnect();
WiFi.begin(ssid, password); // Re-initiate connection
startTime = millis(); // Reset the timer
}
delay(500);
}
if (WiFi.status() == WL_CONNECTED)
{
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
else
{
Serial.println("Failed to connect to WiFi. Please check your settings.");
}
}
*/
void setup() {
config();
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Hello, ESP32!");
}
void levelIndicator(int currentLevel) {
if (currentLevel < 20) {
digitalWrite(percent20out, LOW);
digitalWrite(percent40out, LOW);
digitalWrite(percent60out, LOW);
digitalWrite(percent80out, LOW);
digitalWrite(percent100out, LOW);
}
else if (currentLevel >= 20 && currentLevel < 40) {
digitalWrite(percent20out, HIGH);
digitalWrite(percent40out, LOW);
digitalWrite(percent60out, LOW);
digitalWrite(percent80out, LOW);
digitalWrite(percent100out, LOW);
}
else if (currentLevel >= 40 && currentLevel < 60) {
digitalWrite(percent20out, HIGH);
digitalWrite(percent40out, HIGH);
digitalWrite(percent60out, LOW);
digitalWrite(percent80out, LOW);
digitalWrite(percent100out, LOW);
}
else if (currentLevel >= 60 && currentLevel < 80) {
digitalWrite(percent20out, HIGH);
digitalWrite(percent40out, HIGH);
digitalWrite(percent60out, HIGH);
digitalWrite(percent80out, LOW);
digitalWrite(percent100out, LOW);
}
else if (currentLevel >= 80 && currentLevel < 100) {
digitalWrite(percent20out, HIGH);
digitalWrite(percent40out, HIGH);
digitalWrite(percent60out, HIGH);
digitalWrite(percent80out, HIGH);
digitalWrite(percent100out, LOW);
}
else if (currentLevel >= 100) {
digitalWrite(percent20out, HIGH);
digitalWrite(percent40out, HIGH);
digitalWrite(percent60out, HIGH);
digitalWrite(percent80out, HIGH);
digitalWrite(percent100out, HIGH);
}
}
void getInputSensorData()
{
currentLevel = 100.0 * analogRead(levelSensor) / 4095.0;
}
void startStopPump(bool OnOff)
{
digitalWrite(pumpPin, OnOff);
}
/*
void reconnect()
{
while (!client.connected())
{
Serial.print("Attempting MQTT connection...");
if (client.connect("ESP32Client",mqttUser, mqttPassword))
{
Serial.println("connected");
// Подпишете се за теми или публикува съобщения
client.subscribe("PanelMonitoring/topic");
}
else
{
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void publishData(int )
{
// Създаване на JSON документ
StaticJsonDocument<200> doc;
doc["currentLevel"] = currentLevel;
// Превръщане на JSON документа в стринг
char buffer[256];
size_t n = serializeJson(doc, buffer);
// Преобразуване на buffer от char* към const uint8_t*
const uint8_t* payload = reinterpret_cast<const uint8_t*>(buffer);
// Публикуване на JSON стринга в темата "home/sensor"
client.publish("SeedsPlant/topic", payload, n, true);
}
*/
void loop() {
getInputSensorData();
/*
if (!client.connected())
{
reconnect();
}
client.loop();
*/
//pump management
if (currentLevel >= 80)
{
startStopPump(true);
}
if (currentLevel <= 20)
{
startStopPump(false);
}
levelIndicator(currentLevel);
// put your main code here, to run repeatedly:
/*publishData(currentLevel);
*/
delay(1000); // this speeds up the simulation
}