Часы-Термометр на Arduino Uno, 4 разрядном 7 сегментном индикаторе, датчике температуры LM35 и RTC модуле DS1302.

DarkGenius
Offline
Зарегистрирован: 09.07.2015
Сразу оговорюсь лепил из того что было. Лежал у меня неисправный 16х32 индикатор, от рекламного щита. Решил я его распаять под семисегментный индикатор и собрать часы на ардуино. Позже добавил датчик температуры LM35. Перебрал массу скетчей и выжал из них то что мне нужно. Единственное так и не смог понизить яркость значка градусов. Температуру показывают десять секунд, каждую десятую минуту.
001#define DIGIT1 A2
002#define DIGIT2 A3
003#define DIGIT3 A4
004#define DIGIT4 A5
005#define SEGMENTA 2
006#define SEGMENTB 3
007#define SEGMENTC 4
008#define SEGMENTD 5
009#define SEGMENTE 6
010#define SEGMENTF 7
011#define SEGMENTG 8
012#define COLON A1
013#define DELAYTIME 50
014#define BUTTONMIN 12
015#define BUTTONHOUR 13
016#include <DS1302.h>
017unsigned short hours, minutes, seconds, temp;
018unsigned long lastTime;
019DS1302 rtc(9, 10, 11);
020Time t;
021int lastButtonStatemin = LOW;
022int lastButtonStatehour = LOW;
023boolean tempFlag;
024int tempPin = A0;
025int tempc;
026void setup() {               
027  pinMode(DIGIT1, OUTPUT);
028  pinMode(DIGIT2, OUTPUT);
029  pinMode(DIGIT3, OUTPUT);
030  pinMode(DIGIT4, OUTPUT);
031  pinMode(SEGMENTA, OUTPUT);
032  pinMode(SEGMENTB, OUTPUT);
033  pinMode(SEGMENTC, OUTPUT);
034  pinMode(SEGMENTD, OUTPUT);
035  pinMode(SEGMENTE, OUTPUT);
036  pinMode(SEGMENTF, OUTPUT);
037  pinMode(SEGMENTG, OUTPUT);
038  pinMode(COLON, OUTPUT);
039  pinMode(BUTTONMIN, INPUT);
040  pinMode(BUTTONHOUR, INPUT);
041  rtc.halt(false);
042  rtc.writeProtect(false);
043  analogReference(INTERNAL);
044}
045void loop() {
046  t = rtc.getTime();
047  minutes = t.min % 10;
048  seconds = t.sec;
049  int temp = analogRead(tempPin)/ 10.5;
050  if (minutes == 0 && seconds >= 10 && seconds < 20){
051    clock_all_off();
052    clock_show_digit(0, 10);
053    delayMicroseconds(150);
054    unsigned short delaytime;
055    unsigned short num_leds[10] = {
056    6, 3, 5, 5, 4, 5, 6, 3, 7, 6           };
057    unsigned short digit[4];
058    if (tempFlag){
059      tempFlag = false;
060      tempc = temp;}
061    digit[1] = tempc / 10;
062    digit[2] = tempc % 10;
063    if (temp > 10) {
064      clock_all_off();
065      clock_show_digit(1, digit[1]);
066      delaytime = num_leds[digit[1]] * 50;  
067      delayMicroseconds(delaytime);
068    }
069    clock_all_off();
070    clock_show_digit(2, digit[2]);
071    delaytime = num_leds[digit[2]] * 50;  
072    delayMicroseconds(delaytime);
073    clock_all_off();
074    clock_show_digit(3, 11);
075  }
076  else{
077    tempFlag = true;
078    clock_show_time(t.hour, t.min);
079    if (t.sec % 2 == 0) {
080      clock_show_colon();
081    }
082    if (digitalRead(BUTTONMIN) != lastButtonStatemin) {
083      lastButtonStatemin = digitalRead(BUTTONMIN);
084      if (digitalRead(BUTTONMIN) == HIGH) {
085        minutes = t.min;
086        hours = t.hour;
087        if (minutes == 59) {
088          minutes = 0;
089          rtc.setTime(hours, minutes , 0);
090        }
091        else {
092          minutes++;
093          rtc.setTime(hours, minutes , 0);
094        }
095      }
096    }
097    if (digitalRead(BUTTONHOUR) != lastButtonStatehour) {
098      lastButtonStatehour = digitalRead(BUTTONHOUR);
099      if (digitalRead(BUTTONHOUR) == HIGH) {
100        minutes = t.min;
101        hours = t.hour;
102        if (hours == 23) {
103          hours = 0;
104          rtc.setTime(hours, minutes , 0);
105        }
106        else {
107          hours++;
108          rtc.setTime(hours, minutes , 0);
109        }
110      }
111    }
112  }
113}
114void clock_show_time(unsigned short hours, unsigned short minutes) {
115  unsigned short i;
116  unsigned short delaytime;
117  unsigned short num_leds[10] = {
118    6, 3, 5, 5, 4, 5, 6, 3, 7, 6           };
119  unsigned short digit[4];
120  unsigned short hide_leading_hours_digit;
121  if (hours > 99) hours = 99;
122  if (minutes > 59) minutes = 59;
123  if (hours < 10 && hours >= 0) {
124    hide_leading_hours_digit = 1;
125  }
126  else {
127    hide_leading_hours_digit = 0;
128  }
129  digit[0] = hours / 10;
130  digit[1] = hours % 10;
131  digit[2] = minutes / 10;
132  digit[3] = minutes % 10;
133  for (i = hide_leading_hours_digit; i < 4; i++) {
134    clock_all_off();
135    clock_show_digit(i, digit[i]);
136    delaytime = num_leds[digit[i]] * DELAYTIME;  
137    delayMicroseconds(delaytime);
138  }
139  clock_all_off();
140}
141void clock_all_off(void) {
142  digitalWrite(DIGIT1, LOW);
143  digitalWrite(DIGIT2, LOW);
144  digitalWrite(DIGIT3, LOW);
145  digitalWrite(DIGIT4, LOW);
146  digitalWrite(SEGMENTA, LOW);
147  digitalWrite(SEGMENTB, LOW);
148  digitalWrite(SEGMENTC, LOW);
149  digitalWrite(SEGMENTD, LOW);
150  digitalWrite(SEGMENTE, LOW);
151  digitalWrite(SEGMENTF, LOW);
152  digitalWrite(SEGMENTG, LOW);
153  digitalWrite(COLON, LOW);
154}
155void clock_show_digit(unsigned short position, unsigned short value) {
156  byte a;
157  byte b;
158  byte c;
159  byte d;
160  byte e;
161  byte f;
162  byte g;
163  switch (position) {
164  case 0:
165    digitalWrite(DIGIT1, HIGH);
166    break;
167  case 1:
168    digitalWrite(DIGIT2, HIGH);
169    break;
170  case 2:
171    digitalWrite(DIGIT3, HIGH);
172    break;
173  case 3:
174    digitalWrite(DIGIT4, HIGH);
175    break;
176  }
177  a = !(value == 1 || value == 4 || value == 10);
178  b = !(value == 5 || value == 6 || value == 10);
179  c = !(value == 2 || value == 10 || value == 11);
180  d = !(value == 1 || value == 4 || value == 7 || value == 11);
181  e =  (value == 0 || value == 2 || value == 6 || value == 8 || value == 10);
182  f = !(value == 1 || value == 2 || value == 3 || value == 7);
183  g = !(value == 0 || value == 1 || value == 7);
184  if (a) digitalWrite(SEGMENTA, HIGH);
185  if (b) digitalWrite(SEGMENTB, HIGH);
186  if (c) digitalWrite(SEGMENTC, HIGH);
187  if (d) digitalWrite(SEGMENTD, HIGH);
188  if (e) digitalWrite(SEGMENTE, HIGH);
189  if (f) digitalWrite(SEGMENTF, HIGH);
190  if (g) digitalWrite(SEGMENTG, HIGH);
191}
192void clock_show_colon(void) {
193  unsigned short delaytime;
194  digitalWrite(COLON, HIGH); 
195  delaytime = DELAYTIME * 4;
196  delayMicroseconds(delaytime);
197  digitalWrite(COLON, LOW);
198}

 

karl2233
Offline
Зарегистрирован: 05.07.2015

вот если б комментарии к прогаммке :)  а то для неофитов трудно для понимания.

УПД.

я канешь продвинутый, однако от подсказки не откажусь: как добавить будильник в этот скетч? если автор или ктонить знает, подскажите плз. :)

мож кто знает: использую данный скетч(только поменял всё на индикатор с ОК) и схему использую без ключей - индикатор подключил прямо к МК через резисторы 270 Ом.

так вот, добавил в скетч две сточки (что б точки мигали)

всё работатет, тольсо сами цифры святят еле-еле и мерцают, а точка нормально так себе мигает.

где б ещё пару строк добавить что б избавится от этой напасти? )))

так понимаю, что-то с частотой не то в динамической индикации.

разобрался - строка 136.

dgeka
Offline
Зарегистрирован: 05.07.2016

получается что и семисегментник можно зачудить самопальный и будет работать матрица необязательна ?

dgeka
Offline
Зарегистрирован: 05.07.2016

DarkGenius   покажите где в скетче температуру конвертирует ?как под 18В20 переделать ?

dgeka
Offline
Зарегистрирован: 05.07.2016

karl2233 ткните носом где пентература в скетче считается ?

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

dgeka пишет:

karl2233 ткните носом где пентература в скетче считается ?


Ну же ж в строке 49, и не зачем так орать)

dgeka
Offline
Зарегистрирован: 05.07.2016

спасибки !!! я не кричал!? :)

dgeka
Offline
Зарегистрирован: 05.07.2016
1при попытке компиляции пишет
2что он хочет ?
sketch_jan06a:23: error: no matching function for call to 'Time::Time()'
 
C:\Users\Арсений\Desktop\sketch_jan06a\sketch_jan06a.ino:23:8: note: candidates are:
 
In file included from C:\Users\Арсений\Desktop\sketch_jan06a\sketch_jan06a.ino:1:0:
 
D:\Женины файлы\arduino-1.6.9-windows\arduino-1.6.9\libraries\ds1302/DS1302.h:35:3: note: Time::Time(uint16_t, uint8_t, uint8_t, uint8_t, uint8_t, uint8_t, Time::Day)
 
   Time(uint16_t yr, uint8_t mon, uint8_t date,
 
   ^
 
D:\Женины файлы\arduino-1.6.9-windows\arduino-1.6.9\libraries\ds1302/DS1302.h:35:3: note:   candidate expects 7 arguments, 0 provided
 
D:\Женины файлы\arduino-1.6.9-windows\arduino-1.6.9\libraries\ds1302/DS1302.h:13:7: note: constexpr Time::Time(const Time&)
 
 class Time {
 
       ^
 
D:\Женины файлы\arduino-1.6.9-windows\arduino-1.6.9\libraries\ds1302/DS1302.h:13:7: note:   candidate expects 1 argument, 0 provided
 
D:\Женины файлы\arduino-1.6.9-windows\arduino-1.6.9\libraries\ds1302/DS1302.h:13:7: note: constexpr Time::Time(Time&&)
 
D:\Женины файлы\arduino-1.6.9-windows\arduino-1.6.9\libraries\ds1302/DS1302.h:13:7: note:   candidate expects 1 argument, 0 provided
 
C:\Users\Арсений\Desktop\sketch_jan06a\sketch_jan06a.ino: In function 'void loop()':
 
sketch_jan06a:49: error: 'class DS1302' has no member named 'getTime'
 
sketch_jan06a:80: error: 'class Time' has no member named 'hour'
 
sketch_jan06a:88: error: 'class Time' has no member named 'hour'
 
sketch_jan06a:91: error: 'class DS1302' has no member named 'setTime'
 
sketch_jan06a:95: error: 'class DS1302' has no member named 'setTime'
 
sketch_jan06a:103: error: 'class Time' has no member named 'hour'
 
sketch_jan06a:106: error: 'class DS1302' has no member named 'setTime'
 
sketch_jan06a:110: error: 'class DS1302' has no member named 'setTime'
 
Используем библиотеку ds1302 в папке: D:\Женины файлы\arduino-1.6.9-windows\arduino-1.6.9\libraries\ds1302 (legacy)
exit status 1
no matching function for call to 'Time::Time()'
dimasik89
Offline
Зарегистрирован: 11.08.2017

всем привет!

что за транзистор BD548?

bwn
Offline
Зарегистрирован: 25.08.2014

dimasik89 пишет:

всем привет!

что за транзистор BD548?

Простенько ведь, Митрофанушка, забиваем в хухель "bd548 datasheet" и наслаждаемся откровениями.

DarkGenius
Offline
Зарегистрирован: 09.07.2015

Схема таже но на 12 вольт, лента красная 14вт/м, контроллер ESP32 через степдаун 12v > 3.3v иначе сгорит, датчик DHT22, часы DS3231, кнопок нет, веб интерфейс, немного кривые, но в целом доволен.