Сразу оговорюсь лепил из того что было. Лежал у меня неисправный 16х32 индикатор, от рекламного щита. Решил я его распаять под семисегментный индикатор и собрать часы на ардуино. Позже добавил датчик температуры LM35. Перебрал массу скетчей и выжал из них то что мне нужно. Единственное так и не смог понизить яркость значка градусов. Температуру показывают десять секунд, каждую десятую минуту.


017 | unsigned short hours, minutes, seconds, temp; |
018 | unsigned long lastTime; |
019 | DS1302 rtc(9, 10, 11); |
021 | int lastButtonStatemin = LOW; |
022 | int lastButtonStatehour = LOW; |
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); |
042 | rtc.writeProtect( false ); |
043 | analogReference(INTERNAL); |
047 | minutes = t.min % 10; |
049 | int temp = analogRead(tempPin)/ 10.5; |
050 | if (minutes == 0 && seconds >= 10 && seconds < 20){ |
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]; |
061 | digit[1] = tempc / 10; |
062 | digit[2] = tempc % 10; |
065 | clock_show_digit(1, digit[1]); |
066 | delaytime = num_leds[digit[1]] * 50; |
067 | delayMicroseconds(delaytime); |
070 | clock_show_digit(2, digit[2]); |
071 | delaytime = num_leds[digit[2]] * 50; |
072 | delayMicroseconds(delaytime); |
074 | clock_show_digit(3, 11); |
078 | clock_show_time(t.hour, t.min); |
079 | if (t.sec % 2 == 0) { |
082 | if (digitalRead(BUTTONMIN) != lastButtonStatemin) { |
083 | lastButtonStatemin = digitalRead(BUTTONMIN); |
084 | if (digitalRead(BUTTONMIN) == HIGH) { |
089 | rtc.setTime(hours, minutes , 0); |
093 | rtc.setTime(hours, minutes , 0); |
097 | if (digitalRead(BUTTONHOUR) != lastButtonStatehour) { |
098 | lastButtonStatehour = digitalRead(BUTTONHOUR); |
099 | if (digitalRead(BUTTONHOUR) == HIGH) { |
104 | rtc.setTime(hours, minutes , 0); |
108 | rtc.setTime(hours, minutes , 0); |
114 | void clock_show_time(unsigned short hours, unsigned short minutes) { |
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; |
127 | hide_leading_hours_digit = 0; |
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++) { |
135 | clock_show_digit(i, digit[i]); |
136 | delaytime = num_leds[digit[i]] * DELAYTIME; |
137 | delayMicroseconds(delaytime); |
141 | void 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); |
155 | void clock_show_digit(unsigned short position, unsigned short value) { |
165 | digitalWrite(DIGIT1, HIGH); |
168 | digitalWrite(DIGIT2, HIGH); |
171 | digitalWrite(DIGIT3, HIGH); |
174 | digitalWrite(DIGIT4, HIGH); |
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); |
192 | void clock_show_colon( void ) { |
193 | unsigned short delaytime; |
194 | digitalWrite(COLON, HIGH); |
195 | delaytime = DELAYTIME * 4; |
196 | delayMicroseconds(delaytime); |
197 | digitalWrite(COLON, LOW); |
вот если б комментарии к прогаммке :) а то для неофитов трудно для понимания.
УПД.
я канешь продвинутый, однако от подсказки не откажусь: как добавить будильник в этот скетч? если автор или ктонить знает, подскажите плз. :)
мож кто знает: использую данный скетч(только поменял всё на индикатор с ОК) и схему использую без ключей - индикатор подключил прямо к МК через резисторы 270 Ом.
так вот, добавил в скетч две сточки (что б точки мигали)
1
void
clock_show_colon(
void
) {
2
unsigned
short
delaytime;
3
digitalWrite(COLON, HIGH);
4
digitalWrite(DIGIT2, LOW);
// эту
5
delaytime = DELAYTIME * 4;
6
delayMicroseconds(delaytime);
7
digitalWrite(COLON, HIGH);
8
digitalWrite(DIGIT2, LOW);
// и вот эту
всё работатет, тольсо сами цифры святят еле-еле и мерцают, а точка нормально так себе мигает.
где б ещё пару строк добавить что б избавится от этой напасти? )))
так понимаю, что-то с частотой не то в динамической индикации.
разобрался - строка 136.
получается что и семисегментник можно зачудить самопальный и будет работать матрица необязательна ?
DarkGenius покажите где в скетче температуру конвертирует ?как под 18В20 переделать ?
karl2233 ткните носом где пентература в скетче считается ?
karl2233 ткните носом где пентература в скетче считается ?
Ну же ж в строке 49, и не зачем так орать)
спасибки !!! я не кричал!? :)
1
при попытке компиляции пишет
2
что он хочет ?
всем привет!
что за транзистор BD548?
всем привет!
что за транзистор BD548?
Простенько ведь, Митрофанушка, забиваем в хухель "bd548 datasheet" и наслаждаемся откровениями.
Схема таже но на 12 вольт, лента красная 14вт/м, контроллер ESP32 через степдаун 12v > 3.3v иначе сгорит, датчик DHT22, часы DS3231, кнопок нет, веб интерфейс, немного кривые, но в целом доволен.
001
#include "DHT.h"
002
#include "SevSeg.h"
003
#include <WiFi.h>
004
#include <Wire.h>
005
#include <ds3231.h>
006
#define DHTPIN 5
007
#define DHTTYPE DHT22
008
byte
colonPin = 2;
009
byte
numDigits = 4;
010
byte
digitPins[] = {19, 18, 23, 4};
011
byte
oldSec;
012
byte
segmentPins[] = {13, 25, 12, 33, 14, 27, 26};
013
bool
resistorsOnSegments =
true
;
// 'false' means resistors are on digit pins
014
byte
hardwareConfig = N_TRANSISTORS;
// See README.md for options
015
bool
updateWithDelays =
false
;
// Default 'false' is Recommended
016
bool
leadingZeros =
false
;
// Use 'true' if you'd like to keep the leading zeros
017
bool
disableDecPoint =
true
;
// Use 'true' if your decimal point doesn't exist or isn't connected. Then, you only need to specify 7 segmentPins[]
018
bool
colon;
019
bool
colonSet;
020
bool
dhtRead;
021
String header;
022
String ConfigValue[8];
023
String climate =
"On"
;
024
unsigned
long
dhtTimer;
025
float
temp_hum_val[2] = {0};
026
bool
showClimate =
true
;
027
WiFiServer server(80);
028
ts t;
029
SevSeg sevseg;
030
DHT dht(DHTPIN, DHTTYPE);
031
void
setup
() {
032
Serial
.begin(115200);
033
Wire.begin();
034
dht.begin();
035
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments, updateWithDelays, leadingZeros, disableDecPoint);
036
sevseg.setBrightness(100);
037
WiFi.softAP(
"bigclock"
,
"123456789"
,7,1,1);
038
IPAddress IP = WiFi.softAPIP();
039
Serial
.println(IP);
040
server.begin();
041
Wire.begin();
//start i2c (required for connection)
042
DS3231_init(DS3231_INTCN);
//register the ds3231
043
pinMode(colonPin, OUTPUT);
044
}
045
void
loop
() {
046
DS3231_get(&t);
047
if
((t.min % 10 == 0) && (t.sec >= 10) && (t.sec < 30) && showClimate){
048
if
(!dhtRead){
049
digitalWrite(colonPin, LOW);
050
sevseg.setChars(
" "
);
051
sevseg.refreshDisplay();
052
delay(20);
053
if
(!dht.readTempAndHumidity(temp_hum_val)){
054
dhtRead =
true
;
055
}
056
}
057
String stringVar;
058
if
(t.sec < 20){
059
if
(temp_hum_val[1] < 10) stringVar =
" "
;
060
stringVar = stringVar + String(
int
(temp_hum_val[1]),DEC);
061
stringVar = stringVar +
"t*"
;
062
//Serial.println(stringVar);
063
}
064
else
{
065
if
(temp_hum_val[0] < 10) stringVar =
" "
;
066
stringVar = stringVar + String(
int
(temp_hum_val[0]),DEC);
067
stringVar = stringVar +
"*-"
;
068
//Serial.println(stringVar);
069
}
070
char
charBufVar[8];
071
stringVar.toCharArray(charBufVar, 8);
072
sevseg.setChars(charBufVar);
073
sevseg.refreshDisplay();
074
}
075
else
{
076
if
(oldSec != t.sec) {
077
colonSet =
true
;
078
oldSec = t.sec;
079
}
080
if
(colonSet){
081
colon = !colon;
082
if
(colon) digitalWrite(colonPin, HIGH);
083
else
digitalWrite(colonPin, LOW);
084
colonSet =
false
;
085
}
086
timeShow();
087
dhtRead =
false
;
088
}
089
WiFiClient client = server.available();
090
if
(client) {
091
while
(client.connected()) {
092
if
(client.available()) {
093
char
c = client.read();
094
if
(header.length() < 100) {
095
header += c;
096
}
097
if
(c ==
'\n'
) {
098
client.println(
"HTTP/1.1 200 OK"
);
099
client.println(
"Content-type:text/html"
);
100
client.println(
"Connection: close"
);
101
client.println();
102
client.println(
"<!DOCTYPE html><html>"
);
103
client.println(
"<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"
);
104
client.println(
"<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}</style></head>"
);
105
client.println(
"<body><h1>Big Clock Settings</h1>"
);
106
client.println(
"<form action=\"/action_page\">"
);
107
client.print(
"Hours: <input type=\"text\" name=\"Hours\" size=2 value=\"\">"
);
108
client.print(
"Minutes: <input type=\"text\" name=\"Minutes\" size=2 value=\"\">"
);
109
client.print(
"<br><br>"
);
110
client.print(
"<input type=\"submit\" value=\"Submit\">"
);
111
client.print(
"</form>"
);
112
//client.print(form_page);
113
client.print(
"</p>"
);
114
client.print(
"<h1>Climat Show:"
+ climate);
115
client.println(
"</h1></p>"
);
116
client.print(
"<input type=submit value=ON onClick=location.href='/?on8;'>"
);
117
client.print(
" "
);
118
client.print(
"<input type=submit value=OFF onClick=location.href='/?off9;'>"
);
119
client.println(
"</body></html>"
);
120
delay(1);
121
client.stop();
122
int
posFirstCharToSearch = 1;
123
int
count = 0;
124
while
(header.indexOf(
'&'
, posFirstCharToSearch) > -1)
125
{
126
int
posOfSeparatorChar = header.indexOf(
'&'
, posFirstCharToSearch);
// position of & after start position
127
int
posOfValueChar = header.indexOf(
'='
, posFirstCharToSearch);
// position of = after start position
128
ConfigValue[count] = header.substring(posOfValueChar + 1, posOfSeparatorChar);
// extract everything between = and & and enter it in the ConfigValue
129
posFirstCharToSearch = posOfSeparatorChar + 1;
// shift the start position to search after the &-char
130
count++;
131
}
132
int
posOfValueChar = header.indexOf(
'='
, posFirstCharToSearch);
// search for =
133
ConfigValue[count] = header.substring(posOfValueChar + 1, header.length()-10);
// extract everything between = and end of string
134
count++;
135
if
(count > 1){
136
if
(
int
setHours = ConfigValue[0].toInt()){
137
if
(setHours >= 0 && setHours < 23){
138
//Serial.print("Hours: ");
139
//Serial.println(setHours, DEC);
140
t.sec = 0;
141
t.min = t.min;
142
t.hour = setHours;
143
t.wday = t.wday;
144
t.mday = t.mday;
145
t.mon = t.mon;
146
t.year = t.year;
147
DS3231_set(t);
148
}
149
}
150
if
(
int
setMinutes = ConfigValue[1].toInt()){
151
if
(setMinutes >= 0 && setMinutes < 59){
152
//Serial.print("Minutes: ");
153
//Serial.println(setMinutes, DEC);
154
t.sec = 0;
155
t.min = setMinutes;
156
t.hour = t.hour;
157
t.wday = t.wday;
158
t.mday = t.mday;
159
t.mon = t.mon;
160
t.year = t.year;
161
DS3231_set(t);
162
}
163
}
164
}
165
if
(header.indexOf(
'8'
) >0)
//checks for 8
166
{
167
climate =
"On"
;
168
showClimate =
true
;
169
}
170
if
(header.indexOf(
'9'
) >0)
//checks for 9
171
{
172
climate =
"Off"
;
173
showClimate =
false
;
174
}
175
header=
""
;
176
}
177
}
178
}
179
}
180
}
181
void
timeShow() {
182
String stringVar;
183
if
(t.hour < 10) stringVar =
" "
;
184
stringVar = stringVar + String(t.hour, DEC);
185
if
(t.min < 10) {
186
stringVar = stringVar +
"0"
;
187
stringVar = stringVar + String(t.min, DEC);
188
}
189
else
{
190
stringVar = stringVar + String(t.min / 10, DEC);
191
stringVar = stringVar + String(t.min % 10, DEC);
192
}
193
char
charBufVar[8];
194
stringVar.toCharArray(charBufVar, 8);
195
sevseg.setChars(charBufVar);
196
sevseg.refreshDisplay();
// Must run repeatedly
197
}