Привет всем форумчанинам! Хочу рассказать о своём мега полезном изобретении умные часы-метеостанция. Небольшая лирическая вставка: это мой первый пост на форуме arduino.ru и это мой первый реальный проект с микроконтроллером Arduino, создавая который я осваивал самые азы техчасти и программирования этой платформы. Если где и накосячил, предварительно я вас ввёл в курс дела. Текста будет достаточно.

При необходимости откройте изображение и рассмотрите.

Теперь о самом проекте. Основный функции – отображение текущего времени, числа, месяца, дня недели, считывание и отображение информации с метеодатчика BME280 (температура и влажность воздуха, атмосферное давление, высота над уровнем моря), и самое интересное, полное ДУ с пульта. Второстепенные функции – таймер, будильник, "ежечасовой звон" (прямо как в старых часах :) ). Из полезных фишек реализована адаптивная подсветка lcd через фоторезистор. Я не стал метеостанцию консервировать в корпус, оставил в "сыром виде", поскольку хочу ещё доработать и что-то реализовать. Код представлю в самом конце поста.
Комплектующие. Arduino Nano, rtc ds1307, bme280 5v (но питаю от 3.3v, диапазон позволяет от 2v до 5v), фоторезистор, сенсорная кнопка tt223, IR приёмник, IR пульт, пьезопищалка, 6 резисторов 1кОм. В моём случае lcd 1602 и lcd nokia 5110 (используется только один из них, или один, или второй, поскольку не хватает памяти arduino nano или моего опыта, тут уж не знаю :-) )
Подключение. Всё подключается довольно просто. LCD 1602, BME280 и RTC работают посредством шины I2C (SDL и SDA подключены к A4 и A5). Нюанс, мой lcd nokia подключается VCC к 3.3v, а LIGH и GND к массе. Почему так, я не знаю, но иначе не работает. Остальные 5 пинов подключаем к цифровым пинам arduino через резисторы 1кОм (чтобы lcd прожил больше, используйте 10кОм).

Касательно кнопки. Если хотите, можно использовать традиционную кнопку заместо сенсорной, код останется таким же, но необходимо будет активировать встроенный в микроконтроллер резистор 20кОм через функцию INPUT_PULLUP. Схем в интернете море, выбирайте любую, какая подойдёт.
Ардуино питается от 5v через шилд блока питания (YwRobot 545043), который устанавливается на макетную плату и может выдавать 5v и 3.3v (управляется перемычками, на фото выше видно). От него же питаются датчики и модули, которые требуют 5v или 3.3v.
Немного об адаптивной подсветке. Сам долго реализовывал данную функцию из-за незнания, поэтому расскажу что к чему. Сначала подключаем фоторезистор к аналоговому входу арудино по схеме ниже. Далее подключаем подсветку lcd 1602 к любому (в моём случае кроме 9го и 10го, шим сигнал почему не выдавал) цифровому пину с ШИМом. Ардуино будет считывать сигнал с фоторезистора в диапазоне от 0 до 1024, делить полученный результат на 4, а посылать сигнал на цифровой пин через analogWrite в диапазоне от 0 до 255. Выше значение, ярче подсветка lcd. Код приведён ниже (нашёл его на этом же форуме). НО, если вдруг вы не хотите делать адаптивной подсветку, я сделал в проекте функцию управления подсветкой через пульт ДУ !


01 | int PhCount = analogRead(7); |
04 | analogWrite(led, 255); |
09 | analogWrite(led, PhCount); |
Видеоролики, где продемонстрировал работу метеостанции на lcd1602:
Переключение трёх главных экранов посредством сенсорной кнопки. Реагирует даже на пинцет :)
https://www.youtube.com/watch?v=VOcS7plSyMo
Управление станцией с пульта и демонстрация будильника. Будильник настраивается только через код, для меня оптимально. Можно запрограммировать несколько пультов, даже с телефона можно управлять, если есть ИК порт. Функции пульта следующие: полная перезагрузка ардуино (также выполняется автоматически каждый день в 0:00, можно отключить в коде), вкл/выкл подсветки одной кнопкой, циклическое переключение экранов. Я нажимал vol- и vol+. Эти кнопки регулируют степень яркости подсветки в ручном режиме. Всего 4 степени яркости. Не работало, поскольку в моём случае адаптивная подсветка. Опять таки, можно настроить в коде (старался всё комментировать). Кнопка 1 и 2 включают готовый таймер на 20сек и 5сек.
https://www.youtube.com/watch?v=QnAv5LAsyiw
Также реализовал автоматическое переключение на главный циферблат, если на каком-то и зкранов застрял более чем на 30сек. Все экраны постарался проработать до мелочей. Однако недочёты есть, из буду по возможности исправлять. Забыл заснять момент ежечасового звона... он такой же как и будильник, но воспроизводится каждый час... Мне нравится, я и сделал.
Демонстрация работы на LCD nokia 5110 (84x48):
Экран здесь всего один, зато на нём помещается всё. Циферблат содержит секунды. Дата, дни недели на русском (здесь тоже свои нюансы, напишу пост об этом позже), и те же значения с датчика bme280, тоже на русском. Конкретно для этого дисплея реализовал предупреждение при повышенной влажности в помещении (более 70%). Для меня это важно, однако, повторюсь, в коде всё описано, можно выключить. Также реализован будильник. НО нет ежечасового звона... Также нет управления с пульта, потому что здесь это не нужно (пока что), и нет адаптивной подсветки, поскольку подсветка и без того тусклая. Есть миниатюры при звуковых сигналах. Опять таки, постарался все мелочи проработать. Ниже фото и видео.

https://www.youtube.com/watch?v=c69bZxvqBRg
Как вы поняли, по итоги в этом проекте две прошивки. Одна для lcd1602, вторая для nokia lcd. Они практически одинаковы, в каждой свои особенности. Сделано это было как для себя, так и для расширения проекта.
Прошивка для lcd1602:
001 | #include <Adafruit_Sensor.h> |
002 | #include <Adafruit_BME280.h> |
003 | #define SEALEVELPRESSURE_HPA (1013.25) |
009 | #include <LiquidCrystal_I2C.h> |
011 | LiquidCrystal_I2C lcd(0x3F,16,2); |
014 | decode_results results; |
118 | char daysOfTheWeek[7][12] = { "Sunday" , "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" }; |
134 | pinMode(led, OUTPUT); |
136 | pinMode(piezoPin, OUTPUT); |
139 | digitalWrite(11, HIGH); |
144 | analogWrite(led, 254); |
151 | lcd.createChar(0,LT); |
152 | lcd.createChar(1,UB); |
153 | lcd.createChar(2,RT); |
154 | lcd.createChar(3,LL); |
155 | lcd.createChar(4,LB); |
156 | lcd.createChar(5,LR); |
157 | lcd.createChar(6,MB); |
158 | lcd.createChar(7,block); |
164 | if (! rtc.isrunning()) { |
165 | Serial .println( "RTC is NOT running!" ); |
293 | void clearnumber( int x) |
301 | void (* resetFunc) ( void ) = 0; |
310 | DateTime now = rtc.now(); |
311 | if (now.hour() == 0 && now.minute() == 00 && now.second() == 00) { |
314 | lcd.print( "Reboot device.." ); |
320 | int PhCount = analogRead(7); |
323 | analogWrite(led, 255); |
326 | analogWrite(led, 40); |
328 | analogWrite(led, PhCount); |
333 | if (irrecv.decode(&results)) { |
334 | Serial .println(results.value); |
337 | if (results.value == 59415 || results.value == 16769565) { |
339 | tone(piezoPin, 200, 50); |
355 | if (results.value == 58395 || results.value == 16748655){ |
362 | analogWrite(led, 20); |
365 | analogWrite(led, 100); |
368 | analogWrite(led, 200); |
371 | analogWrite(led, 255); |
374 | if (results.value == 43095 || results.value == 16754775){ |
381 | analogWrite(led, 20); |
384 | analogWrite(led, 100); |
387 | analogWrite(led, 200); |
390 | analogWrite(led, 255); |
396 | if (results.value == 5355 || results.value == 16736925){ |
406 | tone(piezoPin, 900, 50); |
408 | tone(piezoPin, 900, 50); |
417 | lcd.print( "LCD off" ); |
418 | tone(piezoPin, 900, 50); |
420 | tone(piezoPin, 900, 50); |
429 | if (results.value == 4335 || results.value == 16724175) { |
432 | lcd.print( "Timer 20s on" ); |
435 | tone(piezoPin, 900, 50); |
439 | lcd.print( "Time out!" ); |
442 | tone(piezoPin, 900, 100); |
444 | tone(piezoPin, 900, 100); |
446 | tone(piezoPin, 900, 100); |
448 | tone(piezoPin, 900, 100); |
453 | lcd.print( "Time out!" ); |
456 | tone(piezoPin, 900, 100); |
458 | tone(piezoPin, 900, 100); |
460 | tone(piezoPin, 900, 100); |
462 | tone(piezoPin, 900, 100); |
467 | lcd.print( "Time out!" ); |
470 | tone(piezoPin, 900, 100); |
472 | tone(piezoPin, 900, 100); |
474 | tone(piezoPin, 900, 100); |
476 | tone(piezoPin, 900, 100); |
483 | if (results.value == 36975 || results.value == 16718055) { |
486 | lcd.print( "Timer 5s on" ); |
489 | tone(piezoPin, 900, 50); |
493 | lcd.print( "Time out!" ); |
496 | tone(piezoPin, 900, 100); |
498 | tone(piezoPin, 900, 100); |
500 | tone(piezoPin, 900, 100); |
502 | tone(piezoPin, 900, 100); |
507 | lcd.print( "Time out!" ); |
510 | tone(piezoPin, 900, 100); |
512 | tone(piezoPin, 900, 100); |
514 | tone(piezoPin, 900, 100); |
516 | tone(piezoPin, 900, 100); |
521 | lcd.print( "Time out!" ); |
524 | tone(piezoPin, 900, 100); |
526 | tone(piezoPin, 900, 100); |
528 | tone(piezoPin, 900, 100); |
530 | tone(piezoPin, 900, 100); |
537 | if (results.value == 25755 || results.value == 16753245) { |
540 | lcd.print( "Reboot device..." ); |
549 | if (digitalRead(BTN)==HIGH&&flag==0) { |
550 | tone(piezoPin, 200, 50); |
553 | if (digitalRead(BTN)==HIGH&&flag==0) |
573 | if (digitalRead(BTN)==LOW&&flag==1) |
580 | if (regim == 1 && millis() - timing > 40000) { |
585 | if (regim == 3 && millis() - timing > 40000) { |
595 | digitalClockDisplay(); |
598 | DateTime now = rtc.now(); |
599 | if (now.hour() >= 10 && now.hour() <= 22 && now.minute() == 00 && now.second() >= 00 && now.second() < 10 ) { |
600 | digitalClockDisplay(); |
606 | if (now.dayOfTheWeek() >= 1 && now.dayOfTheWeek() <= 7 && now.hour() == 14 && now.minute() == 20 && now.second() >= 00 && now.second() < 15) { |
607 | digitalClockDisplay(); |
613 | if (now.hour() >= 10 && now.hour() <= 22 && now.minute() == 00 && now.second() >= 00 && now.second() < 10 ) { |
619 | if (now.dayOfTheWeek() >= 1 && now.dayOfTheWeek() <= 7 && now.hour() == 14 && now.minute() == 20 && now.second() >= 00 && now.second() < 15) { |
629 | if (now.second() == 1 || |
634 | now.second() == 11 || |
635 | now.second() == 13 || |
636 | now.second() == 15 || |
637 | now.second() == 17 || |
638 | now.second() == 19 || |
639 | now.second() == 21 || |
640 | now.second() == 23 || |
641 | now.second() == 25 || |
642 | now.second() == 27 || |
643 | now.second() == 29 || |
644 | now.second() == 31 || |
645 | now.second() == 33 || |
646 | now.second() == 35 || |
647 | now.second() == 37 || |
648 | now.second() == 39 || |
649 | now.second() == 41 || |
650 | now.second() == 43 || |
651 | now.second() == 45 || |
652 | now.second() == 47 || |
653 | now.second() == 49 || |
654 | now.second() == 51 || |
655 | now.second() == 53 || |
656 | now.second() == 55 || |
657 | now.second() == 57 || |
658 | now.second() == 59 ) { |
666 | if (now.second() == 2 || |
670 | now.second() == 10 || |
671 | now.second() == 12 || |
672 | now.second() == 14 || |
673 | now.second() == 16 || |
674 | now.second() == 18 || |
675 | now.second() == 20 || |
676 | now.second() == 22 || |
677 | now.second() == 24 || |
678 | now.second() == 26 || |
679 | now.second() == 28 || |
680 | now.second() == 30 || |
681 | now.second() == 32 || |
682 | now.second() == 34 || |
683 | now.second() == 36 || |
684 | now.second() == 38 || |
685 | now.second() == 40 || |
686 | now.second() == 42 || |
687 | now.second() == 44 || |
688 | now.second() == 46 || |
689 | now.second() == 48 || |
690 | now.second() == 50 || |
691 | now.second() == 52 || |
692 | now.second() == 54 || |
693 | now.second() == 56 || |
694 | now.second() == 58 ) { |
705 | if (millis()-timing>=500) { |
706 | DateTime now = rtc.now(); |
713 | lcd.print(now.day()); |
715 | if (now.month() < 10) { |
718 | lcd.print(now.month()); |
720 | if (now.dayOfTheWeek() == 1 || now.dayOfTheWeek() == 2 || now.dayOfTheWeek() == 4 || now.dayOfTheWeek() == 5 || now.dayOfTheWeek() == 6 || now.dayOfTheWeek() == 7) { |
722 | lcd.print(daysOfTheWeek[now.dayOfTheWeek()]); |
724 | if (now.dayOfTheWeek() == 3) { |
726 | lcd.print(daysOfTheWeek[now.dayOfTheWeek()]); |
734 | if (millis()-timing>=500) { |
736 | lcd.print(round(bme.readTemperature())); |
739 | lcd.print(round(bme.readAltitude(SEALEVELPRESSURE_HPA))); |
741 | lcd.setCursor(13, 0); |
742 | lcd.print(round(bme.readHumidity())); |
745 | lcd.print(round(bme.readPressure()*0.0075)); |
746 | lcd.print( " mm.rt.st." ); |
753 | void digitalClockDisplay(){ |
755 | DateTime now = rtc.now(); |
757 | printDigits(now.hour()/10,0); |
758 | printDigits(now.hour()%10,4); |
760 | printDigits(now.minute()/10,9); |
761 | printDigits(now.minute()%10,13); |
766 | if (now.dayOfTheWeek() >= 1 && now.dayOfTheWeek() <= 7 && now.hour() == 14 && now.minute() == 20 && now.second() >= 00 && now.second() < 15) { |
767 | tone(piezoPin, 120, 400); |
769 | tone(piezoPin, 300, 400); |
771 | tone(piezoPin, 550, 400); |
773 | tone(piezoPin, 450, 400); |
775 | tone(piezoPin, 300, 400); |
777 | tone(piezoPin, 120, 400); |
782 | if (now.hour() >= 10 && now.hour() <= 22 && now.minute() == 00 && now.second() >= 00 && now.second() < 5 ) { |
783 | tone(piezoPin, 120, 400); |
785 | tone(piezoPin, 300, 400); |
787 | tone(piezoPin, 550, 400); |
789 | tone(piezoPin, 450, 400); |
791 | tone(piezoPin, 300, 400); |
793 | tone(piezoPin, 120, 400); |
807 | void printDigits( int digits, int x){ |
Прошивка для nokia lcd:
001 | #include <Adafruit_I2CDevice.h> |
002 | #include <Adafruit_GFX.h> |
003 | #include <Adafruit_PCD8544.h> |
004 | Adafruit_PCD8544 display = Adafruit_PCD8544(3, 4, 5, 7, 8); |
009 | #include <Adafruit_Sensor.h> |
010 | #include <Adafruit_BME280.h> |
011 | #define SEALEVELPRESSURE_HPA (1013.25) |
022 | const unsigned char PROGMEM smileBmp[] = { |
023 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
024 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
025 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
026 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
027 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
028 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
029 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
030 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
031 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
032 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
033 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
034 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
035 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
036 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
037 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
038 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
039 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
040 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, |
041 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, |
042 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, |
043 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, |
044 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, |
045 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, |
046 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, |
047 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf0, |
048 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xe0, |
049 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xc0, |
050 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x80, |
051 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, |
052 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, |
053 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
054 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
055 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
056 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
057 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
058 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
059 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
060 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
061 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
062 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
063 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
064 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
065 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
066 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
067 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
068 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
069 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
070 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
073 | const unsigned char PROGMEM clockBmp[] = { |
074 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
075 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
076 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
077 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
078 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
079 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
080 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
081 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
082 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
083 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
084 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
085 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
086 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
087 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
088 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, |
089 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, |
090 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xc0, |
091 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x08, 0x60, |
092 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x60, |
093 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x30, |
094 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x30, |
095 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1f, 0xb0, |
096 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0f, 0x30, |
097 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x30, |
098 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x30, |
099 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x60, |
100 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x60, |
101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xc0, |
102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80, |
103 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, |
104 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
105 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
106 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
107 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
108 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
109 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
110 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
111 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
112 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
113 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
114 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
115 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
116 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
117 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
118 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
119 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
120 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
121 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 |
125 | pinMode(piezoPin, OUTPUT); |
132 | display.clearDisplay(); |
135 | display.setContrast(50); |
137 | display.setTextSize(1); |
138 | display.setTextColor(BLACK); |
145 | if ( ( ms - ms1 ) > 1000 || ms < ms1 ) { |
148 | display.clearDisplay(); |
150 | DateTime now = rtc.now(); |
151 | display.setTextSize(2); |
152 | if (now.hour() < 10) { |
153 | display.setCursor(11, 0); |
154 | display.println( "0" ); |
155 | display.setCursor(23,0); |
156 | display.println(now.hour()); |
158 | if (now.hour() >= 10) { |
159 | display.setCursor(11,0); |
160 | display.println(now.hour()); |
162 | if (now.minute() < 10) { |
163 | display.setCursor(51,0); |
164 | display.println( "0" ); |
165 | display.setCursor(63,0); |
166 | display.println(now.minute()); |
168 | if (now.minute() >= 10) { |
169 | display.setCursor(51,0); |
170 | display.println(now.minute()); |
174 | if (now.dayOfTheWeek() >= 1 && now.dayOfTheWeek() <= 7 && now.hour() == 14 && now.minute() == 28 && now.second() >= 00 && now.second() < 20) { |
175 | display.drawBitmap(0, 0, clockBmp, 84, 44, BLACK); |
176 | tone(piezoPin, 120, 400); |
178 | tone(piezoPin, 300, 400); |
180 | tone(piezoPin, 550, 400); |
182 | tone(piezoPin, 450, 400); |
184 | tone(piezoPin, 300, 400); |
186 | tone(piezoPin, 120, 400); |
190 | display.setCursor(37, 3); |
191 | display.println( "-" ); |
192 | display.setTextSize(1); |
193 | if (now.second() < 10) { |
194 | display.setCursor(37,0); |
195 | display.println( "0" ); |
196 | display.setCursor(43,0); |
197 | display.println(now.second()); |
199 | if (now.second() >= 10){ |
200 | display.setCursor(37,0); |
201 | display.println(now.second()); |
203 | if (now.day() < 10) { |
204 | display.setCursor(28, 16); |
205 | display.println( "0" ); |
206 | display.setCursor(34, 16); |
207 | display.println(now.day()); |
209 | if (now.day() >= 10) { |
210 | display.setCursor(28, 16); |
211 | display.println(now.day()); |
214 | display.setCursor(40, 16); |
215 | display.println( "." ); |
216 | if (now.month() < 10){ |
217 | display.setCursor(46, 16); |
218 | display.println( "0" ); |
219 | display.setCursor(52, 16); |
220 | display.println(now.month()); |
222 | if (now.month() >= 10) { |
223 | display.setCursor(46, 16); |
224 | display.println(now.month()); |
226 | if (now.dayOfTheWeek() == 1){ |
227 | display.setCursor(11, 23); |
228 | display.println(utf8rus( "Понедельник" )); |
230 | if (now.dayOfTheWeek() == 2){ |
231 | display.setCursor(22, 23); |
232 | display.println(utf8rus( "Вторник" )); |
234 | if (now.dayOfTheWeek() == 3){ |
235 | display.setCursor(27, 23); |
236 | display.println(utf8rus( "Среда" )); |
238 | if (now.dayOfTheWeek() == 4){ |
239 | display.setCursor(21, 23); |
240 | display.println(utf8rus( "Четверг" )); |
242 | if (now.dayOfTheWeek() == 5){ |
243 | display.setCursor(21, 23); |
244 | display.println(utf8rus( "Пятница" )); |
246 | if (now.dayOfTheWeek() == 6){ |
247 | display.setCursor(21, 23); |
248 | display.println(utf8rus( "Суббота" )); |
250 | if (now.dayOfTheWeek() == 7){ |
251 | display.setCursor(11, 23); |
252 | display.println(utf8rus( "Воскресенье" )); |
254 | display.setCursor(0, 32); |
255 | display.print(round(bme.readTemperature())); |
256 | display.println(utf8rus( "'C" )); |
257 | display.setCursor(34, 32); |
258 | display.print(round(bme.readAltitude(SEALEVELPRESSURE_HPA))); |
259 | display.println(utf8rus( "м" )); |
260 | if (bme.readHumidity() > 70) { |
261 | tone(piezoPin, 200, 100); |
263 | tone(piezoPin, 200, 100); |
265 | display.setCursor(65, 32); |
266 | display.print(round(bme.readHumidity())); |
267 | display.println( "%" ); |
271 | display.drawBitmap(0, 0, smileBmp, 84, 44, BLACK); |
273 | if (bme.readHumidity() < 70) { |
274 | display.setCursor(65, 32); |
275 | display.print(round(bme.readHumidity())); |
276 | display.println( "%" ); |
278 | display.setTextSize(1); |
279 | display.setCursor(0, 40); |
280 | display.print(round(bme.readPressure()*0.0075)); |
281 | display.println(utf8rus( " мм.рт.ст." )); |
290 | String utf8rus(String source) |
295 | char m[2] = { '0' , '\0' }; |
297 | k = source.length(); i = 0; |
306 | if (n == 0x81) { n = 0xA8; break ; } |
307 | if (n >= 0x90 && n <= 0xBF) n = n + 0x2F; |
312 | if (n == 0x91) { n = 0xB7; break ; } |
313 | if (n >= 0x80 && n <= 0x8F) n = n + 0x6F; |
318 | m[0] = n; target = target + String(m); |
Отдельные кусочки кода были взяты откуда-то или написаны мной. Не претендую на перфекционизм !! :)))
На этом, думаю, пост можно закончить. Изложил все свои мысли по этому поводу. Хотелось бы услышать ваше мнение. Если вам был интересно, следите за моими постами, будет полезно для таких же новичков, как и я.
158
lcd.createChar(7,block);
Это не нужно, такой символ в LCD1602 имеется, его код - 255. Я тоже брал этот код для часов на таком дисплее, но с переделками, шрифт получился чуть красивее. Ну и по результатам критики отрисовку цифр переделал. В использованном вами коде она демонстрационная и, соответственно, слишком раздутая.
Код мигания двоеточия на 70 строк - это жесть ))) Проверка числа на четность делается делением на 2 - если остаток равен нулю, значит четное и наоборот. И код получается примерно таким:
1
char
dt =
"."
;
2
if
(now.second() % 2 > 0)
3
dt =
" "
;
4
lcd.setCursor(7, 0);
5
lcd.print(dt);
6
lcd.setCursor(7, 1);
7
lcd.print(dt);
За мигания точек спасибо! В 10 раз меньше, исправлю
Насчёт символа.. Это уже мелочное... Шрифт меня не напрягает, пойдёт
Насчёт символа.. Это уже мелочное... Шрифт меня не напрягает, пойдёт
Собственно, дело не в шрифте, а в отрисовке цифр
Заменил код мигания точек на ваш код, выдаёт следующую ошибку в терминал:
1
warning: invalid conversion from
'const char*'
to
'char'
[-fpermissive]
2
3
dot =
" "
;
warning - это не ошибка. Код работает?
Да, но вместо точек непонятные символы
Уже починил. Просто поменял на const char* и переместил в void digitalClockDisplay()
1
const
char
* dot =
"."
;
2
if
(now.second() % 2 > 0) {
3
dot =
" "
;
4
}
5
6
lcd.setCursor(7, 0);
7
lcd.print(dot);
8
lcd.setCursor(7, 1);
9
lcd.print(dot);
Всегда считал, что константы изменению не подлежат ))
На самом деле да, мой косяк по незнанию - просто символы нужно было задавать в одиночных кавычках
1
char
dot =
'.'
;
2
if
(now.second() % 2 > 0) {
3
dot =
' '
;
4
}
5
6
lcd.setCursor(7, 0);
7
lcd.print(dot);
8
lcd.setCursor(7, 1);
9
lcd.print(dot);
Нет, код получается примерно таким:
1
char
dt = (now.second() & 0x01) ?
'.'
:
' '
;
Нет, код получается примерно таким:
1
char
dt = (now.second() & 0x01) ?
'.'
:
' '
;
Сходу под дых? ))))
Сходу под дых? ))))
Чойта?
Человек с простой арифметикой не сообразил, а ты ему битовыми операциями ))
Так пусть учится. Код не смотрел, но судя по стилю изложения, автору лет 15... В этом возрасте еще не поздно узнавать новое :)