Advertisement
Guest User

Untitled

a guest
Oct 11th, 2018
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.47 KB | None | 0 0
  1. #include <WiFiUdp.h>
  2. #include <PubSubClient.h>
  3. #include <ESP8266WiFi.h>
  4. #include <ESP8266WebServer.h>
  5. #include <Adafruit_GFX.h>
  6. #include <ESP8266mDNS.h>
  7. #include <Max72xxPanel.h>
  8.  
  9. // =======================================================================
  10. // Конфигурация устройства:
  11. // =======================================================================
  12. const char* host = "informer_in";
  13. const char* ssid = "***"; // SSID
  14. const char* password = "****"; // пароль
  15. // =======================================================================
  16.  
  17. ESP8266WebServer server(80);
  18. const char* serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Update'></form>";
  19.  
  20. const char *mqtt_server = "192.168.1.70"; // Имя сервера MQTT
  21. const int mqtt_port = 1883; // Порт для подключения к серверу MQTT
  22. const char *mqtt_user = "***"; // Логи от сервер
  23. const char *mqtt_pass = "***"; // Пароль от сервера
  24.  
  25. WiFiClient wclient;
  26. PubSubClient client(wclient);
  27.  
  28. int clouds;
  29. float windSpeed;
  30. float temp = 0;
  31. String date;
  32. String line;
  33. String currencyRates;
  34. String scroll_String;
  35. String text1;
  36.  
  37. //датчик света
  38. const int inRaw = A0; //вход датчик света
  39. int raw = 0; //сила света
  40. int raw_mean = 0; //сила света среднее
  41. int raw_old = 0; //сила света
  42.  
  43. String str;
  44.  
  45. //подсчет времени
  46. long previousMillis_time = 0; // храним время последнего подключения
  47. long interval_time = 3600000; //интервал 1 час
  48.  
  49. //raw
  50. long previousMillis_raw = 0; // храним время последнего подключения
  51. long interval_raw = 60000; //интервал
  52.  
  53. //mqtt send
  54. long previousMillis_mqtt_send = 0; // храним время последнего подключения
  55. long interval_mqtt_send = 15000; //интервал
  56.  
  57. //mqtt raw
  58. long previousMillis_mqtt_raw = 0; // храним время последнего подключения
  59. long interval_mqtt_raw = 60000; //интервал
  60.  
  61. //wifi
  62. long previousMillis_wifi = 0; // храним время последнего подключения
  63. long interval_wifi = 10000; //интервал
  64. unsigned long currentMillis_wifi = 0;
  65.  
  66. //mqtt broker
  67. long previousMillis_mqtt_connect = 0; // храним время последнего подключения
  68. long interval_mqtt_connect = 60000; //интервал
  69. unsigned long currentMillis_mqtt_connect = 0;
  70.  
  71. long period;
  72. int offset = 1, refresh = 0;
  73. int pinCS = 0; // Подключение пина CS
  74. int numberOfHorizontalDisplays = 4; // Количество светодиодных матриц по Горизонтали
  75. int numberOfVerticalDisplays = 1; // Количество светодиодных матриц по Вертикали
  76. String decodedMsg;
  77. Max72xxPanel matrix = Max72xxPanel(pinCS, numberOfHorizontalDisplays, numberOfVerticalDisplays);
  78. //matrix.cp437(true);
  79.  
  80. int wait = 50; // скорость бегущей строки
  81.  
  82. int spacer = 2;
  83. int width = 5 + spacer; // Регулируем расстояние между символами
  84.  
  85. // =======================================================================
  86. // Функция получения данных от сервера
  87. void callback(char* topic, byte* payload, unsigned int length)
  88. {
  89. //--------------------------------------------------------------------------------------
  90. //строка
  91. if (String(topic) == "ihouse/gadget/informerIn")
  92. {
  93. str = "";
  94. for (int i = 0; i < length; i++)
  95. {
  96. str = str + (char)payload[i];
  97. }
  98. }
  99. }
  100.  
  101. // =======================================================================
  102. void mqtt_reconnect()
  103. {
  104. unsigned long currentMillis_mqtt_connect = millis();
  105.  
  106. // подключаемся к MQTT серверу
  107. if (currentMillis_mqtt_connect - previousMillis_mqtt_connect >= interval_mqtt_connect)
  108. {
  109. String clientId = "informerIn";
  110. clientId += String(random(0xffff), HEX);
  111. if (client.connect(clientId.c_str(), mqtt_user, mqtt_pass))
  112. {
  113. //подписываемся по топики
  114. client.subscribe("ihouse/gadget/informerIn");
  115. client.loop();
  116. }
  117. previousMillis_mqtt_connect = currentMillis_mqtt_connect;
  118. }
  119. }
  120. // =======================================================================
  121. void setup_wifi()
  122. {
  123. unsigned long currentMillis_wifi = millis();
  124.  
  125. if (currentMillis_wifi - previousMillis_wifi >= interval_wifi)
  126. {
  127. WiFi.begin(ssid, password); //конектимся
  128. previousMillis_wifi = currentMillis_wifi;
  129. }
  130. }
  131.  
  132. // =======================================================================
  133. void setup()
  134. {
  135. // присваиваем статичесий IP адрес
  136. WiFi.mode(WIFI_STA); // режим клиента
  137. WiFi.config(IPAddress(192, 168, 1, 71), IPAddress(192, 168, 1, 1), IPAddress(255, 255, 255, 0), IPAddress(192, 168, 1, 1));
  138.  
  139. client.setServer(mqtt_server, mqtt_port);
  140. client.setCallback(callback);
  141. delay(10);
  142.  
  143. WiFi.begin(ssid, password);
  144. delay(10);
  145.  
  146. //запуск web сервера для удаленной прошивки
  147. if (WiFi.waitForConnectResult() == WL_CONNECTED) {
  148. MDNS.begin(host);
  149. server.on("/", HTTP_GET, []() {
  150. server.sendHeader("Connection", "close");
  151. server.send(200, "text/html", serverIndex);
  152. });
  153. server.on("/update", HTTP_POST, []() {
  154. server.sendHeader("Connection", "close");
  155. server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
  156. ESP.restart();
  157. }, []() {
  158. HTTPUpload& upload = server.upload();
  159. if (upload.status == UPLOAD_FILE_START) {
  160. Serial.setDebugOutput(true);
  161. WiFiUDP::stopAll();
  162. uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000;
  163. if (!Update.begin(maxSketchSpace)) { //start with max available size
  164. Update.printError(Serial);
  165. }
  166. } else if (upload.status == UPLOAD_FILE_WRITE) {
  167. if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
  168. Update.printError(Serial);
  169. }
  170. } else if (upload.status == UPLOAD_FILE_END) {
  171. if (Update.end(true)) { //true to set the size to the current progress
  172. } else {
  173. Update.printError(Serial);
  174. }
  175. Serial.setDebugOutput(false);
  176. }
  177. yield();
  178. });
  179. server.begin();
  180. MDNS.addService("http", "tcp", 80);
  181. }
  182.  
  183. // начальные координаты матриц 8*8
  184. matrix.setRotation(0, 1); // 1 матрица
  185. matrix.setRotation(1, 1); // 2 матрица
  186. matrix.setRotation(2, 1); // 3 матрица
  187. matrix.setRotation(3, 1); // 4 матрица
  188.  
  189. getTime();
  190. updateTime();
  191.  
  192. pinMode(inRaw, INPUT);
  193. }
  194.  
  195. // =======================================================================
  196. #define MAX_DIGITS 16
  197. byte dig[MAX_DIGITS] = {0};
  198. byte digold[MAX_DIGITS] = {0};
  199. byte digtrans[MAX_DIGITS] = {0};
  200. int updCnt = 0;
  201. int dots = 0;
  202. long dotTime = 0;
  203. long clkTime = 0;
  204. int dx = 0;
  205. int dy = 0;
  206. byte del = 0;
  207. int h, m, s;
  208. int h_old, m_old;
  209.  
  210. // =======================================================================
  211. // Функция отправки в mqtt
  212. void TempSend()
  213. {
  214. unsigned long currentMillis_mqtt_send = millis();
  215. unsigned long currentMillis_mqtt_raw = millis();
  216.  
  217. if (currentMillis_mqtt_send - previousMillis_mqtt_send >= interval_mqtt_send)
  218. {
  219. previousMillis_mqtt_send = currentMillis_mqtt_send;
  220. client.publish("ihouse/work/informerIn", String(random(1000)).c_str());
  221. }
  222.  
  223. if (h != h_old)
  224. {
  225. client.publish("ihouse/clock/h", String(h).c_str());
  226. h_old = h;
  227. }
  228.  
  229. if (m != m_old)
  230. {
  231. //client.publish("ihouse/clock/h", String(h).c_str());
  232. client.publish("ihouse/clock/m", String(m).c_str());
  233. m_old = m;
  234. }
  235.  
  236. if (currentMillis_mqtt_raw - previousMillis_mqtt_raw >= interval_mqtt_raw)
  237. {
  238. previousMillis_mqtt_raw = currentMillis_mqtt_raw;
  239. client.publish("ihouse/raw", String(raw).c_str()); // отправляем в топик значение освещенности
  240. }
  241. delay(10);
  242. }
  243.  
  244. //=======================================================================
  245. void DisplayTime()
  246. {
  247. updateTime();
  248. matrix.fillScreen(LOW);
  249. int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
  250.  
  251. if (s & 1) {
  252. matrix.drawChar(14, y, (String(":"))[0], HIGH, LOW, 1); //каждую четную секунду печатаем двоеточие по центру (чтобы мигало)
  253. }
  254. else {
  255. matrix.drawChar(14, y, (String(" "))[0], HIGH, LOW, 1);
  256. }
  257.  
  258. String hour1 = String (h / 10);
  259. String hour2 = String (h % 10);
  260. String min1 = String (m / 10);
  261. String min2 = String (m % 10);
  262. String sec1 = String (s / 10);
  263. String sec2 = String (s % 10);
  264. int xh = 2;
  265. int xm = 19;
  266. // int xs = 28;
  267.  
  268. matrix.drawChar(xh, y, hour1[0], HIGH, LOW, 1);
  269. matrix.drawChar(xh + 6, y, hour2[0], HIGH, LOW, 1);
  270. matrix.drawChar(xm, y, min1[0], HIGH, LOW, 1);
  271. matrix.drawChar(xm + 6, y, min2[0], HIGH, LOW, 1);
  272.  
  273. matrix.write(); // Вывод на дисплей
  274. }
  275.  
  276. // =======================================================================
  277. void DisplayText(String text) {
  278. matrix.fillScreen(LOW);
  279. for (int i = 0; i < text.length(); i++)
  280. {
  281. int letter = (matrix.width()) - i * (width - 1);
  282. int x = (matrix.width() + 1) - letter;
  283. int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
  284. matrix.drawChar(x, y, text[i], HIGH, LOW, 1);
  285. matrix.write(); // Вывод на дисплей
  286.  
  287. }
  288. }
  289. // =======================================================================
  290. void ScrollText (String text) {
  291. for ( int i = 0 ; i < width * text.length() + matrix.width() - 1 - spacer; i++ )
  292. {
  293. if (refresh == 1) i = 0;
  294. refresh = 0;
  295. matrix.fillScreen(LOW);
  296. int letter = i / width;
  297. int x = (matrix.width() - 1) - i % width;
  298. int y = (matrix.height() - 8) / 2; // Центрируем текст по Вертикали
  299.  
  300. while ( x + width - spacer >= 0 && letter >= 0 ) {
  301. if ( letter < text.length() ) {
  302. matrix.drawChar(x, y, text[letter], HIGH, LOW, 1);
  303. }
  304. letter--;
  305. x -= width;
  306. }
  307. matrix.write(); // Вывод на дисплей
  308. delay(wait);
  309. }
  310. }
  311.  
  312. // =======================================================================
  313. void getStringData()
  314. {
  315. String deg = String(char('~' + 25));
  316. scroll_String = str;
  317. }
  318.  
  319. // =======================================================================
  320. // Берем время у GOOGLE
  321. // =======================================================================
  322.  
  323. float utcOffset = 8; //поправка часового пояса
  324. long localEpoc = 0;
  325. long localMillisAtUpdate = 0;
  326.  
  327. void getTime()
  328. {
  329. WiFiClient time_client;
  330. if (!time_client.connect("www.google.com", 80))
  331. {
  332. return;
  333. }
  334.  
  335. time_client.print(String("GET / HTTP/1.1\r\n") +
  336. String("Host: www.google.com\r\n") +
  337. String("Connection: close\r\n\r\n"));
  338. int repeatCounter = 0;
  339. while (!time_client.available() && repeatCounter < 10) {
  340. delay(500);
  341. repeatCounter++;
  342. }
  343.  
  344. String line;
  345. time_client.setNoDelay(false);
  346. while (time_client.connected() && time_client.available()) {
  347. line = time_client.readStringUntil('\n');
  348. line.toUpperCase();
  349. if (line.startsWith("DATE: ")) {
  350. date = " " + line.substring(6, 22);
  351. h = line.substring(23, 25).toInt();
  352. m = line.substring(26, 28).toInt();
  353. s = line.substring(29, 31).toInt();
  354. localMillisAtUpdate = millis();
  355. localEpoc = (h * 60 * 60 + m * 60 + s);
  356. }
  357. }
  358. time_client.stop();
  359. }
  360.  
  361. // =======================================================================r
  362.  
  363. void updateTime()
  364. {
  365. long curEpoch = localEpoc + ((millis() - localMillisAtUpdate) / 1000);
  366. long epoch = round(curEpoch + 3600 * utcOffset + 86400L) % 86400L;
  367. h = ((epoch % 86400L) / 3600) % 24;
  368. m = (epoch % 3600) / 60;
  369. s = epoch % 60;
  370. }
  371.  
  372. // =======================================================================
  373.  
  374.  
  375. String utf8rus(String source)
  376. {
  377. int i, k;
  378. String target;
  379. unsigned char n;
  380. char m[2] = { '0', '\0' };
  381.  
  382. k = source.length(); i = 0;
  383.  
  384. while (i < k) {
  385. n = source[i]; i++;
  386.  
  387. if (n >= 0xC0) {
  388. switch (n) {
  389. case 0xD0: {
  390. n = source[i]; i++;
  391. if (n == 0x81) {
  392. n = 0xA8;
  393. break;
  394. }
  395. if (n >= 0x90 && n <= 0xBF) n = n + 0x30 - 1;
  396. break;
  397. }
  398. case 0xD1: {
  399. n = source[i]; i++;
  400. if (n == 0x91) {
  401. n = 0xB8;
  402. break;
  403. }
  404. if (n >= 0x80 && n <= 0x8F) n = n + 0x70 - 1;
  405. break;
  406. }
  407. }
  408. }
  409. m[0] = n; target = target + String(m);
  410. }
  411. return target;
  412. }
  413.  
  414. // =======================================================================
  415. void loop()
  416. {
  417. unsigned long currentMillis_time = millis();
  418. unsigned long currentMillis_raw = millis();
  419.  
  420. //--------------------------------------------------------------------------------------
  421. if (WiFi.status() != WL_CONNECTED) //если нет подключения к вифи
  422. {
  423. setup_wifi();
  424. }
  425.  
  426. //--------------------------------------------------------------------------------------
  427. if (WiFi.status() == WL_CONNECTED)
  428. {
  429. if (!client.connected())
  430. {
  431. mqtt_reconnect();
  432. }
  433. }
  434.  
  435. //--------------------------------------------------------------------------------------
  436. client.loop();
  437. TempSend();
  438.  
  439. raw = analogRead(inRaw);
  440.  
  441. //запуск синхронизации времени
  442. if (currentMillis_time - previousMillis_time >= interval_time)
  443. {
  444. previousMillis_time = currentMillis_time;
  445. getTime();
  446. }
  447.  
  448. server.handleClient();
  449. delay(1);
  450.  
  451. if (updCnt <= 0)
  452. { // каждые 100 циклов получаем данные температуры и давления
  453. updCnt = 2;
  454. getStringData();
  455. //getTime();
  456. clkTime = millis();
  457. }
  458.  
  459. //каждые 15 секунд запускаем бегущую строку
  460. if (millis() - clkTime > 15000 && !del && dots)
  461. {
  462. ScrollText(utf8rus(scroll_String));
  463. updCnt--;
  464. clkTime = millis();
  465. }
  466.  
  467. DisplayTime();
  468. if (millis() - dotTime > 500)
  469. {
  470. dotTime = millis();
  471. dots = !dots;
  472. }
  473.  
  474. //--------------------------------------------------------------------------------------
  475. //яркость дисплея
  476. if (raw <= 50)
  477. {
  478. if (currentMillis_raw - previousMillis_raw > interval_raw)
  479. {
  480. previousMillis_raw = currentMillis_raw;
  481. matrix.setIntensity(15); // Яркость матрицы от 0 до 15
  482. }
  483. }
  484. if (raw > 50 && raw <= 100)
  485. {
  486. if (currentMillis_raw - previousMillis_raw > interval_raw)
  487. {
  488. previousMillis_raw = currentMillis_raw;
  489. matrix.setIntensity(12); // Яркость матрицы от 0 до 15
  490. }
  491. }
  492. if (raw > 100 && raw <= 200)
  493. {
  494. if (currentMillis_raw - previousMillis_raw > interval_raw)
  495. {
  496. previousMillis_raw = currentMillis_raw;
  497. matrix.setIntensity(10); // Яркость матрицы от 0 до 15
  498. }
  499. }
  500. if (raw > 200 && raw <= 500)
  501. {
  502. if (currentMillis_raw - previousMillis_raw > interval_raw)
  503. {
  504. previousMillis_raw = currentMillis_raw;
  505. matrix.setIntensity(8); // Яркость матрицы от 0 до 15
  506. }
  507. }
  508. if (raw > 500 && raw <= 700)
  509. {
  510. if (currentMillis_raw - previousMillis_raw > interval_raw)
  511. {
  512. previousMillis_raw = currentMillis_raw;
  513. matrix.setIntensity(5); // Яркость матрицы от 0 до 15
  514. }
  515. }
  516. if (raw > 700 && raw <= 900)
  517. {
  518. if (currentMillis_raw - previousMillis_raw > interval_raw)
  519. {
  520. previousMillis_raw = currentMillis_raw;
  521. matrix.setIntensity(3); // Яркость матрицы от 0 до 15
  522. }
  523. }
  524. if (raw > 900)
  525. {
  526. if (currentMillis_raw - previousMillis_raw > interval_raw)
  527. {
  528. previousMillis_raw = currentMillis_raw;
  529. matrix.setIntensity(0); // Яркость матрицы от 0 до 15
  530. }
  531. }
  532.  
  533. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement