Страница на этапе разработки
В данном уроке мы разработаем систему контроля за потреблением тока на микроконтроллере ESP826. Суть нашего устройства заключается в том, что мы подключаем к устройству две нагрузки, самый простой пример это питание квартиры. К одному каналу мы подключаем квартиру, ко второму каналу мы подключаем бойлер. При увеличении нагрузки на первом канале мы автоматически отключаем бойлер тем самым уменьшаем нагрузку на входную сеть, ограничив потребляемый ток до допустимого значения: как пример на входе питания в квартиру ставят выключатель на 25А, бойлер потребляет от 8 до 12 ампер, если включить чайник и микроволновую печь, с большой долей вероятности у Вас сработает защита от перегрузки, так как суммарный ток будет превышать более 25 Ампер, — отключив автоматически бойлер, мы избежим неприятного обесточивания квартиры.
В качестве микроконтроллера мы возьмем микроконтроллер ESP8266 на плате WeMos D1 mini :
Данный выбор обусловлен тем, что настроив точку доступа мы сможем с телефона настраивать наше устройство, тем самым нам не нужно будет иметь дополнительные кнопки управления и мы можем полностью обойтись от индикации. В нашем примере мы все таки подключим индикацию используя семи сегментные индикаторы подключенные через сдвиговые регистры:
Так же мы используем плату для измерения переменного тока:
Теперь нам осталось собрать схему и приступить к написанию программного кода.
Схема нашего устройства:
Программный код:
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <EEPROM.h>
const char *ssid = "myesp8266";
const char *password = "12345678";
//ip adres 192.168.4.1
ESP8266WebServer server(80);
const int led = LED_BUILTIN;
uint8_t Imax=24;
uint8_t Iogr=8;
byte adress=0;
uint8_t Imaxr=24;
uint8_t Iogrr=8;
void handleRoot() {
Imax =Imaxr;
Iogr =Iogrr;
server.send(200, "text/html", SendHTML(0,0,0,0,0));
}
void handleRootImaxAdd() {
server.send(200, "text/html", SendHTML(1,0,0,0,0));
}
void handleRootImaxMin() {
server.send(200, "text/html", SendHTML(0,1,0,0,0));
}
void handleRootIogrAdd() {
server.send(200, "text/html", SendHTML(0,0,1,0,0));
}
void handleRootIogrMin() {
server.send(200, "text/html", SendHTML(0,0,0,1,0));
}
void handleRootSave() {
server.send(200, "text/html", SendHTML(0,0,0,0,1));
}
void handle_NotFound(){
server.send(404, "text/plain", "Not found!");
}
void setup() {
EEPROM.begin(4);
Imaxr=EEPROM.read(adress);
adress+=sizeof(uint8_t);
Iogrr=EEPROM.read(adress);
adress=0;
WiFi.softAP(ssid, password);
IPAddress apip = WiFi.softAPIP();
server.on("/", handleRoot);
server.on("/Imax+", handleRootImaxAdd);
server.on("/Imax-", handleRootImaxMin);
server.on("/Iogr+", handleRootIogrAdd);
server.on("/Iogr-", handleRootIogrMin);
server.on("/save", handleRootSave);
server.onNotFound(handle_NotFound);
server.begin();
Serial.println("HTTP server started");
}
void loop(void){
server.handleClient();
}
String SendHTML(uint8_t t1, uint8_t t2, uint8_t t3, uint8_t t4, uint8_t t5){
String str = "<!DOCTYPE html> <meta http-equiv=\"content – type\" content=\"text/html; charset = UTF-8 \">";
str += "<style>";
str += "html{font-family: Helvetica; display:inline-block; margin:0px auto; text-align: center;}";
str += "h1{color: #0F3376; padding:2vh;}";
str += "p{font-size:1.5rem;}";
str += ".button{background-color: #e7bd3b; border: none; border-radius:4px; color: white; padding:16px 40px; text-decoration: none; font-size:30px; margin:2px; cursor: pointer;}";
str += ".button1{background-color: #4286f4;}";
str += ".form-group {display: inline-block;}";
str += "</style>";
str += "</head>";
str += "<body>";
str += "<h1>Setting relay parameters<h1>";
if (t1){
Imax++;
if (Imax >=24){Imax=24;}
}
if (t2){
Imax--;
if(Imax <=8){Imax=8;}
}
if (t3){
Iogr++;
if (Iogr >=24){Iogr=24;}
}
if (t4) {
Iogr--;
if(Iogr <=8){Iogr=8;}
}
str +=" <h1>Maximum current value: ";
str += returtTxt(Imax);
str +="</h1>";
str +=" <h1>Limit current: ";
str += returtTxt(Iogr);
str +="</h1>";
//кнопки
str += "<p>Maximum current value</p>";
str += "<br>";
str += "<div class=\"form-group\">";
str += "<p><a href=\"/Imax+\"><button class=\"button\">+</button></a></p>";
str += "</div>";
str += "<div class=\"form-group\">";
str += "<p><a href=\"/Imax-\"><button class=\"button button1\">-</button></a></p>";
str += "</div>";
str += "<br>";
str += "<p>Limit current</p>";
str += "<br>";
str += "<div class=\"form-group\">";
str += "<p><a href=\"/Iogr+\"><button class=\"button\">+</button></a></p>";
str += "</div>";
str += "<div class=\"form-group\">";
str += "<p><a href=\"/Iogr-\"><button class=\"button button1\">-</button></a></p>";
str += "</div>";
str += "<br>";
str += "<div class=\"form-group\">";
str += "<p><a href=\"/save\"><button class=\"button\">save</button></a></p>";
str += "</div>";
str += "</body>";
str +="</html>";
if(t5){
EEPROM.write(adress,Imax);
adress+=sizeof(uint8_t);
EEPROM.write(adress,Iogr);
EEPROM.commit();
adress=0;
}
return str;
}
String returtTxt(int In){
String txt =" ";
switch (In){
case 24:
txt = " <h1>24</h1>";
break;
case 23:
txt = " <h1>23</h1>";
break;
case 22:
txt = " <h1>22</h1>";
break;
case 21:
txt = " <h1>21</h1>";
break;
case 20:
txt = " <h1>20</h1>";
break;
case 19:
txt = " <h1>19</h1>";
break;
case 18:
txt = " <h1>18</h1>";
break;
case 17:
txt = " <h1>17</h1>";
break;
case 16:
txt = " <h1>16</h1>";
break;
case 15:
txt = " <h1>15</h1>";
break;
case 14:
txt = " <h1>14</h1>";
break;
case 13:
txt = " <h1>13</h1>";
break;
case 12:
txt = " <h1>12</h1>";
break;
case 11:
txt = " <h1>11</h1>";
break;
case 10:
txt = " <h1>10</h1>";
break;
case 9:
txt
= " <h1>9</h1>";
break;
case 8:
txt
= " <h1>8</h1>";
break;
}
return txt;
}
<<— Предыдущий урок
СОДЕРЖАНИЕ
Следующий урок —>>
<<— Предыдущий урок
СОДЕРЖАНИЕ
Следующий урок —>>