From a4eec2ebc8010e3b014faf9800ab966cd81e3924 Mon Sep 17 00:00:00 2001 From: Marcus Date: Sat, 13 Apr 2024 21:41:36 +0200 Subject: [PATCH] firmware WIP --- Arduino/CanGrow/CanGrow.ino | 172 ++++++++++++++++++++++-------------- 1 file changed, 107 insertions(+), 65 deletions(-) diff --git a/Arduino/CanGrow/CanGrow.ino b/Arduino/CanGrow/CanGrow.ino index ca4d952..bdfc28d 100644 --- a/Arduino/CanGrow/CanGrow.ino +++ b/Arduino/CanGrow/CanGrow.ino @@ -45,9 +45,11 @@ float valHumidity; bool configured; char WIFIssid[32]; char WIFIpassword[64]; +//int WIFIssidsAvail; IPAddress WIFIip(192,168,4,20); IPAddress WIFInetmask(255,255,255,0); IPAddress WIFIgateway(192,168,4,254); +IPAddress WIFIdns(0,0,0,0); // GrowName - contains the name of the grow/plant. Up to 32 byte char GrowName[32]; @@ -91,8 +93,14 @@ byte SoilmoistureLow; * WiFi */ -const char *APssid = "CanGrow-unconfigured"; -const char *APpass = "CanGrow"; +const char* APssid = "CanGrow-unconfigured"; +/* + * TODO - does not work atm. idk why. + * const char* APpass = "CanGrow"; +const int APchannel = 6; +const bool APhidden = false; +* +*/ /* @@ -424,7 +432,7 @@ void wipeEEPROM() { bool loadEEPROM() { - + Serial.println(":: loading EEPROM ::"); /* * configured * @@ -433,6 +441,8 @@ bool loadEEPROM() { * would be at the beginning - more a cosmetic thing */ EEPROM.get(511, configured); + Serial.print("configured: "); + Serial.println(configured); // when configured is > 1 (it should == 1) then read EEPROM furher data if(configured > 0) { @@ -452,6 +462,8 @@ bool loadEEPROM() { EEPROM.get(112, WIFInetmask); // read var WIFIgateway from address 128, 16 byte long EEPROM.get(128, WIFIgateway); + // read var WIFIgateway from address 128, 16 byte long + EEPROM.get(144, WIFIdns); /* * Grow data @@ -466,16 +478,45 @@ bool loadEEPROM() { Serial.print("WIFIssid: "); Serial.println(WIFIssid); Serial.print("WIFIpassword: "); - Serial.println(WIFIpassword); + Serial.println(WIFIpassword); } - - - Serial.print("configured: "); - Serial.println(configured); + Serial.println(":: EEPROM loaded ::"); return(configured); } +void wifiConnect() { + Serial.println(":: Connecting to WiFi ::"); + Serial.print("SSID: "); + Serial.println(WIFIssid); + + // Start WiFi connection + WiFi.begin(WIFIssid, WIFIpassword); + WiFi.config(WIFIip, WIFIdns, WIFIgateway); + + // wait until WiFi connection is established + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + Serial.println(" CONNECTED!"); + Serial.print("IP: "); + Serial.println(WiFi.localIP()); +} + +void wifiAp() { + Serial.println(":: Creating Accesspoint ::"); + + // configure WiFi Access Point + WiFi.softAPConfig(WIFIip, WIFIgateway, WIFInetmask); + // start Access Point + // TODO make AP with password - does not work atm. idk why. + WiFi.softAP(APssid); + Serial.print("SSID: "); + Serial.println(APssid); + Serial.print("CanGrow IP address: "); + Serial.println(WiFi.softAPIP()); +} /* * Setup @@ -554,42 +595,21 @@ void setup() { */ - // load stored values from EEPROM + // load stored values from EEPROM and check what var configured is returned if(loadEEPROM()) { - Serial.print("Configuration found in EEPROM, connect to Wifi "); - Serial.println(WIFIssid); - - // Start WiFi connection - WiFi.begin(WIFIssid, WIFIpassword); - - // wait until WiFi connection is established - while (WiFi.status() != WL_CONNECTED) { - delay(500); - Serial.print("."); - } - Serial.println(" CONNECTED!"); - Serial.print("IP: "); - Serial.println(WiFi.localIP()); + + // connect to wifi + wifiConnect(); - // use webhandlers for configured state + // use webhandler for configured state WebHandler_configured(); - // no data found in EEPROM, setup Access Point - } else { - Serial.println("Creating Accesspoint"); - Serial.print("SSID: "); - Serial.println(APssid); - Serial.print("Password: "); - Serial.println(APpass); - - // configure WiFi Access Point - WiFi.softAPConfig(WIFIip, WIFIgateway, WIFInetmask); - // start Access Point - WiFi.softAP(APssid, APpass); - Serial.print("CanGrow IP address: "); - Serial.println(WiFi.softAPIP()); - - // use webhandlers for unconfigured state + // configured is 0, setup Access Point + } else { + + // start an wifi accesspoint + wifiAp(); + // use webhandler for unconfigured state WebHandler_unconfigured(); } @@ -627,10 +647,20 @@ void loop() { } void WebHandler_unconfigured() { - webserver.on("/", HTTP_GET, WEBrootAP); + /* + * WebHandler_unconfigured() + * + * Here all URL routings are defined, in unconfigured state + */ + webserver.on("/", HTTP_GET, WEBrootUnconfigured); } void WebHandler_configured() { + /* + * WebHandler_unconfigured() + * + * Here all URL routings are defined, in configured state + */ webserver.on("/", HTTP_GET, WEBroot); } @@ -640,6 +670,37 @@ void WebHandler_configured() { * */ +void WEB404() { + String body = FPSTR(HTMLheader); + body += "404 - not found"; + body += FPSTR(HTMLfooter); +} + +void WEBrootUnconfigured() { + byte ssidsAvail = WiFi.scanNetworks(); + String body = FPSTR(HTMLheader); + body += "

unconfigured!

"; + body += "

WiFi config

"; + body += "
"; + body += "SSID:
"; + body += "Password:
"; + body += "IP:
"; + body += "Subnet mask:
"; + body += "gateway:
"; + body += "dns:
"; + body += ""; + body += "
"; + body += "

Available WiFi

";
+  for(int i = 0 ; i < ssidsAvail; i++) {
+    body += WiFi.SSID(ssidsAvail);
+    body += "\n";
+  }
+  body += "

"; + body += FPSTR(HTMLfooter); + + webserver.send(200, "text/html", body); +} + void WEBroot() { String body = FPSTR(HTMLheader); @@ -649,30 +710,6 @@ void WEBroot() { webserver.send(200, "text/html", body); } -void WEBrootAP() { - - String body = FPSTR(HTMLheader); - body += "

unconfigured!

"; - body += "

WiFi config

"; - body += "
"; - body += "SSID:
"; - body += "Password:
"; - body += "IP:
"; - body += "Subnet mask:
"; - body += "gateway:
"; - body += ""; - body += "
"; - body += FPSTR(HTMLfooter); - - webserver.send(200, "text/html", body); -} - - -void WEB404() { - String body = FPSTR(HTMLheader); - body += "404 - not found"; - body += FPSTR(HTMLfooter); -} /* * @@ -686,6 +723,7 @@ void POSTwifiConfig() { String WIFIip_new = webserver.arg("WIFIip"); String WIFInetmask_new = webserver.arg("WIFInetmask"); String WIFIgateway_new = webserver.arg("WIFIgateway"); + String WIFIdns_new = webserver.arg("WIFIdns"); WIFIssid_new.toCharArray(WIFIssid, 32); WIFIpassword_new.toCharArray(WIFIpassword, 64); @@ -693,6 +731,7 @@ void POSTwifiConfig() { WIFIip.fromString(WIFIip_new); WIFInetmask.fromString(WIFInetmask_new); WIFIgateway.fromString(WIFIgateway_new); + WIFIdns.fromString(WIFIdns_new); configured = true; @@ -701,6 +740,7 @@ void POSTwifiConfig() { EEPROM.put(96, WIFIip); EEPROM.put(112, WIFInetmask); EEPROM.put(128, WIFIgateway); + EEPROM.put(144, WIFIdns); EEPROM.put(511, configured); EEPROM.commit(); @@ -719,6 +759,8 @@ void POSTwifiConfig() { Serial.println(WIFInetmask_new); Serial.print("WIFIgateway: "); Serial.println(WIFIgateway_new); + Serial.print("WIFIdns: "); + Serial.println(WIFIdns_new); Serial.print("configured: "); Serial.println(configured);