// WemosD1mini> SOLAR // // used wemosD1 manual: https://geekelectronics.org/arduino/wemos-d1-r2-na-esp8266-ndash-pervoe-znakomstvo.html // избавляет от цикла при прерываниях //void ICACHE_RAM_ATTR el_count(); ///#include #include // Only needed for Arduino 1.6.5 and earlier // #include "SSD1306Wire.h" // alias for `#include "SSD1306Wire.h"` //#include "DHT.h" #include #include #include // https://github.com/jwrw/ESP_EEPROM // for WEB #include #include #include // https://github.com/tzapu/WiFiManager // for OTA //#include //#include //#include ///#include "user_interface.h" #include Adafruit_ADS1115 ads; // Создание объекта ads для общения через него с модулем // for battery check //ADC_MODE(ADC_VCC); int hour, minu ,secu, led_delay, contr_id, zoomer; String api_url_script_url, host, url, chip_id, device_ip; String ver="24.8.20"; String pin="8888"; int relay_delay=3; bool relay_def_state=false; String events[10]; int event_last=0; int fail_connect = 0; String last_url = ""; long tm; ESP8266WebServer server ( 80 ); char footer[400]; char bottom[30]; String www_menu = "   Home     \ XML page     \ JSON page     \ LOGs    "; Ticker dht_get; Ticker tim; Ticker key_r; // ___________________________________________ // Силовая часть N L | R4 R3 R2 R1 // +5 GND C+ DHT LED DoR R1 R2 (Винты вниз) // ------------------------------------------- // # [wf ] 1 VDD ADS1115 // # [ ] 3 GND // 16 [ ] 5 SCL ---> SCL // PWMb 14 [ ] 4 SDA ---> SDA // К12 12 [ ] 0 R0 ADDR -> GND // LOAD 13 [ ] 2 BUILTLED A0 v_pow // 15 [ ] GND A1 i_bat // 3,3 [usb] 5V A2 v_bat // A3 v_out // ___________________________________________ #define BUILTLED 2 #define PWM 14 #define LOAD 13 int adc_divisor=6; int v_bat_pwm, pwm_step, bat_time, time_last, bat_proc, load_autostart = 0; float v_pow, v_bat, v_bat_d, v_bat_max, v_bat_min, v_bat_prev, i_bat, i_bat_cc, i_bat_d, i_bat_max, v_out = 0.0; bool bat_low, bat_manual = false; bool dht_get_flag = false; bool tm_flag = false; bool key_flag = false; bool updated = false; //String tm_capt = ""; bool http_get_finc( int operation, String sens_id, float value) { fail_connect= millis(); bool result=false; // Operations: // 1 - syncronize time // 2 - send changed params // 3 - read last relays configuration // String url2 = "/gpio/themp.php?p=12345&sens_id=4&act=save&val="; if((WiFi.status() == WL_CONNECTED)) { // Use WiFiClient class to create TCP connections WiFiClient client; String line, last_url; if(operation==1) { // Serial.print("connecting to "); // Serial.println(host); if (client.connect(host, 80)) { // This will send the request to the server line = url + "?act=Hi" + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"; last_url = line; client.print(String("GET ") + line); // Read all the lines of the reply from server and print them to Serial line = ""; while (client.connected()) { if (client.available()) { line = client.readStringUntil('\n'); if(line.indexOf('now')>0) { String st= line.substring(3,5); hour = st.toInt(); st= line.substring(5,7); minu = st.toInt(); st= line.substring(7,9); secu = st.toInt(); Serial.println(line); } } if(millis()-fail_connect > 5000) client.stop(); } client.stop(); last_url += line; // Serial.println("disconnect"); } else { Serial.println("connection failed!"); client.stop(); } } if(operation==2 && sizeof(host)>1) // ОТПРАВКА { Serial.println("Try server:" + host + " url:" + url); if (client.connect(host, 80)) { line = url + sens_id + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"; last_url = line; client.print(String("GET ") + line); line = ""; while (client.connected()) { if (client.available()) { line = client.readStringUntil('\n'); if(line.indexOf('saved')>0) Serial.println(line); } if(millis()-fail_connect > 5000) client.stop(); } client.stop(); last_url += line; result = true; } else { Serial.println("connection failed!"); client.stop(); } } if(operation==3) // ПОЛУЧЕНИЕ { if (client.connect(host, 80)) { // This will send the request to the server line = url + "?act=simple&sens_id=" + sens_id + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n"; last_url = line; client.print(String("GET ") + line); // Read all the lines of the reply from server and print them to Serial line = ""; while (client.connected()) { if (client.available()) { line = client.readStringUntil('\n'); // bool variables String st= line.substring(0,1); bool state = false; if(st=="0" || st=="") state = false; if(st=="1" || st=="5") state = true; // if(sens_id=="141") digitalWrite(0, state); // if(sens_id=="142") digitalWrite(2, state); } // if(millis()-fail_connect > 5000) client.stop(); } client.stop(); last_url += line; } else { Serial.println("connection failed!]"); client.stop(); } } /////////WiFi.disconnect(); } // Serial.println(last_url); dht_get_flag = false; return result; } void time_finc() { secu=secu+30; if(secu>59) { secu=0; minu++; } if(minu>59) { minu=0; hour++; } if(hour>23) hour=0; tm = hour*10000 + minu*100 + secu; if(WiFi.status() == WL_CONNECTED) device_ip = WiFi.localIP().toString(); else device_ip=chip_id; // restore time and relays last states if(updated==false && WiFi.status() == WL_CONNECTED) { http_get_finc( 1, "", 0); // sync time // http_get_finc( 3, "137", 0); // http_get_finc( 3, "135", 0); // http_get_finc( 3, "136", 0); updated=true; } tm_flag=false; } void key_reader() { digitalWrite(BUILTLED, HIGH ); if(led_delay>10) { digitalWrite(BUILTLED, LOW ); led_delay=0; int16_t adc_0, adc_1, adc_2, adc_3; adc_0 = ads.readADC_SingleEnded(0); // Чтение АЦП adc_1 = ads.readADC_SingleEnded(1); analogWrite(PWM, 0); delay(50); adc_2 = ads.readADC_SingleEnded(2); // чтение напряжения батареи на отключенной зарядке analogWrite(PWM, v_bat_pwm); adc_3 = ads.readADC_SingleEnded(3); // Расчёт фактических напряжений на каждом канале v_pow = float(adc_0) * 0.1875 / 1000.0; // Contr Voltage i_bat = float(adc_1) * 0.1875 / 1000.0; i_bat = ((v_pow/2)-i_bat)*10; // Currient v_bat = float(adc_2) * 0.1875 / 1000.0 * 6; // Bat Voltage v_out = float(adc_3) * 0.1875 / 1000.0 * 6; // Exit Voltage pwm_step=5; v_bat_d=0.1; float i_bat_d = 0.1; float i_bat_cc_a = i_bat_cc/1000; int cnt1 = 0; // print the readings in the Serial Monitor Serial.print(tm); if( v_bat>v_out) { v_bat_pwm=3*pwm_step; analogWrite(PWM, v_bat_pwm); Serial.print(" discharge "); if(v_bat5 && load_autostart==1) // запуск нагрузки { Serial.print(" LOAD enabled "); if(bat_manual==true) digitalWrite(LOAD, HIGH); bat_low=false; } } Serial.print(" > v_pow = " + String(v_pow)); Serial.print(", i_bat = " + String(i_bat)); Serial.print(", v_bat = " + String(v_bat)); Serial.println(", v_out = " + String(v_out)); Serial.print(", v_bat_max = " + String(v_bat_max)); Serial.print(", bat_time = " + String(bat_time)); Serial.println(" , bat_proc = " + String(bat_proc)); if((minu%5)==0 && (minu!=time_last) ) { if(i_bat<0) bat_time = (v_bat-v_bat_min)/( v_bat_prev-v_bat)*5; else bat_time = (v_bat_max-v_bat)/( v_bat-v_bat_prev)*5; bat_proc = (v_bat-v_bat_min)/((v_bat_max-v_bat_min)/100); v_bat_prev = v_bat; time_last=minu; } /* */ // регулировка режима CC/CV // если i_bat не отрицательный И v_bat меньше v_bat_max -D И i_bat <> i_bat_cc +-D : регулируем ток while до нормы // если i_bat не отрицательный И v_bat больше v_bat_max +D : регулируем напряжение while до нормы // если i_bat отрицательный : установить 3 х pwm_step while ( (v_batpwm_step*2 ) && ( (i_bat<(i_bat_cc_a-i_bat_d)) || i_bat>(i_bat_cc_a+i_bat_d) ) && cnt1<10 ) { if(i_bat<(i_bat_cc_a-i_bat_d) ) v_bat_pwm=v_bat_pwm+pwm_step; if(i_bat>(i_bat_cc_a+i_bat_d) ) v_bat_pwm=v_bat_pwm-pwm_step; analogWrite(PWM, v_bat_pwm); delay(200); // Get currient after delay adc_1 = ads.readADC_SingleEnded(1); i_bat = float(adc_1) * 0.1875 / 1000.0; i_bat = ((v_pow/2)-i_bat)*10; // Currient Serial.println(String(tm) + " Correct charge CC:" + " v_bat_pwm = " + String(v_bat_pwm) + " v_bat_max = " + String(v_bat_max) + " v_bat = " + String(v_bat) + " i_bat = " + String(i_bat)+ " i_bat_cc = " + String(i_bat_cc_a)); cnt1++; } while ( (v_bat>(v_bat_max+v_bat_d)) && (v_bat_pwm>pwm_step) ) { v_bat_pwm=v_bat_pwm-pwm_step; analogWrite(PWM, 0); // Get voltage on disabled charger delay(50); // Get currient after delay adc_2 = ads.readADC_SingleEnded(2); v_bat = float(adc_2) * 0.1875 / 1000.0 * 6; // Bat Voltage analogWrite(PWM, v_bat_pwm); Serial.println(String(tm) + " Correct charge CV:" + " v_bat_pwm = " + String(v_bat_pwm) + " v_bat_max = " + String(v_bat_max) + " v_bat = " + String(v_bat)); } } led_delay++; key_flag = false; } void handleRoot() { server.send ( 200, "text/html", footer + www_menu + bottom ); } void handleNotFound() { String s = " "; bool logout = false; if(server.uri()=="/index.php" && server.args()>0 && server.authenticate("admin", pin.c_str() ) ) { for ( uint8_t i = 0; i < server.args(); i++ ) { if(server.argName(i)=="logount" && server.arg(i)=="1") logout=true; // relays if(server.argName(i)=="r0") if(server.arg(i)=="on") digitalWrite(0, HIGH); else digitalWrite(0, LOW); if(server.argName(i)=="r12") if(server.arg(i)=="on") digitalWrite(12, HIGH); else digitalWrite(12, LOW); if(server.argName(i)=="r13") if(server.arg(i)=="on") { digitalWrite(13, HIGH); bat_manual=true; } else { digitalWrite(13, LOW); bat_manual=false; } if(server.argName(i)=="r15") if(server.arg(i)=="on") digitalWrite(15, HIGH); else digitalWrite(15, LOW); // if(server.argName(i)=="r1") if(server.arg(i)=="on") digitalWrite(1, HIGH); else digitalWrite(1, LOW); // if(server.argName(i)=="tx") if(server.arg(i)=="on") { digitalWrite(1, LOW); pinMode(1, FUNCTION_0); } // else { pinMode(1, FUNCTION_3); pinMode(1, OUTPUT); digitalWrite(1, LOW); } // reset if(server.argName(i) == "reset" && server.arg(i) == "run") ESP.reset(); //ESP.restart() if(server.argName ( i ) == "api_url_script_url" ) { if(api_url_script_url != server.arg ( i )) { api_url_script_url = server.arg ( i ); Serial.println("Settings> api_url_script_url:" + api_url_script_url ); int str_sz = api_url_script_url.length(); EEPROM.put(30, str_sz); for (int i = 0; i < str_sz; i++) EEPROM.put(34+i, api_url_script_url[i]); boolean res1 = EEPROM.commit(); Serial.print("Write to FLASH api_url_script_url:" + api_url_script_url + " Size:"); Serial.print(str_sz); if(res1==true) Serial.println(" OK"); else Serial.println(" FALSE"); } } if(server.argName ( i ) == "pin" ) { if(pin != server.arg ( i )) { pin = server.arg ( i ); Serial.println("Settings>PIN:" + pin ); EEPROM.put(0, pin.toInt()); boolean res1 = EEPROM.commit(); Serial.print("Write to FLASH PIN: " + pin); if(res1==true) Serial.println(" OK"); else Serial.println(" FALSE"); } } if(server.argName ( i ) == "v_bat_max" ) { if(String(v_bat_max) != server.arg ( i )) { String val = server.arg ( i ); v_bat_max = val.toFloat(); Serial.print("Settings> v_bat_max: "); Serial.print( v_bat_max ); int eval = v_bat_max*10; EEPROM.put(4, eval); boolean res1 = EEPROM.commit(); Serial.print("Write to FLASH v_bat_max: " + String(v_bat_max)); if(res1==true) Serial.println(" OK"); else Serial.println(" FALSE"); } } if(server.argName ( i ) == "v_bat_min" ) { if(String(v_bat_min) != server.arg ( i )) { String val = server.arg ( i ); v_bat_min = val.toFloat(); Serial.print("Settings> v_bat_min: "); Serial.print( v_bat_min ); int eval = v_bat_min*10; EEPROM.put(8, eval); boolean res1 = EEPROM.commit(); Serial.print("Write to FLASH v_bat_min: " + String(v_bat_min)); if(res1==true) Serial.println(" OK"); else Serial.println(" FALSE"); } } if(server.argName ( i ) == "v_bat_pwm" ) { if(String(v_bat_pwm) != server.arg ( i )) { String val = server.arg ( i ); v_bat_pwm = val.toInt(); Serial.print("Settings> v_bat_pwm: "); Serial.print( v_bat_pwm ); } } if(server.argName ( i ) == "load_autostart" ) { if(String(load_autostart) != server.arg ( i )) { String val = server.arg ( i ); load_autostart = val.toInt(); Serial.println("Settings> load_autostart:" + String(load_autostart) ); EEPROM.put(12, load_autostart); boolean res1 = EEPROM.commit(); Serial.print("Write to FLASH load_autostart: " + load_autostart); if(res1==true) Serial.println(" OK"); else Serial.println(" FALSE"); } } if(server.argName ( i ) == "i_bat_cc" ) { if(String(i_bat_cc) != server.arg ( i )) { String val = server.arg ( i ); i_bat_cc = val.toInt(); Serial.print("Settings> i_bat_cc: "); Serial.print( i_bat_cc ); int eval = i_bat_cc; EEPROM.put(16, eval); boolean res1 = EEPROM.commit(); Serial.print("Write to FLASH i_bat_cc: " + String(i_bat_cc)); if(res1==true) Serial.println(" OK"); else Serial.println(" FALSE"); } } } // arg for // for ( uint8_t i = 0; i < server.args(); i++ ) { s += " " + server.argName ( i ) + ": " + server.arg ( i ) + "
\n"; // server.send ( 200, "text/html", footer + s + button ); } // index s += www_menu + " LogOut
\n"; String xml = ""; String json = "{"; String s_tmp, b_color; s += "
"; // s += "Temperature = "; s += t; s += "'C
\n"; // xml += ""; xml+=t; xml+=""; // json += "\"temperature\": \""; json +=t; json +="\","; if(digitalRead(13)==1) s_tmp="off"; else s_tmp="on"; if(s_tmp=="off") b_color="64ed7b"; else b_color="ffffff"; s += "
Relay 13
\n"; xml += ""; xml +=digitalRead(13); xml +=""; json += "\"out13\": \""; json +=digitalRead(13); json +="\","; s += "Serial output: TX off TX on
\n"; s += "V cotr pow (V): "; s += String(v_pow); s += "
\n"; xml += ""; xml+=String(v_pow); xml+=""; json += "\"v_pow\": \""; json +=String(v_pow); json +="\","; s += "I bat (A): "; s += String(i_bat); s += "
\n"; xml += ""; xml+=String(i_bat); xml+=""; json += "\"i_bat\": \""; json +=String(i_bat); json +="\","; s += "V bat (V): "; s += String(v_bat); s += "
\n"; xml += ""; xml+=String(v_bat); xml+=""; json += "\"v_bat\": \""; json +=String(v_bat); json +="\","; s += "V out (V): "; s += String(v_out); s += "
\n"; xml += ""; xml+=String(v_out); xml+=""; json += "\"v_out\": \""; json +=String(v_out); json +="\","; s += "Bat level (%): "; s += String(bat_proc); s += "
\n"; xml += ""; xml+=String(bat_proc); xml+=""; json += "\"bat_proc\": \""; json +=String(bat_proc); json +="\","; s += "Bat left (min): "; s += String(bat_time); s += "
\n"; xml += ""; xml+=String(bat_time); xml+=""; json += "\"bat_time\": \""; json +=String(bat_time); json +="\","; s += "Bat LOW: "; s += String(bat_low); s += "
\n"; xml += ""; xml+=String(bat_low); xml+=""; json += "\"bat_low\": \""; json +=String(bat_low); json +="\","; String stat=""; if(i_bat<0) { stat="discharge"; if(v_bat \ ApiURL:
\n"; s += "PIN:
\n"; s += "
"; xml += ""; xml+=v_bat_max; xml+=""; json += "\"v_bat_max\": \""; json +=v_bat_max; json +="\","; s += "
"; xml += ""; xml+=v_bat_min; xml+=""; json += "\"v_bat_min\": \""; json +=v_bat_min; json +="\","; s += "
"; xml += ""; xml+=v_bat_pwm; xml+=""; json += "\"v_bat_pwm\": \""; json +=v_bat_pwm; json +="\","; s += "
"; xml += ""; xml+=i_bat_cc; xml+=""; json += "\"i_bat_cc\": \""; json +=i_bat_cc; json +="\","; // String sel0,sel1=""; if(load_autostart==1) sel1="selected"; else sel0="selected"; s += "
"; xml += ""; xml+=load_autostart; xml+=""; json += "\"load_autostart\": \""; json +=load_autostart; json +="\","; s += "    "; s += "
FreeMem = "; s += round(ESP.getFreeHeap()/1024); s += " kB
\n"; s += "TIME: "; s += String(tm); s += "
\n"; xml += ""; json += "\"TIME\": \""; json +=String(tm); json +="\","; s += "Uptime = "; s += round(millis() / (1000 * 60 * 60)); s += " hours
\n"; xml += ""; xml += round(millis() / (1000 * 60 * 60)); xml+=""; json += "\"Uptime\": \""; json +=round(millis() / (1000 * 60 * 60)); json +="\","; s += "MAC: "; s += chip_id; s += "
\n"; xml += ""; xml+=chip_id; xml+=""; json += "\"MAC\": \""; json +=chip_id; json +="\""; s += "

";// TX off TX on
\n"; // s += "Available input Params: temp_max[int], temp_delta[int], temp_auto[on/off], r5[on/off]
\n"; s += "
";

//      s += "URI: ";         s += server.uri();   s += "
\n"; s += " Method: "; s += ( server.method() == HTTP_GET ) ? "GET" : "POST"; s += " \n"; for ( uint8_t i = 0; i < server.args(); i++ ) { s += " " + server.argName ( i ) + ": " + server.arg ( i ) + " \n"; } s += " Arguments: "; s += server.args(); s += "
\n"; xml += "
"; json += "}"; if(server.uri()=="/index.php" ) { if (!server.authenticate("admin", pin.c_str() )) //Basic Auth Method with Custom realm and Failure Response //return server.requestAuthentication(BASIC_AUTH, www_realm, authFailResponse); //Digest Auth Method with realm="Login Required" and empty Failure Response //return server.requestAuthentication(DIGEST_AUTH); //Digest Auth Method with Custom realm and empty Failure Response //return server.requestAuthentication(DIGEST_AUTH, www_realm); //Digest Auth Method with Custom realm and Failure Response { return server.requestAuthentication(DIGEST_AUTH); } if(logout==false) server.send ( 200, "text/html", footer + s + bottom ); else server.send ( 401, "text/html", footer + www_menu + "401: Unauthorized"+bottom); } // } if(server.uri()=="/index.xml") server.send ( 200, "text/xml", xml ); if(server.uri()=="/index.json") server.send ( 200, "application/json", json ); } void key_event() { if(!tm_flag && !dht_get_flag) key_flag = true; } void dht_get_event() { if(!tm_flag ) dht_get_flag = true; } void tm_event() { tm_flag=true; } void setup() { Serial.begin(115200); Serial.println("System inits"); Serial.println("Set pins"); //pinMode(1, OUTPUT); // wifi kit 8 - не работает serial pinMode(3, FUNCTION_3);//disable rx pin!!! pinMode(PWM, OUTPUT); digitalWrite(PWM, LOW); analogWriteFreq(100); pinMode(0, OUTPUT); digitalWrite(0, LOW); pinMode(12, OUTPUT); digitalWrite(12, LOW); pinMode(13, OUTPUT); digitalWrite(13, LOW); pinMode(BUILTLED, OUTPUT); digitalWrite(BUILTLED, LOW); // BUILTLED 2 bat_manual=true; delay(300); Serial.println("Set timers"); // timers in sec: dht_get.attach(937, dht_get_event); // 937 tim.attach(30.0, tm_event); key_r.attach(1.0, key_event); chip_id = WiFi.macAddress(); delay(300); ///////////////// Wi-Fi //chip_id = ESP.getChipId(); chip_id = WiFi.macAddress(); Serial.println("WiFi manager start"); ////WiFiManager, Local intialization. Once its business is done, there is no need to keep it around WiFiManager wm; wm.setConfigPortalTimeout(60); // auto close configportal after n seconds bool res; //// res = wm.autoConnect(); // auto generated AP name from chipid //// res = wm.autoConnect("AutoConnectAP"); // anonymous ap res = wm.autoConnect("ESP-AP","12344321"); // password protected ap if(!res) { Serial.println("Failed to connect"); // ESP.restart(); } else { //if you get here you have connected to the WiFi Serial.println("connected...yeey :)"); } delay(1000); /////////////////// eeprom Serial.println("Read EEPROM settings"); EEPROM.begin(1024); // карта значений int addr, val; EEPROM.get(0, val); if(val<10000) pin=String(val); Serial.println("PIN: "+pin); val=0; v_bat_max=8; v_bat_min=6; v_bat_pwm=0; load_autostart=0; i_bat_cc=200; EEPROM.get(4, val); if(val<500) v_bat_max= (float)val/10.0; Serial.println("v_bat_max: " + String(val)); val=0; EEPROM.get(8, val); if(val<500) v_bat_min=(float)val/10.0; Serial.println("v_bat_min: " + String(val)); val=0; EEPROM.get(12, val); if(val<500) load_autostart=val; Serial.println("load_autostart: " + String(load_autostart)); val=0; EEPROM.get(16, val); if(val<500) i_bat_cc=val; Serial.println("i_bat_cc: " + String(i_bat_cc)); val=0; Serial.print("reading api_script_url.. Size:"); EEPROM.get(30, val); Serial.println(val); char t; if(val>0 && val<150) for (int i = 0; i < val; i++) { EEPROM.get(34+i, t); api_url_script_url+=t; } Serial.println(api_url_script_url); int slsh=0; for (int i = 1; i < api_url_script_url.length(); i++) { if(api_url_script_url[i]=='/') slsh++; if(slsh==2 && api_url_script_url[i]!='/') host += api_url_script_url[i]; if(slsh>2 ) url += api_url_script_url[i]; } // Serial.print(api_url_script_url.length()); Serial.println(api_url_script_url); Serial.println("Host:" + host +" url" + url + ". "); if(api_url_script_url.substring(0,4)!="http") { Serial.println("Host not valid:" + api_url_script_url.substring(0,5)); host=""; } // Start WWW server server.on ( "/", handleRoot ); //server.on ( "/test.svg", drawGraph ); //server.on ( "/inline", []() { server.send ( 200, "text/plain", "this works as well" ); } ); server.onNotFound ( handleNotFound ); server.begin(); snprintf ( footer, 400, " Wemos D1 - SOLARs\ \ \ \

Wemos D1 - SOLAR

"); snprintf ( bottom, 30, " " ); Serial.println("WWW Server started"); // Print the IP address Serial.println(WiFi.localIP()); // dht_get_flag = true; // http_get_finc( 1, "", 0); // sync time ads.setGain(GAIN_TWOTHIRDS); // ВОЗМОЖНЫЕ ВАРИАНТЫ УСТАНОВКИ КУ: // ads.setGain(GAIN_TWOTHIRDS); | 2/3х | +/-6.144V | 1bit = 0.1875mV | // ads.setGain(GAIN_ONE); | 1х | +/-4.096V | 1bit = 0.125mV | // ads.setGain(GAIN_TWO); | 2х | +/-2.048V | 1bit = 0.0625mV | // ads.setGain(GAIN_FOUR); | 4х | +/-1.024V | 1bit = 0.03125mV | // ads.setGain(GAIN_EIGHT); | 8х | +/-0.512V | 1bit = 0.015625mV | // ads.setGain(GAIN_SIXTEEN); | 16х | +/-0.256V | 1bit = 0.0078125mV | ads.begin(); // Инициализация модуля ADS1115 } void loop() { if(tm_flag) time_finc(); if(key_flag && !dht_get_flag && !tm_flag) key_reader(); if(!key_flag && !dht_get_flag && !tm_flag) {// ArduinoOTA.handle(); server.handleClient();// http_server(); } if (!key_flag && !tm_flag && dht_get_flag) { Serial.println("dht_get_flag"); // check wifi if(WiFi.status() != WL_CONNECTED) { Serial.println("Not connected"); } else { Serial.println("IP: " + device_ip + " MAC: " + chip_id); http_get_finc( 1, "", 0); // sync time } dht_get_flag = false; } }