Эх сурвалжийг харах

Очеловечил вывод температуры и влажности. Добавил информативности мигающему прочерку.

Vladimir N. Shilov 9 жил өмнө
parent
commit
a3d8d5552f

+ 152 - 0
Changelog.txt

@@ -0,0 +1,152 @@
+простые часы на базе ESP8266 ESP-12e
+
+Вдохновил пост на хабре "Бескнопочные часы" http://geektimes.ru/post/267718/
+
+но, хочу немного по своему:
+ - заказл с али 5 штук синих индикаторов с ОК высотой 1.8"
+   это для отображения времени, даты
+ - купил на вороне 3 штуки белых с ОК 0.56"
+   это для отображения температуры, влажности, дня недели
+ - думаю поставить фоторозистор и регулировать яркость в зависимости от 
+   освещённости.
+ - вывод надумал делать динамический, на MAX7219, поэтому индикаторы с ОК
+ - дошло, что невыгорит управлять большими индикатороми этой мс. пришлось 
+   лепить транзисторы - "вечер перестаёт быть томным".
+ - индикаторы 1.8" вроде как бывают на 9 вольт и на 6.5, жду пока приедут.
+ - где-то кто-то писал, что у него MAX7219 нормально управляет большими 
+   индикаторами (1.8 или 2.3"), вобщем жду что приедет.
+
+на 31.12.2015 всё.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+Wall Segment Clock
+
+После двух дней ебли с nodemcu решил для своего проектика остановится на Sming.
+за основу взял проект "MeteoControl", выкинул I2C LCD Display, добавил 
+обновление сайта из "HttpClient_ThingSpeak", добавил обработку DHT22 из 
+"Humidity_DHT22", хотел добавить FTP сервер -- но оно не влезло.
+В качестве датчика освещённости можно будет использовать "Light_BH1750", или 
+останется фоторезистор.
+
+"ThingSpeak" планирую заменить на что-то своё, на своём сервере, что ещё 
+предстоит придумать и реализовать. Возиожно это будет не HTTP а что-то на 
+основе UDP (клиент/сервер).
+
+Осталось добавить поддержку для MAX7221 и сделать вывод на индикаторы...
+Возможно, по ходу дела придётся что-то выкидывать, чтобы влезло нужное.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+
+out/firmware/spiff_rom.bin---------->0x4C000
+
+FTP не влезло на 1594 байта :-(
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+WebTime занимает слегка меньше места чем NTPclient.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+2016.01.29
+
+Прикрутил поддержку max7219 с программным spi.
+Сделал вывод времени -- пора проверять в железе.
+
+Нужно придумать как выводить всё остальное -- дату, показания датчиков.
+Как считать дни недели, как определять переход на зимнее/летнее время?
+Как взаимодействовать с внешним миром -- оставлять вебсервер,
+или переходить на UDP сервер/клиент?
+
+по поводу дня недели:
+https://ru.wikibooks.org/wiki/Реализации_алгоритмов/Вечный_календарь
+---
+struct struct_date
+{
+    short day;
+    short month;
+    short year;
+};
+
+int what_day(const struct struct_date  const date)
+{
+    int a = (14 - date->month) / 12;
+    int y = date->year - a;
+    int m = date->month + 12 * a - 2;
+    return (7000 + (date->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
+}
+---
+
+Пример вывода:
+каждые 25-29 и 55-59 секунд на верхние индикаторы выводить дату, а на нижние день недели.
+(01 29 / ПОН ВРН СРЕ ЧРГ ПНА СУБ ВОС)
+в остальное время на нижних чережовать каждые 5 сек темп/влажность (XXc/XXh).
+делать мжно с помощью таймеров и однократного запуска.
+нужно разрисовать подобие КА.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+2016.02.01
+
+Уберу http-клиент, поменяю чуть сбор данных, json буду отдавать с точностью
+в 2 знака.
+Возмжно попробую добавить udp-сервер и ftp-сервер.
+
+Управление внешним выходом в зависимости от температуры/влажности -- это
+конечно прикольно, но мне в часах оно нахрен не нужно.
+
+Далее в планах -- переделать под себя страницу конфигурации,
+убрать всё лишнее, добавить нужное -- например, задание 2-4 порогов регулировки
+яркости в зависимости от внешнего освещения.
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+2016.02.02
+
+Переделал обработку времени, поправил обработку данных от датчика.
+
+FTP сервер уже влазит, вот только нужен ли он? 
+
+UDP Server тоже влез. Если я всё правильно понял, то на строку "get_sensors"
+должен возвращать температуру и влажность. На любые другие данные -- echo.
+
+Переделал конфигурацию -- выбросил всё ненужное, добавил настройку уровней 
+освещённости (два) и ировней яркости индикатора (три). Пока не использую.
+План такой:
+	if (ADCVAL < LLow) {
+		MAX7219br = BLow
+	} else if (ADCVAL > LHigh) {
+		MAX7219br = BHigh
+ 	} else {
+		MAX7219br = BMid
+	}
+
+Выкинул FTP Server -- какой-то он странный, скачать ничего не вышло,
+закачть уже и не пытался.
+
+Выкинул UDP Server -- запросы принимает, ответа от него не видно...
+Или я что-то не понимаю, или одно из двух...
+
+-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
+2016.02.02
+
+Заменил м/с MAX7219 -- и всё чудесным образом заработало.
+Один индикатор (ед. часов) бракованый -- не светится верхний левый сегмент,
+нужно поменять местами со средним.
+
+Не очень нравится раскладка 5/3, было бы лучше 4/4.
+
+Поменял отображение темп. и влажности -- символ спереди,
+так кажется более правильно.
+
+Мигающий минус теперь грубо отображет секунды:
+ - с 0 по 14 сек -- "минус"
+ - с 15 по 29 сек -- "средний и нижний"
+ - с 30 по 44 сек -- "верхний и средний"
+ - с 45 по 59 сек -- "верхний, средний и нижний"
+Была ещё мысль время выводить в первых четырёх идикаторах, мигать точкой,
+а в 5-ом индикаторы "двоичным" кодом отображать секунды, но пока отбросил.
+
+Белые индикаторы светят заметно ярче синих, пока ничего менять не буду,
+посмотрим как оно будет под светофильтром.
+
+Решил отказаться от вывода даты и дня недели -- не нужно оно.
+
+Нужно вынести в настройку адрес ntp сервера.
+Нужно доделать регулировку яркости. Возможно стоит заменить на плавную.

+ 3 - 122
README.md

@@ -1,124 +1,5 @@
-простые часы на базе ESP8266 ESP-12e
+ESP8266 (ESP-12E) based `Wall Segment Clock`
 
 
-Вдохновил пост на хабре "Бескнопочные часы" http://geektimes.ru/post/267718/
+Schematic and pcb in hw dir.
 
 
-но, хочу немного по своему:
- - заказл с али 5 штук синих индикаторов с ОК высотой 1.8"
-   это для отображения времени, даты
- - купил на вороне 3 штуки белых с ОК 0.56"
-   это для отображения температуры, влажности, дня недели
- - думаю поставить фоторозистор и регулировать яркость в зависимости от 
-   освещённости.
- - вывод надумал делать динамический, на MAX7219, поэтому индикаторы с ОК
- - дошло, что невыгорит управлять большими индикатороми этой мс. пришлось 
-   лепить транзисторы - "вечер перестаёт быть томным".
- - индикаторы 1.8" вроде как бывают на 9 вольт и на 6.5, жду пока приедут.
- - где-то кто-то писал, что у него MAX7219 нормально управляет большими 
-   индикаторами (1.8 или 2.3"), вобщем жду что приедет.
-
-на 31.12.2015 всё.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-Wall Segment Clock
-
-После двух дней ебли с nodemcu решил для своего проектика остановится на Sming.
-за основу взял проект "MeteoControl", выкинул I2C LCD Display, добавил 
-обновление сайта из "HttpClient_ThingSpeak", добавил обработку DHT22 из 
-"Humidity_DHT22", хотел добавить FTP сервер -- но оно не влезло.
-В качестве датчика освещённости можно будет использовать "Light_BH1750", или 
-останется фоторезистор.
-
-"ThingSpeak" планирую заменить на что-то своё, на своём сервере, что ещё 
-предстоит придумать и реализовать. Возиожно это будет не HTTP а что-то на 
-основе UDP (клиент/сервер).
-
-Осталось добавить поддержку для MAX7221 и сделать вывод на индикаторы...
-Возможно, по ходу дела придётся что-то выкидывать, чтобы влезло нужное.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-
-out/firmware/spiff_rom.bin---------->0x4C000
-
-FTP не влезло на 1594 байта :-(
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-WebTime занимает слегка меньше места чем NTPclient.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-2016.01.29
-
-Прикрутил поддержку max7219 с программным spi.
-Сделал вывод времени -- пора проверять в железе.
-
-Нужно придумать как выводить всё остальное -- дату, показания датчиков.
-Как считать дни недели, как определять переход на зимнее/летнее время?
-Как взаимодействовать с внешним миром -- оставлять вебсервер,
-или переходить на UDP сервер/клиент?
-
-по поводу дня недели:
-https://ru.wikibooks.org/wiki/Реализации_алгоритмов/Вечный_календарь
----
-struct struct_date
-{
-    short day;
-    short month;
-    short year;
-};
-
-int what_day(const struct struct_date  const date)
-{
-    int a = (14 - date->month) / 12;
-    int y = date->year - a;
-    int m = date->month + 12 * a - 2;
-    return (7000 + (date->day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7;
-}
----
-
-Пример вывода:
-каждые 25-29 и 55-59 секунд на верхние индикаторы выводить дату, а на нижние день недели.
-(01 29 / ПОН ВРН СРЕ ЧРГ ПНА СУБ ВОС)
-в остальное время на нижних чережовать каждые 5 сек темп/влажность (XXc/XXh).
-делать мжно с помощью таймеров и однократного запуска.
-нужно разрисовать подобие КА.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-2016.02.01
-
-Уберу http-клиент, поменяю чуть сбор данных, json буду отдавать с точностью
-в 2 знака.
-Возмжно попробую добавить udp-сервер и ftp-сервер.
-
-Управление внешним выходом в зависимости от температуры/влажности -- это
-конечно прикольно, но мне в часах оно нахрен не нужно.
-
-Далее в планах -- переделать под себя страницу конфигурации,
-убрать всё лишнее, добавить нужное -- например, задание 2-4 порогов регулировки
-яркости в зависимости от внешнего освещения.
-
--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
-2016.02.02
-
-Переделал обработку времени, поправил обработку данных от датчика.
-
-FTP сервер уже влазит, вот только нужен ли он? 
-
-UDP Server тоже влез. Если я всё правильно понял, то на строку "get_sensors"
-должен возвращать температуру и влажность. На любые другие данные -- echo.
-
-Переделал конфигурацию -- выбросил всё ненужное, добавил настройку уровней 
-освещённости (два) и ировней яркости индикатора (три). Пока не использую.
-План такой:
-	if (ADCVAL < LLow) {
-		MAX7219br = BLow
-	} else if (ADCVAL > LHigh) {
-		MAX7219br = BHigh
- 	} else {
-		MAX7219br = BMid
-	}
-
-Выкинул FTP Server -- какой-то он странный, скачать ничего не вышло,
-закачть уже и не пытался.
-
-Выкинул UDP Server -- запросы принимает, ответа от него не видно...
-Или я что-то не понимаю, или одно из двух...
+For details, see Changelog.txt

+ 30 - 8
app/application.cpp

@@ -132,7 +132,21 @@ void showWatch()
 			}
 			}
 		}
 		}
 
 
-		MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
+		switch(dt.Second / 15)
+		{
+			case 0:
+				MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus);
+				break;
+			case 1:
+				MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus2L);
+				break;
+			case 2:
+				MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus2H);
+				break;
+			case 3:
+				MAX7219_writeData(MAX7219_DIGIT2, SYM_Minus3);
+				break;
+		}
 
 
 		if (old_si != si)
 		if (old_si != si)
 		{
 		{
@@ -186,7 +200,15 @@ void showWatch()
  */
  */
 void showTime(void)
 void showTime(void)
 {
 {
-	MAX7219_writeData(MAX7219_DIGIT0, dt.Hour / 10);
+	// уберём ведущий ноль у часов
+	if (dt.Hour >= 9)
+		{
+			MAX7219_writeData(MAX7219_DIGIT0, dt.Hour / 10);
+		}
+	else
+		{
+			MAX7219_writeData(MAX7219_DIGIT0, MAX7219_CHAR_BLANK);
+		}
 	MAX7219_writeData(MAX7219_DIGIT1, dt.Hour % 10);
 	MAX7219_writeData(MAX7219_DIGIT1, dt.Hour % 10);
 	MAX7219_writeData(MAX7219_DIGIT3, dt.Minute / 10);
 	MAX7219_writeData(MAX7219_DIGIT3, dt.Minute / 10);
 	MAX7219_writeData(MAX7219_DIGIT4, dt.Minute % 10);
 	MAX7219_writeData(MAX7219_DIGIT4, dt.Minute % 10);
@@ -197,9 +219,9 @@ void showTime(void)
  */
  */
 void showTemperature(void)
 void showTemperature(void)
 {
 {
-	MAX7219_writeData(MAX7219_DIGIT5, (int) (SensorT) / 10);
-	MAX7219_writeData(MAX7219_DIGIT6, (int) (SensorT) % 10);
-	MAX7219_writeData(MAX7219_DIGIT7, SYM_Temp);
+	MAX7219_writeData(MAX7219_DIGIT5, SYM_Temp);
+	MAX7219_writeData(MAX7219_DIGIT6, (int) (SensorT) / 10);
+	MAX7219_writeData(MAX7219_DIGIT7, (int) (SensorT) % 10);
 }
 }
 
 
 /*
 /*
@@ -207,9 +229,9 @@ void showTemperature(void)
  */
  */
 void showHumidity(void)
 void showHumidity(void)
 {
 {
-	MAX7219_writeData(MAX7219_DIGIT5, (int) (SensorH) / 10);
-	MAX7219_writeData(MAX7219_DIGIT6, (int) (SensorH) % 10);
-	MAX7219_writeData(MAX7219_DIGIT7, SYM_H);
+	MAX7219_writeData(MAX7219_DIGIT5, SYM_H);
+	MAX7219_writeData(MAX7219_DIGIT6, (int) (SensorH) / 10);
+	MAX7219_writeData(MAX7219_DIGIT7, (int) (SensorH) % 10);
 }
 }
 
 
 /*
 /*

+ 2 - 2
include/configuration.h

@@ -25,8 +25,8 @@
 #define PIN_CLK                 13
 #define PIN_CLK                 13
 #define PIN_LOAD                12
 #define PIN_LOAD                12
 #define MAX7219_DIGITS          8
 #define MAX7219_DIGITS          8
-#define MAX7219_DIG_MASK        0x7B
-// ^^ reverse of -- 11011 110 -- без BCD декодирования 2, 7
+#define MAX7219_DIG_MASK        0xDB
+// ^^ reverse of -- 11011 011 -- без BCD декодирования 2, 5
 
 
 #define CLOCK_CONFIG_FILE ".clock.conf" // leading point for security reasons :)
 #define CLOCK_CONFIG_FILE ".clock.conf" // leading point for security reasons :)
 
 

+ 3 - 0
include/max7219.h

@@ -21,6 +21,9 @@
 #define SYM_LGradus				0x1D
 #define SYM_LGradus				0x1D
 #define SYM_Temp				0x0F
 #define SYM_Temp				0x0F
 #define SYM_Minus				0x01
 #define SYM_Minus				0x01
+#define SYM_Minus2L				0x09
+#define SYM_Minus2H				0x41
+#define SYM_Minus3				0x49
 #define SYM_BLANK				0x00
 #define SYM_BLANK				0x00
 #define SYM_FULL				0xFF
 #define SYM_FULL				0xFF
 #define SYM_H					0x37
 #define SYM_H					0x37