Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Arduino.h>
- #include <Wire.h>
- #include <Ticker.h>
- #include <ESP8266WiFi.h>
- #include <DNSServer.h>
- #include <ESP8266WebServer.h>
- #include <WiFiManager.h>
- #include <FS.h>
- #include <ArduinoJson.h>
- #include <Adafruit_MCP23X17.h>
- // Définir le temps d'intervalle de la fonction de ticker
- const unsigned long tickerInterval = 25;
- #define S0 D0 // Assign Multiplexer pin S0 connect to pin D0 of NodeMCU
- #define S1 D7 // Assign Multiplexer pin S1 connect to pin D3 of NodeMCU
- #define S2 D8 // Assign Multiplexer pin S2 connect to pin D7 of NodeMCU
- #define S3 D3 // Assign Multiplexer pin S3 connect to pin D8 of NodeMCU
- #define ANALOG_PIN A0 // Assign ANALOG_PIN read from analog multiplexer
- #define PUMP_PIN D6 // define pin D6 to control pump
- // Define mux channels pin control for all 16 mux cd74hc4051 to read only the first 4 channels of each MUX
- #define MUX_A D4
- #define MUX_B D5
- // #define MUX_C 4
- Adafruit_MCP23X17 mcpSolenoid, mcpMuxChip;
- const int MAX_SENSOR_PER_MUX = 4; // maximum number of sensors per MUX
- const int SOLENOID_COUNT = 15; // number of solenoids connected to MCP23017 #1
- const int MUX_COUNT = 15; // number of MUX cd74hc4051 connected to MCP23017 #2
- // Définition des broches de sortie pour chaque solénoïde
- const int SOLENOID_PINS[SOLENOID_COUNT] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; // MCP23017 pins connected to solenoids
- const int MUX_PINS[MUX_COUNT] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}; // MCP23017 pins connected to cd74hc4051
- int numSensorsMux[MUX_COUNT]; // Tableau contenant le nombre de capteurs connectés à chaque multiplexeur
- int sensorValuesMux[MUX_COUNT][MAX_SENSOR_PER_MUX]; // 2D array to store sensor values from all multiplexers
- int sensorValuesTotal[MUX_COUNT]; // array to store sensor value total of each MUX
- int userMax[MUX_COUNT]; // Define array to store user-defined maximum values
- int userMin[MUX_COUNT]; // Define array to store user-defined minimum values
- bool anySolenoidsActive = false; // flag to indicate if any solenoids are active
- bool solenoidStatus[SOLENOID_COUNT];
- bool pumpStatus;
- ESP8266WebServer server(80);
- #include "html.h"
- #include "detectsensor.h"
- #include "readsensors.h"
- #include "jsonconfig.h"
- void handleRoot(){
- server.send_P(200, "text/html", INDEX_HTML); //Send web page
- }
- void handleReadUserPlantSelected(){
- for (int i = 0; i < SOLENOID_COUNT; i++) {
- String maxKey = "userMax[" + String(i) + "]";
- String minKey = "userMin[" + String(i) + "]";
- if (server.hasArg(maxKey)) {
- String maxArg = server.arg(maxKey);
- if (maxArg.length() > 0) {
- if (maxArg.length() <= 3 && maxArg.toInt() >= 0 && maxArg.toInt() <= 999) {
- userMax[i] = maxArg.toInt();
- } else {
- server.send(400, "text/html", "<script>alert('Invalid value for " + maxKey + "');</script>");
- return;
- }
- }
- }
- if (server.hasArg(minKey)) {
- String minArg = server.arg(minKey);
- if (minArg.length() > 0) {
- if (minArg.length() <= 3 && minArg.toInt() >= 0 && minArg.toInt() <= 999) {
- userMin[i] = minArg.toInt();
- } else {
- server.send(400, "text/html", "<script>alert('Invalid value for " + minKey + "');</script>");
- return;
- }
- }
- }
- }
- // Afficher les valeurs des seuils définis par l'utilisateur sur la console série
- Serial.println("Seuils d'humidité du sol définis par l'utilisateur :");
- for (int i = 0; i < SOLENOID_COUNT; i++) {
- Serial.print("Capteur "); Serial.print(i); Serial.print(": Max = "); Serial.print(userMax[i]); Serial.print(", Min = "); Serial.println(userMin[i]);
- }
- // Enregistrer les valeurs dans la mémoire EEPROM
- saveConfiguration();
- // Rediriger vers la page d'accueil
- server.sendHeader("Location","/");
- server.send(303);
- }
- void handleSendata(){
- String xml = "<?xml version=\"1.0\"?>";
- xml += "<data>";
- for(int mux = 0; mux < MUX_COUNT; mux++){
- xml += "<mux id=\"" + String(mux) + "\">";
- //xml += "<sensor id=\"00\">" + String(sensorValuesTotal[mux]) + "</sensor>";
- xml += "<sensor id=\"" + String(mux) + "\">" + String(sensorValuesTotal[mux]) + "</sensor>";
- xml += "<solenoid id=\"" + String(mux) + "\">" + String(solenoidStatus[mux]) + "</solenoid>";
- xml += "</mux>";
- }
- xml += "<pump>" + String(pumpStatus) + "</pump>";
- xml += "</data>";
- server.send(200, "text/xml", xml);
- }
- void handleNotFound() {
- String message = "File Not Found\n\n";
- message += "URI: ";
- message += server.uri();
- message += "\nMethod: ";
- message += (server.method() == HTTP_GET) ? "GET" : "POST";
- message += "\nArguments: ";
- message += server.args();
- message += "\n";
- for (uint8_t i = 0; i < server.args(); i++) {
- message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
- }
- server.send(404, "text/plain", message);
- }
- // Définir la fonction à exécuter à chaque intervalle de ticker
- void tickFunction() {
- readSensors(); // Read sensor values
- controlSolenoids(); // Activate or deactivate solenoids based on sensor values
- }
- // Créer un objet Ticker
- Ticker ticker;
- void setup() {
- Serial.begin(115200);
- while (!Serial);
- if (!mcpSolenoid.begin_I2C(0x20)) {
- Serial.println("Error.");
- while (1);
- }
- if (!mcpMuxChip.begin_I2C(0x21)) {
- Serial.println("Error.");
- while (1);
- }
- // Set MCP23017 #1 pins as outputs
- for (int i = 0; i < SOLENOID_COUNT; i++) {
- mcpSolenoid.pinMode(SOLENOID_PINS[i], OUTPUT);
- }
- // Set MCP23017 #2 pins as outputs
- for (int i = 0; i < MUX_COUNT; i++) {
- mcpMuxChip.pinMode(MUX_PINS[i], OUTPUT);
- mcpMuxChip.digitalWrite(MUX_PINS[i], HIGH);
- }
- pinMode(S0, OUTPUT); // Set D0 pin as output
- pinMode(S1, OUTPUT); // Set D3 pin as output
- pinMode(S2, OUTPUT); // Set D7 pin as output
- pinMode(S3, OUTPUT); // Set D8 pin as output
- pinMode(MUX_A, OUTPUT); // Set D4 pin as output
- pinMode(MUX_B, OUTPUT); // Set D5 pin as output
- pinMode(PUMP_PIN, OUTPUT); // Set pump pin as output
- // Set pump to initial state (off)
- digitalWrite(PUMP_PIN, LOW);
- pumpStatus = false;
- Serial.println("");
- delay(1000);
- Serial.println("Mounting FS...");
- if (!SPIFFS.begin()) {
- Serial.println("Failed to mount file system");
- return;
- }
- loadConfiguration();
- detectSensors();
- WiFiManager wifiManager;
- wifiManager.autoConnect("AutoConnectAP");
- Serial.println("Yourconnected...yeey :)");
- server.on("/", handleRoot);
- //server.on("/pump", handlePump);
- server.on("/get",handleReadUserPlantSelected);
- server.on("/sendata", handleSendata);
- server.onNotFound(handleNotFound); /* page not found */
- server.begin();
- Serial.println("HTTP server started");
- Serial.println(WiFi.localIP());
- ticker.attach(tickerInterval, tickFunction);
- }
- void loop() {
- server.handleClient();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement