From f18723883cd5596534a43cfab65420c7ce7feaa4 Mon Sep 17 00:00:00 2001 From: SmartUaWIn Date: Mon, 15 Mar 2021 22:30:39 +0200 Subject: [PATCH] =?UTF-8?q?=D0=BA=D1=83=D1=85=D0=BD=D1=8F,=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BF=D0=BB=D0=B0=D0=B2=D0=BE=D0=BA.=20=D0=BF=D1=80=D0=B5?= =?UTF-8?q?=D1=80=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5,=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BD=D1=8F=20=D1=84?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=86=D0=B8=D1=8F=20=D0=BE=D1=82=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BA=D0=B8,=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BD=D0=BD=D0=B0=D1=8F=20=D1=84=D1=83=D0=BD?= =?UTF-8?q?=D0=BA=D1=86=D0=B8=D1=8F=20=D0=B2=D1=8B=D0=B2=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=B5=D0=BA=D1=80=D0=B0=D0=BD,=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=BA=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B1=D0=B8=D0=B2=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=B8=D1=82=D0=BE=D0=B3=20=D0=BF=D1=80=D0=B8=D0=B4?= =?UTF-8?q?=D1=83=D0=BC=D0=B0=D0=BB=20=D0=BA=D0=B0=D0=BA=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D1=89=D0=B5=20=D0=BC=D0=B5=D0=BD=D1=8F=D1=82=D1=8C=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=20=D0=B2=D1=81=D0=B5=D0=B3?= =?UTF-8?q?=D0=BE=20=D0=B4=D0=B0=D1=82=D1=87=D0=B8=D0=BA=D0=B0.=20=D0=92?= =?UTF-8?q?=D0=BE=D0=BF=D1=80=D0=BE=D1=81=20=D1=81=20=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B5=D0=B4=D0=B6=D0=B5=D1=80=D0=BE=D0=BC=20=D0=B2=D0=B8=D1=84?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AAOffice_kitchen.ino | 625 +++++++++++++++++++++++++++++++++++++++++++ README.md | 35 ++- arrow.c | 13 + connect.c | 13 + error.c | 13 + wateok.c | 13 + wifi.c | 13 + 7 files changed, 724 insertions(+), 1 deletion(-) create mode 100644 AAOffice_kitchen.ino create mode 100644 arrow.c create mode 100644 connect.c create mode 100644 error.c create mode 100644 wateok.c create mode 100644 wifi.c diff --git a/AAOffice_kitchen.ino b/AAOffice_kitchen.ino new file mode 100644 index 0000000..398e08f --- /dev/null +++ b/AAOffice_kitchen.ino @@ -0,0 +1,625 @@ +/* +Отправка данных на MQTT про обновление +*/ + +#include // https://github.com/tzapu/WiFiManager +#include //Сохранение настроек хеша прошивки + +#include +#include //Библиотека ОТА обновлений +#include "M5Atom.h" //Библиотека атома для функции Led и Кнопки, можно упразднить и убрать + +#include //Udp клиент +#include //NTP запрос времени +#include //Внутреннее время +#include //Библиотека дял I2C + +#include //Mtqq +#include //Упакова в JSon - удобная библиотека +#include + +//Наша кнопочка при нажатии на которую произойдет вызов wifi менеджера и перезагрузка в станцию +#define TRIGGER_PIN 39 +#define safetyPin 33 +#define buzzerPin 23 +#define VersionSW 2 + +extern const unsigned char image_arrow[77], image_x[77], image_error[77], image_wateok[77], image_connect[77], image_wifi[77]; + +//const unsigned int VersionSW = 5; //65536 Версия прошивки +byte errorID = 0; //Сбор и вывод ошибок + +//5 + +WiFiManager wm; // обьект менеджера +WiFiManagerParameter custom_field; +Preferences OTApreferences; //Обьект хранения настроек хеша прошивки +StaticJsonDocument<200> doc; + +WiFiClient espClient; +PubSubClient MqttClient(espClient); +IPAddress IpMqtt; + +WiFiUDP ntpUDP; +NTPClient timeClient(ntpUDP, "0.ua.pool.ntp.org", 7200, 60000); //Собственно сервер времени смещение и частоат запроса, но он вручную + +const PROGMEM char *willmess = "{\"conn\":\"err\"}"; + +const PROGMEM char *mqttHostName = "cctv.automation.art"; //Хостнейм брокера 192.168.89.210 cctv.automation.art:8889 +unsigned int mqttPort = 8889; // 1883 //Порт брокера 1883 +const PROGMEM char *mqttLogin = NULL, //Логин пароль - необходимо сменить код при connect() + *mqttPass = NULL; +const char *mqttIPHost; //тут хранится IP хоста по хостнейму + +unsigned long timingUpdate, timingReqSensor, timingSendMqtt; //Таймеры для millis() +int PROGMEM nextM5Update = 450000; //каждые 7.5 минут запрос обновления с сервера //опрос датчиков раз в 10 секунд +short int PROGMEM nextMqttSend = 500; //Отправка + +String getMacAddress(); +String macc = getMacAddress(); + +bool buzFlag = true; +bool mqttSendFlag = false; +bool safetyStateNow = true, safetyStateOld = true; +int reqCounter = 0; +short int rssi = 0; +bool flagHIGH = true; +char bufTopic[140], bufWillTopic[150]; + +volatile short int debounce = 0; + +void IRAM_ATTR detectWaterOn() +{ + if (millis() - debounce >= 100 && digitalRead(safetyPin) == LOW) + { + debounce = millis(); + buzFlag = true; + detachInterrupt(digitalPinToInterrupt(safetyPin)); + } +} + +//Настройки +void setup() +{ + Serial.begin(115200); + + M5.begin(true, false, true); + delay(50); + // Wire.begin(25, 21); //Пины для I2c на ATOM + M5.dis.setBrightness(30); + + pinMode(safetyPin, INPUT_PULLDOWN); //Пин датчика для работы + pinMode(buzzerPin, OUTPUT); + digitalWrite(buzzerPin, LOW); + + attachInterrupt(digitalPinToInterrupt(safetyPin), detectWaterOn, CHANGE); + // LOW – прерывание будет запущено, если на контакте будет значение «LOW» + // HIGH – прерывание будет запущено, если на контакте будет значение «HIGH» + // CHANGE – прерывание будет запущено, если значение на контакте изменится (например, с «LOW» на «HIGH» или с «HIGH» на «LOW») + // FALLING – прерывание будет запущено, если значение на контакте изменится с «HIGH» на «LOW» + // RISING – прерывание будет запущено, если значение на контакте изменится с «LOW» на «HIGH» + + WiFi.mode(WIFI_STA); + + Serial.setDebugOutput(true); + + String topicTemp = "aastudio/" + macc + "/data/0"; + String willTopicTemp = "aastudio/" + macc + "/status"; + // String angleTopicTemp = topicTemp + "/setangle"; + + Serial.println(topicTemp); + Serial.println(willTopicTemp); + ////Serial.println(angleTopicTemp); + + topicTemp.toCharArray(bufTopic, topicTemp.length() + 1); + willTopicTemp.toCharArray(bufWillTopic, willTopicTemp.length() + 1); + //angleTopicTemp.toCharArray(bufAngleTopic, angleTopicTemp.length() + 1); + + disPreSet((uint8_t *)image_connect, 0, 0); + + //Serial.println("\n Starting station"); + pinMode(TRIGGER_PIN, INPUT); + // wm.resetSettings(); // wipe settings + // add a custom input field + //int customFieldLength = 40; + // new (&custom_field) WiFiManagerParameter("customfieldid", "Custom Field Label", "Custom Field Value", customFieldLength,"placeholder=\"Custom Field Placeholder\""); + // test custom html input type(checkbox) + // new (&custom_field) WiFiManagerParameter("customfieldid", "Custom Field Label", "Custom Field Value", customFieldLength,"placeholder=\"Custom Field Placeholder\" type=\"checkbox\""); // custom html type + // test custom html(radio) + const char *custom_radio_str = "
One
Two
Three"; + new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input + wm.addParameter(&custom_field); + wm.setSaveParamsCallback(saveParamCallback); + // custom menu via array or vector + // menu tokens, "wifi","wifinoscan","info","param","close","sep","erase","restart","exit" (sep is seperator) (if param is in menu, params will not show up in wifi page!) + // const char* menu[] = {"wifi","info","param","sep","restart","exit"}; + // wm.setMenu(menu,6); + std::vector menu = {"wifi", "info", "param", "sep", "restart", "exit"}; + wm.setMenu(menu); + // set dark theme + wm.setClass("invert"); + //set static ip + // wm.setSTAStaticIPConfig(IPAddress(10,0,1,99), IPAddress(10,0,1,1), IPAddress(255,255,255,0)); // set static ip,gw,sn + // wm.setShowStaticFields(true); // force show static ip fields + // wm.setShowDnsFields(true); // force show dns field always + // wm.setConnectTimeout(20); // how long to try to connect for before continuing + wm.setConfigPortalTimeout(60); // auto close configportal after n seconds + // wm.setCaptivePortalEnable(false); // disable captive portal redirection + // wm.setAPClientCheck(true); // avoid timeout if client connected to softap + // wifi scan settings + // wm.setRemoveDuplicateAPs(false); // do not remove duplicate ap names (true) + wm.setMinimumSignalQuality(10); // set min RSSI (percentage) to show in scans, null = 8% + // wm.setShowInfoErase(false); // do not show erase button on info page + // wm.setScanDispPerc(true); // show RSSI as percentage not graph icons + // wm.setBreakAfterConfig(true); // always exit configportal even if wifi save fails + wm.setWiFiAutoReconnect(true); // if true, enable autoreconnecting + + bool res; + // res = wm.autoConnect(); // auto generated AP name from chipid + // res = wm.autoConnect("AutoConnectAP"); // anonymous ap + res = wm.autoConnect("KitchenM5Portal", "12345678"); // Подключение к анонимной точке доступа + if (!res) + { + Serial.println("Failed to connect or hit timeout"); + //ESP.restart(); + } + else + { + Serial.println("connected - OK"); + } + + //Запрос IP сервера MQTT и установка сервера + setMqttServer(); + reqNtpTime(); +} + +//Установка сервера и порта +void setMqttServer() +{ + mdns_init(); + + IPAddress IpMqtt, ipaddr; + ipaddr = MDNS.queryHost(mqttHostName); // .local omitted + // //Serial.println(ipaddr.toString()); + if (ipaddr.toString() == "0.0.0.0") + { + Serial.println("Trying again to resolve mDNS"); + + int err = WiFi.hostByName(mqttHostName, IpMqtt); + if (err == 1) + { + delay(50); + setServCall(IpMqtt); + } + else + { + errorID = 1; + Serial.print("Error code hostByName(): "); + Serial.println(err); + } + } + else + { + setServCall(ipaddr); + } +} + +void setServCall(IPAddress SetIpaddr) +{ + MqttClient.setServer(SetIpaddr, mqttPort); + // MqttClient.setCallback(callback); +} + +//Функция получения данных из MQTT если мы подпишемся на топики +// void callback(char *topic, byte *payload, unsigned int length) +// { +// //Serial.print("Message arrived ["); +// //Serial.print(topic); +// //Serial.print("] "); +// for (int i = 0; i < length; i++) +// { +// //Serial.print((char)payload[i]); +// } +// //Serial.println(); +// } + +//Запрос времени NTP и установка локлаьного времени +void reqNtpTime() +{ + timeClient.update(); + setTime(timeClient.getEpochTime()); + Serial.println(timeClient.getEpochTime()); + Serial.println("<=ntp====now=>"); + time_t t = now(); + Serial.println(t); +} + +//Нажатие кнопки для сброса +void checkButton() +{ + Serial.println("Button RESET Pressed"); + + disconnectMQTT(); + wm.resetSettings(); + ESP.restart(); +} + +String getParam(String name) +{ + String value; + if (wm.server->hasArg(name)) + { + value = wm.server->arg(name); + } + return value; +} + +void saveParamCallback() +{ + //Serial.\println("[CALLBACK] saveParamCallback fired"); + //Serial.\println("PARAM customfieldid = " + getParam("customfieldid")); + getParam("customfieldid"); +} + +//Обновление прошивки, происходит проверка и загрузка +//Делается Get запрос на хостинг проверяется хеш, если хеш +void OTAUpdate() +{ + ////Serial.\println("OTAUpdate()"); + bool flagOTA = false; + String keyOTA; + String payload; + + OTApreferences.begin("ota-config"); + + if (WiFi.status() == WL_CONNECTED) + { + + HTTPClient http; + String serverPath = "http://meteosence.s-host.net/airqa/airquality.php?meteopas=345sd4fJfj5Jjfm594d45de&mac=" + macc + "&meteodata=gethash"; + + http.begin(serverPath.c_str()); + int httpResponseCode = http.GET(); + + if (httpResponseCode > 0) + { + Serial.print("HTTP Response code: "); + Serial.println(httpResponseCode); + payload = http.getString(); + Serial.println(payload); + + if (payload != "errno" || payload != "errfi") + { + + keyOTA = OTApreferences.getString("md5HashOTA"); + + if (keyOTA.length() <= 0) + { + OTApreferences.putString("md5HashOTA", "undifined"); + } + + keyOTA = OTApreferences.getString("md5HashOTA"); + + if (payload != keyOTA) + { + flagOTA = true; + OTApreferences.putString("md5HashOTA", payload); + //Serial.println("flagOTA = true;"); + } + } + else + { + //Serial.println("Hosting return error HASH or error REQUEST"); + errorID = 2; + } + } + else + { + errorID = 3; + Serial.print("Error code HTTP: "); + Serial.println(httpResponseCode); + } + // Free resources + http.end(); + } + else + { + errorID = 4; + Serial.println("WiFi Disconnected"); + } + + if (flagOTA == true) + { + flagOTA = false; + //Serial.println("flagOTA = false;"); + + t_httpUpdate_return ret = ESPhttpUpdate.update("http://meteosence.s-host.net/airqa/kitchen/kithenatoms.bin"); + + //После update ничего не происходит, такая вот особенность. + //Если все прошло хорошо, перезагрузка на новую прошивку + //Serial.print("ret "); + //Serial.println(ret); + + switch (ret) + { + + case HTTP_UPDATE_FAILED: + //Serial.printf("HTTP_UPDATE_FAILD Error (%d): %s", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()); + //Serial.println(ESPhttpUpdate.getLastError()); + //Serial.println(ESPhttpUpdate.getLastErrorString().c_str()); + //Serial.println("HTTP_UPDATE_FAILD Error"); + + ESP.restart(); + break; + + case HTTP_UPDATE_NO_UPDATES: + //Serial.println("HTTP_UPDATE_NO_UPDATES"); + + ESP.restart(); + break; + + case HTTP_UPDATE_OK: + //Serial.println("HTTP_UPDATE_OK"); + + ESP.restart(); + break; + } + } + OTApreferences.end(); +} + +//Получение мак адреса +String getMacAddress() +{ + uint8_t baseMac[6]; + esp_read_mac(baseMac, ESP_MAC_WIFI_STA); + char baseMacChr[18] = {0}; + sprintf(baseMacChr, "%02X%02X%02X%02X%02X%02X", baseMac[0], baseMac[1], baseMac[2], baseMac[3], baseMac[4], baseMac[5]); + return String(baseMacChr); +} + +//Отправка данных по MQTT +int SendMqttReq(bool sendVal = true, bool sendStatus = true, byte statusConn = 1) +{ + if (mqttSendFlag == true) + { + char resultString[200]; + String JsonData = ""; + rssi = WiFi.RSSI(); + unsigned long timeNow = now(); + + if (sendVal == true) + { + //Serial.println("Data in SendMqttReq()"); + // doc["mac"] = String(getMacAddress()); + doc["val"] = (int)digitalRead(safetyPin); + doc["ts"] = timeNow; + + serializeJson(doc, JsonData); + + doc.remove("val"); + doc.remove("ts"); + + doc.clear(); + doc.garbageCollect(); + + Serial.println(JsonData); //Вывод JSON строки в консоль + JsonData.toCharArray(resultString, JsonData.length() + 1); + MqttClient.publish(bufTopic, resultString, true); + } + + if (sendStatus == true) + { + char *conn; + + switch (statusConn) + { + case 1: + conn = "on"; + break; + + case 2: + conn = "off"; + break; + + case 3: + conn = "slp"; + break; + + default: + break; + } + + doc["conn"] = conn; + doc["rssi"] = rssi; + doc["bsid"] = WiFi.BSSIDstr(); + //doc["lasterror"] = errorID; + doc["ts"] = timeNow; + doc["sv"] = VersionSW; + + JsonData = ""; + serializeJson(doc, JsonData); + Serial.println(JsonData); //Вывод JSON строки в консоль + + doc.clear(); + doc.garbageCollect(); + + JsonData.toCharArray(resultString, JsonData.length() + 1); + MqttClient.publish(bufWillTopic, resultString, true); + } + ////Serial.println("SentToTopic - ok"); + } + return 0; +} + +//Переподключение при петери связи с MQTT +//10 раз проверили и вернулись в общий цикл что бы вдруг что втянуть обновления +void reconnectMqtt() +{ + //clientId += String(random(0xffff), HEX); + //clientId.c_str() + //MqttClient.connect(macc.c_str(), mqttLogin, mqttPass + + byte circle = 0; + while (!MqttClient.connected()) + { + Serial.println("MQTT reconnect..."); + circle++; + if(circle == 2) + { + disPreSet((uint8_t *)image_error, 0, 0); + break; + } + + const char *clientId = macc.c_str(); + //macc += String(random(0xffff), HEX); + if(MqttClient.connect(clientId, bufWillTopic, 2, true, willmess)) + { + mqttSendFlag = true; + SendMqttReq(true, true, 1); + } + else + { + Serial.print("MqttClient.state() = "); + Serial.println(MqttClient.state()); + /* + -4 : MQTT_CONNECTION_TIMEOUT - the server didn't respond within the keepalive time + -3 : MQTT_CONNECTION_LOST - the network connection was broken + -2 : MQTT_CONNECT_FAILED - the network connection failed + -1 : MQTT_DISCONNECTED - the client is disconnected cleanly + 0 : MQTT_CONNECTED - the client is connected + 1 : MQTT_CONNECT_BAD_PROTOCOL - the server doesn't support the requested version of MQTT + 2 : MQTT_CONNECT_BAD_CLIENT_ID - the server rejected the client identifier + 3 : MQTT_CONNECT_UNAVAILABLE - the server was unable to accept the connection + 4 : MQTT_CONNECT_BAD_CREDENTIALS - the username/password were rejected + 5 : MQTT_CONNECT_UNAUTHORIZED - the client was not authorized to connect + */ + errorID = 5; + mqttSendFlag = false; + delay(1000); + } + } +} + +void loop() +{ + M5.update(); + if (buzFlag == true) + { + disPreSet((uint8_t *)image_arrow, 0, 0); + + safetyStateNow = false; + flagHIGH = true; + buzAlarm(true); + Serial.println(" buzFlag == true "); + } + + if (digitalRead(safetyPin) == HIGH && flagHIGH == true) + { + Serial.println(" digitalRead(safetyPin) == HIGH "); + buzFlag = false; + buzAlarm(false); + safetyStateNow = true; + + disPreSet((uint8_t *)image_wateok, 0, 0); + flagHIGH = false; + + attachInterrupt(digitalPinToInterrupt(safetyPin), detectWaterOn, CHANGE); + // LOW – прерывание будет запущено, если на контакте будет значение «LOW» + // HIGH – прерывание будет запущено, если на контакте будет значение «HIGH» + // CHANGE – прерывание будет запущено, если значение на контакте изменится (например, с «LOW» на «HIGH» или с «HIGH» на «LOW») + // FALLING – прерывание будет запущено, если значение на контакте изменится с «HIGH» на «LOW» + // RISING – прерывание будет запущено, если значение на контакте изменится с «LOW» на «HIGH» + } + + if (safetyStateNow != safetyStateOld) + { + SendMqttReq(true, true, 1); + safetyStateOld = safetyStateNow; + } + + if (WiFi.status() == WL_CONNECTED) + { + if (!MqttClient.connected()) + { + errorID = 7; + reconnectMqtt(); + } + } + else + { + Serial.println(WiFi.status()); + disPreSet((uint8_t *)image_wifi, 0, 0); + errorID = 6; + delay(3000); + ESP.restart(); + } + + // 40 секунд и происходит сброс настроек WIFI + if (M5.Btn.wasReleasefor(40000)) + { + checkButton(); + } + + if (M5.Btn.wasReleasefor(2000)) + { + buzAlarm(false); + } + + //По таймеру запруск обновления прошивки + if (millis() - timingUpdate > nextM5Update) + { + reqNtpTime(); + OTAUpdate(); + // //Serial.print("OTAUpdate() - "); + // //Serial.println(millis()); + timingUpdate = millis(); + } + + //Таймер отправки данных в брокер + + MqttClient.loop(); +} + +int disconnectMQTT() +{ + SendMqttReq(false, true, 2); + + MqttClient.disconnect(); + return 0; +} + +// disPreSet((uint8_t *)image_wateok,0,0); +int disPreSet(uint8_t *image_what, int8_t x, int8_t y) +{ + // M5.dis.fillpix(0x000000); + M5.dis.clear(); + delay(100); + M5.dis.displaybuff(image_what, x, y); + delay(100); + + return 0; +} + +int buzAlarm(bool buzFlag) +{ + Serial.print("Buzzer: "); + Serial.println(buzFlag); + + if (buzFlag == true) + { + digitalWrite(buzzerPin, HIGH); + delay(100); + digitalWrite(buzzerPin, LOW); + delay(100); + digitalWrite(buzzerPin, HIGH); + delay(200); + digitalWrite(buzzerPin, LOW); + delay(200); + } + else + { + digitalWrite(buzzerPin, LOW); + } + return 0; +} diff --git a/README.md b/README.md index 246513b..0137aac 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,36 @@ # AAOffice_kitchen -Устройство мониторинга датчика уровня воды \ No newline at end of file +Устройство мониторинга датчика уровня воды + +Подать питание после подключения датчика. + +aastudio/94B97E92C24C/data/0 + +{"val":1,"ts":1615825905} + + +aastudio/94B97E92C24C/status +{"conn":"on","rssi":-74,"bsid":"70:4F:57:AA:2F:8A","ts":1615825905,"sv":2} +{"conn": "err"} + + + +Обозначения на схеме: + +"+" - подача питания 5 В (для удобства подключения всех проводов с одной стороны). Можно взять,но не более 0.5А (предохранитель) если питание от USB. +"-" - ground +"->" - уходящий сигнал на датчик 3.3В +"<-" - приходящий сигнал через поплавок + + +{"swver":5,"waterlevel":1,"rssi":-69,"bsid":"70:4F:57:AA:2F:8A","lasterror":7,"time":1615576359} + + + +Экран + +https://github.com/m5stack/M5Atom/blob/master/README.md + +http://wikihandbk.com/wiki/ESP32:%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B/%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ESP32_%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%B5_%D1%81_PIR-%D0%B4%D0%B0%D1%82%D1%87%D0%B8%D0%BA%D0%BE%D0%BC_%D0%B4%D0%B2%D0%B8%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F + + diff --git a/arrow.c b/arrow.c new file mode 100644 index 0000000..b2b985b --- /dev/null +++ b/arrow.c @@ -0,0 +1,13 @@ +// File URLD:/aarepos/AAOffice_kitchen/arrow.c +// Image Size: width=5,height=5 +// Data Size: 77 +const unsigned char image_arrow[77]= +{ +/* width 005 */ 0x05, +/* height 005 */ 0x05, +/* Line 000 */ 0x00,0x00,0xff, 0x00,0x00,0xff, 0xff,0x00,0x04, 0x00,0x00,0xff, 0x00,0x00,0xff, // +/* Line 001 */ 0x00,0x00,0x00, 0xff,0x00,0x04, 0xff,0x00,0x04, 0xff,0x00,0x04, 0x00,0x00,0x00, // +/* Line 002 */ 0xff,0x00,0x04, 0x00,0x00,0x00, 0xff,0x00,0x04, 0x00,0x00,0x00, 0xff,0x00,0x04, // +/* Line 003 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x04, 0x00,0x00,0x00, 0x00,0x00,0x00, // +/* Line 004 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x00,0x04, 0x00,0x00,0x00, 0x00,0x00,0x00, // +}; diff --git a/connect.c b/connect.c new file mode 100644 index 0000000..a4cd460 --- /dev/null +++ b/connect.c @@ -0,0 +1,13 @@ +// File URLD:/repositories/AAOffice_warn/connect.c +// Image Size: width=5,height=5 +// Data Size: 77 +const unsigned char image_connect[77]= +{ +/* width 005 */ 0x05, +/* height 005 */ 0x05, +/* Line 000 */ 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, // +/* Line 001 */ 0x00,0x00,0x00, 0xff,0x55,0x00, 0xff,0x55,0x00, 0xff,0x55,0x00, 0x00,0x00,0x00, // +/* Line 002 */ 0xff,0xff,0xff, 0xff,0x55,0x00, 0x00,0x00,0x00, 0xff,0x55,0x00, 0xff,0xff,0xff, // +/* Line 003 */ 0x00,0x00,0x00, 0xff,0x55,0x00, 0xff,0x55,0x00, 0xff,0x55,0x00, 0x00,0x00,0x00, // +/* Line 004 */ 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, 0x00,0x00,0x00, 0xff,0xff,0xff, // +}; diff --git a/error.c b/error.c new file mode 100644 index 0000000..b8f5c0b --- /dev/null +++ b/error.c @@ -0,0 +1,13 @@ +// File URLD:/repositories/AAOffice_warn/error.c +// Image Size: width=5,height=5 +// Data Size: 77 +const unsigned char image_error[77]= +{ +/* width 005 */ 0x05, +/* height 005 */ 0x05, +/* Line 000 */ 0xff,0xaa,0x00, 0xff,0xaa,0x00, 0xff,0xaa,0x00, 0xff,0xaa,0x00, 0xff,0xaa,0x00, // +/* Line 001 */ 0xff,0xaa,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xaa,0x00, // +/* Line 002 */ 0xff,0xaa,0x00, 0x00,0x00,0x00, 0xff,0xaa,0x00, 0x00,0x00,0x00, 0xff,0xaa,0x00, // +/* Line 003 */ 0xff,0xaa,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0xaa,0x00, // +/* Line 004 */ 0xff,0xaa,0x00, 0xff,0xaa,0x00, 0xff,0xaa,0x00, 0xff,0xaa,0x00, 0xff,0xaa,0x00, // +}; diff --git a/wateok.c b/wateok.c new file mode 100644 index 0000000..cd91c2a --- /dev/null +++ b/wateok.c @@ -0,0 +1,13 @@ +// File URLD:/aarepos/AAOffice_kitchen/wateok.c +// Image Size: width=5,height=5 +// Data Size: 77 +const unsigned char image_wateok[77]= +{ +/* width 005 */ 0x05, +/* height 005 */ 0x05, +/* Line 000 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // +/* Line 001 */ 0x00,0x00,0x00, 0x00,0xff,0x00, 0x00,0x00,0x00, 0x00,0xff,0x00, 0x00,0x00,0x00, // +/* Line 002 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // +/* Line 003 */ 0x00,0x00,0x00, 0x00,0xff,0x00, 0x00,0x00,0x00, 0x00,0xff,0x00, 0x00,0x00,0x00, // +/* Line 004 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // +}; diff --git a/wifi.c b/wifi.c new file mode 100644 index 0000000..8cbadb3 --- /dev/null +++ b/wifi.c @@ -0,0 +1,13 @@ +// File URLD:/aarepos/AAOffice_vent/wifi.c +// Image Size: width=5,height=5 +// Data Size: 77 +const unsigned char image_wifi[77]= +{ +/* width 005 */ 0x05, +/* height 005 */ 0x05, +/* Line 000 */ 0xff,0x1d,0x00, 0x00,0x00,0x00, 0xff,0x1d,0x00, 0x00,0x00,0x00, 0xff,0x1d,0x00, // +/* Line 001 */ 0xff,0x1d,0x00, 0x00,0x00,0x00, 0xff,0x1d,0x00, 0x00,0x00,0x00, 0xff,0x1d,0x00, // +/* Line 002 */ 0xff,0x1d,0x00, 0x00,0x00,0x00, 0xff,0x1d,0x00, 0x00,0x00,0x00, 0xff,0x1d,0x00, // +/* Line 003 */ 0x00,0x00,0x00, 0xff,0x1d,0x00, 0xff,0x1d,0x00, 0xff,0x1d,0x00, 0x00,0x00,0x00, // +/* Line 004 */ 0x00,0x00,0x00, 0x00,0x00,0x00, 0xff,0x1d,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, // +};