/********* Pleasedontcode.com ********** Pleasedontcode thanks you for automatic code generation! Enjoy your code! - Terms and Conditions: You have a non-exclusive, revocable, worldwide, royalty-free license for personal and commercial use. Attribution is optional; modifications are allowed, but you're responsible for code maintenance. We're not liable for any loss or damage. For full terms, please visit pleasedontcode.com/termsandconditions. - Project: **Sensor Server** - Source Code NOT compiled for: ESP32 DevKit V1 - Source Code created on: 2024-10-22 09:37:41 ********* Pleasedontcode.com **********/ /****** SYSTEM REQUIREMENTS *****/ /****** SYSTEM REQUIREMENT 1 *****/ /* merge code. */ /****** END SYSTEM REQUIREMENTS *****/ /* START CODE */ /****** DEFINITION OF LIBRARIES *****/ #include //#include // SoftwareSerial is not compatible with ESP32, use hardware serial instead #include "ACS712.h" #include #include #include #include #include #include #include #include "X9C10X.h" /****** FUNCTION PROTOTYPES *****/ void setup(void); void loop(void); // Access Point credentials char ssid[] = "pleasedontcode.com"; // your network SSID (name) char pass[] = "prova1234"; // your network password (use for WPA, or use as key for WEP) // Create an instance of the web server AsyncWebServer server(80); TinyGPSPlus gps; // Pin configuration #define VELOCITA_SOGLIA_HIGH 75.0 // km/h #define VELOCITA_SOGLIA_LOW 65.0 // km/h #define VELOCITA_SOGLIA_0A_HIGH 20.0 // km/h #define VELOCITA_SOGLIA_0A_LOW 10.0 // km/h // PINS const int water_level_pin = 18; const int voltage_pin = 35; const int current_pin = 34; const int tempSensor1_pin = 33; const int tempSensor2_pin = 32; const int ONE_WIRE_BUS_Temp1 = 19; // sonda temp 1 const int ONE_WIRE_BUS_Temp2 = 21; // sonda temp 2 const int DIGPOT_INC = 4; // pin INC - X9C103S const int DIGPOT_UD = 5; // pin UD - X9C103S const int DIGPOT_CS = 15; // pin CS - X9C103S const float PWM_output_percentage_0A = 0.0; // 0% const float PWM_output_percentage_9A = 20.0; // 20% const float PWM_output_percentage_5A = 13.0; // 13% // Global variables for sensor data float PWM_output_percentage = 0.0; float velocita = 0.0; float voltage_output_value = 0.0; bool waterLevelEmpty = true; float voltage = 0.0; float current = 0.0; float temperature1 = 0.0; float temperature2 = 0.0; unsigned long powerOnTime = 0; // minutes boolean startRegeneration = false; unsigned int set_current = 0; unsigned int set_timer = 0; // ACS712 configuration unsigned int ADC_Offset = 1930; ACS712 ACS(current_pin, 3.3, 4095, 40); // pin 34 for current sensor acquisition X9C10X pot(10000); // 10KΩ - digital potentiometer X9C103S // Function prototypes for setup logic void printWiFiStatus(); void printWebPage(); void checkClientRequest(String currentLine); // HTTP server response states bool ReplyWebPageContent = true; bool ReplyResetTime = false; bool postUpdateData = false; static const int GPSBaud = 9600; #define ss Serial2 // Use Serial2 for GPS communication unsigned long TEMPO_ATTESA_VISUALIZZAZIONE_VELOCITA = 300; unsigned long SpeedShowTimer = 0; // Timer counters unsigned long secondsCounter = 0; unsigned long previousMillis = millis(); // Variable to store the previous millis value unsigned long currentMillis = millis(); unsigned long minutesCounter = 0; // Setup OneWire instances for temperature sensors OneWire oneWire1(ONE_WIRE_BUS_Temp1); OneWire oneWire2(ONE_WIRE_BUS_Temp2); // Setup Dallas Temperature Library DallasTemperature sensor1(&oneWire1); DallasTemperature sensor2(&oneWire2); // Characteristic curves for ADC inputs const uint8_t SEGMENT_POINTS_voltage_Temperature = 10; const float voltage_Temperature_lookup[2][SEGMENT_POINTS_voltage_Temperature] = { {0.0, 1.2, 1.9, 5.0, 10.0, 14.5, 17.0, 20.0, 30.0, 35.0}, // voltage [V] {0.0, 5.0, 7.0, 13.0, 22.0, 29.0, 33.0, 37.0, 56.0, 65.0} // temperature [°C] }; // Initialize SPIFFS for file storage void initSPIFFS() { if (!SPIFFS.begin(true)) { Serial.println("An error occurred while mounting SPIFFS."); return; } Serial.println("SPIFFS mounted successfully."); } void setup() { Serial.begin(115200); // Start Serial for debugging delay(1000); Serial.println("ciao"); pot.begin(DIGPOT_INC, DIGPOT_UD, DIGPOT_CS); // Initialize digital pot for (int i=0; i<10; i++) { setCurrentOutput(0); delay(20); setCurrentOutput(100); delay(20); } setCurrentOutput(PWM_output_percentage); readMinutesCounterFromEEPROM(); ss.begin(GPSBaud); Serial.println("ciao2"); sensor1.begin(); sensor2.begin(); smartDelay(1000); ACS.setMidPoint(ADC_Offset); Serial.println(F("Access Point Web Server")); initSPIFFS(); // Initialize SPIFFS WiFi.mode(WIFI_AP); // Set ESP32 to access point mode if (!WiFi.softAP(ssid, pass)) { Serial.println("Soft AP creation failed."); while(1); } // Print the IP address of the access point IPAddress IP = WiFi.softAPIP(); Serial.print("Access Point IP Address: "); Serial.println(IP); // Web server routes server.on("/background.jpg", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(SPIFFS, "/background.jpg", "image/jpeg"); }); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) { request->send(SPIFFS, "/index.html", "text/html"); }); server.on("/UPDATEDATA", HTTP_POST, [](AsyncWebServerRequest *request) { // Create JSON document StaticJsonDocument<512> doc; updateData(doc); // Fill JSON with updated data String response; serializeJsonPretty(doc, response); // Convert to string request->send(200, "application/json", response); }); server.begin(); // Start the server } void loop() { readGPSAndCheckSpeed(); readCurrent(); readVoltage(); readWaterTank(); readTemp1(); readTemp2(); updateMinutesCounter(); checkRegeneration(); } // Function to send data as JSON response void updateData(JsonDocument &doc) { if (velocita > 0.0) { doc["speed"] = String(velocita) + String(F(" km/h")); } else { doc["speed"] = String(F("ERROR")); } doc["voltageCommandOut"] = String(F("Tensione uscita comando: ")) + String(voltage_output_value) + String(F("/3.3 [V]")); doc["percentageCommandOut"] = String(F("Uscita comando PWM: ")) + String(PWM_output_percentage) + String(F(" [%]")); doc["waterTankLevel"] = waterLevelEmpty ? String(F("VUOTO")) : String(F("PIENO")); doc["powerOnTime"] = String(powerOnTime) + String(F(" min")); doc["current"] = String(current) + String(F(" A")); doc["voltage"] = String(voltage) + String(F(" V")); doc["temperature1"] = String(temperature1) + String(F(" °C")); doc["temperature2"] = String(temperature2) + String(F(" °C")); doc["set_timer"] = String(F("Timer : ")) + String(set_timer) + String(F(" min")); } void checkRegeneration() { if(set_timer == 0) { startRegeneration = false; } } // Reading functions continue.. void readMinutesCounterFromEEPROM() { unsigned long max_minutesCounter = 0UL - 1UL; EEPROM.begin(sizeof(powerOnTime)); EEPROM.get(0, powerOnTime); if (powerOnTime == max_minutesCounter) { powerOnTime = 0; } Serial.print("powerOnTime: "); Serial.println(powerOnTime); } void updateMinutesCounter() { currentMillis = millis(); if ((currentMillis - previousMillis) > 1000) { previousMillis = currentMillis; secondsCounter++; if (secondsCounter % 60 == 0) { secondsCounter = 0; minutesCounter++; powerOnTime++; if (minutesCounter % 10 == 0) { // Save counter every 10 minutes saveMinutesCounterInEEPROM(); } if (set_timer > 0) { set_timer--; } } } } void saveMinutesCounterInEEPROM() { EEPROM.put(0, powerOnTime); EEPROM.commit(); } void readGPSAndCheckSpeed() { while (ss.available() > 0) { if (gps.encode(ss.read())) { checkSpeed(); } } } void checkSpeed() { // Insert timed sensor reading logic } /* END CODE */