Advertisement
noam76

main.ino

Apr 29th, 2023
877
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <Arduino.h>
  2. #include <Wire.h>
  3. #include <Ticker.h>
  4. #include <ESP8266WiFi.h>
  5. #include <DNSServer.h>
  6. #include <ESP8266WebServer.h>
  7. #include <WiFiManager.h>
  8. #include <FS.h>
  9. #include <ArduinoJson.h>
  10. #include <Adafruit_MCP23X17.h>
  11.  
  12. // Définir le temps d'intervalle de la fonction de ticker
  13. const unsigned long tickerInterval = 25;
  14.  
  15. #define S0 D0 // Assign Multiplexer pin S0 connect to pin D0 of NodeMCU
  16. #define S1 D7 // Assign Multiplexer pin S1 connect to pin D3 of NodeMCU
  17. #define S2 D8 // Assign Multiplexer pin S2 connect to pin D7 of NodeMCU
  18. #define S3 D3 // Assign Multiplexer pin S3 connect to pin D8 of NodeMCU
  19. #define ANALOG_PIN A0 // Assign ANALOG_PIN read from analog multiplexer
  20.  
  21. #define PUMP_PIN D6 // define pin D6 to control pump
  22.  
  23. // Define mux channels pin control for all 16 mux cd74hc4051 to read only the first 4 channels of each MUX
  24. #define MUX_A D4
  25. #define MUX_B D5
  26. // #define MUX_C 4
  27.  
  28. Adafruit_MCP23X17 mcpSolenoid, mcpMuxChip;
  29.  
  30. const int MAX_SENSOR_PER_MUX = 4; // maximum number of sensors per MUX
  31. const int SOLENOID_COUNT = 15; // number of solenoids connected to MCP23017 #1
  32. const int MUX_COUNT = 15; // number of MUX cd74hc4051 connected to MCP23017 #2
  33.  
  34. // Définition des broches de sortie pour chaque solénoïde
  35. 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
  36. 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
  37. int numSensorsMux[MUX_COUNT]; // Tableau contenant le nombre de capteurs connectés à chaque multiplexeur
  38. int sensorValuesMux[MUX_COUNT][MAX_SENSOR_PER_MUX]; // 2D array to store sensor values from all multiplexers
  39. int sensorValuesTotal[MUX_COUNT]; // array to store sensor value total of each MUX
  40. int userMax[MUX_COUNT]; // Define array to store user-defined maximum values
  41. int userMin[MUX_COUNT]; // Define array to store user-defined minimum values
  42. bool anySolenoidsActive = false; // flag to indicate if any solenoids are active
  43. bool solenoidStatus[SOLENOID_COUNT];
  44. bool pumpStatus;
  45.  
  46. ESP8266WebServer server(80);
  47. #include "html.h"
  48. #include "detectsensor.h"
  49. #include "readsensors.h"
  50. #include "jsonconfig.h"
  51.  
  52. void handleRoot(){
  53.   server.send_P(200, "text/html", INDEX_HTML); //Send web page
  54. }
  55.  
  56. void handleReadUserPlantSelected(){
  57.   for (int i = 0; i < SOLENOID_COUNT; i++) {
  58.    String maxKey = "userMax[" + String(i) + "]";
  59.    String minKey = "userMin[" + String(i) + "]";
  60.   if (server.hasArg(maxKey)) {
  61.    String maxArg = server.arg(maxKey);
  62.     if (maxArg.length() > 0) {
  63.      if (maxArg.length() <= 3 && maxArg.toInt() >= 0 && maxArg.toInt() <= 999) {
  64.       userMax[i] = maxArg.toInt();
  65.      } else {
  66.       server.send(400, "text/html", "<script>alert('Invalid value for " + maxKey + "');</script>");
  67.       return;
  68.      }
  69.    }
  70.  }
  71.  if (server.hasArg(minKey)) {
  72.   String minArg = server.arg(minKey);
  73.   if (minArg.length() > 0) {
  74.     if (minArg.length() <= 3 && minArg.toInt() >= 0 && minArg.toInt() <= 999) {
  75.       userMin[i] = minArg.toInt();
  76.     } else {
  77.       server.send(400, "text/html", "<script>alert('Invalid value for " + minKey + "');</script>");
  78.       return;
  79.     }
  80.    }
  81.   }
  82.  }
  83.   // Afficher les valeurs des seuils définis par l'utilisateur sur la console série
  84.   Serial.println("Seuils d'humidité du sol définis par l'utilisateur :");
  85.   for (int i = 0; i < SOLENOID_COUNT; i++) {
  86.     Serial.print("Capteur "); Serial.print(i); Serial.print(": Max = "); Serial.print(userMax[i]); Serial.print(", Min = "); Serial.println(userMin[i]);
  87.   }
  88.  
  89.   // Enregistrer les valeurs dans la mémoire EEPROM
  90.   saveConfiguration();
  91.   // Rediriger vers la page d'accueil
  92.   server.sendHeader("Location","/");
  93.   server.send(303);
  94. }
  95.  
  96. void handleSendata(){
  97.   String xml = "<?xml version=\"1.0\"?>";
  98.   xml += "<data>";
  99.   for(int mux = 0; mux < MUX_COUNT; mux++){
  100.     xml += "<mux id=\"" + String(mux) + "\">";
  101.     //xml += "<sensor id=\"00\">" + String(sensorValuesTotal[mux]) + "</sensor>";
  102.     xml += "<sensor id=\"" + String(mux) + "\">" + String(sensorValuesTotal[mux]) + "</sensor>";
  103.     xml += "<solenoid id=\"" + String(mux) + "\">" + String(solenoidStatus[mux]) + "</solenoid>";
  104.     xml += "</mux>";
  105.   }
  106.   xml += "<pump>" + String(pumpStatus) + "</pump>";
  107.   xml += "</data>";
  108.   server.send(200, "text/xml", xml);
  109. }
  110.  
  111. void handleNotFound() {
  112.   String message = "File Not Found\n\n";
  113.   message += "URI: ";
  114.   message += server.uri();
  115.   message += "\nMethod: ";
  116.   message += (server.method() == HTTP_GET) ? "GET" : "POST";
  117.   message += "\nArguments: ";
  118.   message += server.args();
  119.   message += "\n";
  120.   for (uint8_t i = 0; i < server.args(); i++) {
  121.     message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  122.   }
  123.   server.send(404, "text/plain", message);
  124. }
  125.  
  126. // Définir la fonction à exécuter à chaque intervalle de ticker
  127. void tickFunction() {
  128.   readSensors(); // Read sensor values
  129.   controlSolenoids(); // Activate or deactivate solenoids based on sensor values
  130. }
  131.  
  132. // Créer un objet Ticker
  133. Ticker ticker;
  134.  
  135. void setup() {
  136.   Serial.begin(115200);
  137.   while (!Serial);
  138.     if (!mcpSolenoid.begin_I2C(0x20)) {
  139.    Serial.println("Error.");
  140.    while (1);
  141.  }
  142.  
  143.   if (!mcpMuxChip.begin_I2C(0x21)) {
  144.    Serial.println("Error.");
  145.    while (1);
  146.  }
  147.  
  148.   // Set MCP23017 #1 pins as outputs
  149.   for (int i = 0; i < SOLENOID_COUNT; i++) {
  150.     mcpSolenoid.pinMode(SOLENOID_PINS[i], OUTPUT);
  151.   }
  152.  
  153.   // Set MCP23017 #2 pins as outputs
  154.   for (int i = 0; i < MUX_COUNT; i++) {
  155.     mcpMuxChip.pinMode(MUX_PINS[i], OUTPUT);
  156.     mcpMuxChip.digitalWrite(MUX_PINS[i], HIGH);
  157.   }
  158.  
  159.   pinMode(S0, OUTPUT); // Set D0 pin as output
  160.   pinMode(S1, OUTPUT); // Set D3 pin as output
  161.   pinMode(S2, OUTPUT); // Set D7 pin as output
  162.   pinMode(S3, OUTPUT); // Set D8 pin as output
  163.   pinMode(MUX_A, OUTPUT); // Set D4 pin as output
  164.   pinMode(MUX_B, OUTPUT); // Set D5 pin as output
  165.   pinMode(PUMP_PIN, OUTPUT); // Set pump pin as output
  166.    // Set pump to initial state (off)
  167.   digitalWrite(PUMP_PIN, LOW);
  168.   pumpStatus = false;
  169.  
  170.   Serial.println("");
  171.   delay(1000);
  172.  
  173.  Serial.println("Mounting FS...");
  174.  if (!SPIFFS.begin()) {
  175.    Serial.println("Failed to mount file system");
  176.    return;
  177.  }
  178.  
  179.   loadConfiguration();
  180.   detectSensors();
  181.  
  182.   WiFiManager wifiManager;
  183.   wifiManager.autoConnect("AutoConnectAP");
  184.   Serial.println("Yourconnected...yeey :)");
  185.   server.on("/", handleRoot);
  186.   //server.on("/pump", handlePump);
  187.   server.on("/get",handleReadUserPlantSelected);
  188.   server.on("/sendata", handleSendata);
  189.   server.onNotFound(handleNotFound);   /* page not found */
  190.  
  191.   server.begin();
  192.   Serial.println("HTTP server started");
  193.   Serial.println(WiFi.localIP());
  194.   ticker.attach(tickerInterval, tickFunction);
  195. }
  196.  
  197. void loop() {
  198.   server.handleClient();
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement