Advertisement
Guest User

Untitled

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