Используя платформу Arduino на 4-х индикаторах BJ18101AH (1,8 дюйма) можно собрать часы с большими цифрами. Светодиодные семисегментные индикаторы BJ18101AH (общий катод) имеют габаритный размер 56х38х11 мм, при высоте символа 45 мм.
Схема подключения к Arduino очень простая, содержит несколько резисторов и четыре транзистора BC337. Питание анодов сегментов индикатора происходит напрямую от цифровых выходов Arduino, при указанных на схеме номиналах ток потребления одного сегмента не превышает 17 мА (макс. 40 мА на один цифровой выход при максимальном общем токе на все выходы не более 200 мА), при этом сегменты индикаторов имеют достаточно большую яркость свечения.
Для отсчета времени в схеме используются часы реального времени DS3231.
Часы используют динамическую систему индикации, все одноименные выводы сегментов всех четырех индикаторов соединяются вместе. Во втором разряде используется точка для индикации такта секунд. Сигнал такта секунд подается в Arduino с выхода SQW DS3231.
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip #include <Wire.h> #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/02/DS3231.zip DS3231 clock;RTCDateTime DateTime; int an, segm,times,i,pd,pd_p; byte a[4]; void setup(){ Wire.begin();clock.begin(); MsTimer2::set(2, to_Timer);MsTimer2::start(); // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча pinMode(9,OUTPUT); // D9 === A0 pinMode(10,OUTPUT); // D10 === A1 pinMode(11,OUTPUT); // D11 === A2 pinMode(12,OUTPUT); // D12 === A3 pinMode(13,OUTPUT); // D13 === PD pinMode(2,OUTPUT); // D2 === a pinMode(3,OUTPUT); // D3 === b pinMode(4,OUTPUT); // D4 === c pinMode(5,OUTPUT); // D5 === d pinMode(6,OUTPUT); // D6 === e pinMode(7,OUTPUT); // D7 === f pinMode(8,OUTPUT); // D8 === g clock.setOutput(DS3231_1HZ); pinMode(A0,INPUT); // SQW DS3231 } void loop(){ DateTime=clock.getDateTime();// опрос времени times = DateTime.hour*100+DateTime.minute; a[0]=times/1000; a[1]=times/100%10; a[2]=times/10%10; a[3]=times%10%10; if(analogRead(A0)>900){pd_p=1;}else{pd_p=0;} }// loop void to_Timer(){ switch(i){ case 0: cl(); segm=a[0]; pd=0; an=0; anod(); segment();break; case 1: cl(); segm=a[1]; pd=pd_p; an=1; anod(); segment();break; case 2: cl(); segm=a[2]; pd=0; an=2; anod(); segment();break; case 3: cl(); segm=a[3]; pd=0; an=3; anod(); segment();break;}i++; if(i>3){i=0;}} void segment(){ switch(segm){ // A B C D E F G PD case 0: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,0);ch(13,pd);break;// 0 case 1: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 1 case 2: ch(2,1);ch(3,1);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,1);ch(13,pd);break;// 2 case 3: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,0);ch(8,1);ch(13,pd);break;// 3 case 4: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 4 case 5: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 5 case 6: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 6 case 7: ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 7 case 8: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 8 case 9: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 9 case 10: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// пусто }} void anod(){ switch(an){ case 0:ch(9,1);ch(10,0);ch(11,0);ch(12,0);break; case 1:ch(9,0);ch(10,1);ch(11,0);ch(12,0);break; case 2:ch(9,0);ch(10,0);ch(11,1);ch(12,0);break; case 3:ch(9,0);ch(10,0);ch(11,0);ch(12,1);break; }} void cl(){ segm=10; pd=0; an=0; segment(); anod(); an=1; segment(); anod(); an=2; segment(); anod(); an=3; segment();anod(); } void ch(int pin, int logic){digitalWrite(pin,logic);}
Часы + давление + температура + влажность
DS3231 + BMP280 + DHT11
Добавив два датчика на основе часов можно собрать простую погодную станцию. С датчика DHT11 будет выводится показания влажности, а с датчика BMP280 атмосферное давление (мм.рт.ст) и температура.
Показания датчиков выводятся два раза в минуту в течении 4 секунд на каждый параметр.
#include <MsTimer2.h> // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip #include <Wire.h> #include <Adafruit_Sensor.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_Sensor.zip #include <Adafruit_BMP280.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_BMP280.zip #include <DS3231.h> // http://rcl-radio.ru/wp-content/uploads/2022/02/DS3231.zip #include <DHT.h> // http://rcl-radio.ru/wp-content/uploads/2018/08/DHT.zip DHT dht(A1, DHT11); // выход DAT подключен к A1 DS3231 clock;RTCDateTime DateTime; Adafruit_BMP280 bmp; // I2C int an, segm,times,i,pd,pd_p,sek; byte a[4]; void setup(){ Wire.begin();clock.begin();bmp.begin();dht.begin(); MsTimer2::set(2, to_Timer);MsTimer2::start(); // clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча pinMode(9,OUTPUT); // D9 === A0 pinMode(10,OUTPUT); // D10 === A1 pinMode(11,OUTPUT); // D11 === A2 pinMode(12,OUTPUT); // D12 === A3 pinMode(13,OUTPUT); // D13 === PD pinMode(2,OUTPUT); // D2 === a pinMode(3,OUTPUT); // D3 === b pinMode(4,OUTPUT); // D4 === c pinMode(5,OUTPUT); // D5 === d pinMode(6,OUTPUT); // D6 === e pinMode(7,OUTPUT); // D7 === f pinMode(8,OUTPUT); // D8 === g clock.setOutput(DS3231_1HZ); pinMode(A0,INPUT); // SQW DS3231 } void loop(){ DateTime=clock.getDateTime();// опрос времени sek=DateTime.second; if((sek>=10&&sek<=15)||(sek>=30&&sek<=35)){ times = bmp.readTemperature(); a[0]=times/10; a[1]=times%10; a[2]=11; a[3]=12; pd_p=0;} else if((sek>=15&&sek<=20)||(sek>=35&&sek<=40)){ times = bmp.readPressure()/133.3224; a[0]=13; a[1]=times/100; a[2]=times/10%10; a[3]=times%10; pd_p=0;} else if((sek>=20&&sek<=25)||(sek>=40&&sek<=45)){ times = dht.readHumidity(); a[0]=14; a[1]=10; a[2]=times/10; a[3]=times%10; pd_p=0;} else{ times = DateTime.hour*100+DateTime.minute; a[0]=times/1000; a[1]=times/100%10; a[2]=times/10%10; a[3]=times%10%10; if(analogRead(A0)>900){pd_p=1;}else{pd_p=0;} } }// loop void to_Timer(){ switch(i){ case 0: cl(); segm=a[0]; pd=0; an=0; anod(); segment();break; case 1: cl(); segm=a[1]; pd=pd_p; an=1; anod(); segment();break; case 2: cl(); segm=a[2]; pd=0; an=2; anod(); segment();break; case 3: cl(); segm=a[3]; pd=0; an=3; anod(); segment();break;}i++; if(i>3){i=0;}} void segment(){ switch(segm){ // A B C D E F G PD case 0: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,0);ch(13,pd);break;// 0 case 1: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 1 case 2: ch(2,1);ch(3,1);ch(4,0);ch(5,1);ch(6,1);ch(7,0);ch(8,1);ch(13,pd);break;// 2 case 3: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,0);ch(8,1);ch(13,pd);break;// 3 case 4: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 4 case 5: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 5 case 6: ch(2,1);ch(3,0);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 6 case 7: ch(2,1);ch(3,1);ch(4,1);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// 7 case 8: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// 8 case 9: ch(2,1);ch(3,1);ch(4,1);ch(5,1);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// 9 case 10: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,0);ch(13,pd);break;// пусто case 11: ch(2,1);ch(3,1);ch(4,0);ch(5,0);ch(6,0);ch(7,1);ch(8,1);ch(13,pd);break;// градус case 12: ch(2,1);ch(3,0);ch(4,0);ch(5,1);ch(6,1);ch(7,1);ch(8,0);ch(13,pd);break;// C case 13: ch(2,1);ch(3,1);ch(4,0);ch(5,0);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// P case 14: ch(2,0);ch(3,1);ch(4,1);ch(5,0);ch(6,1);ch(7,1);ch(8,1);ch(13,pd);break;// H }} void anod(){ switch(an){ case 0:ch(9,1);ch(10,0);ch(11,0);ch(12,0);break; case 1:ch(9,0);ch(10,1);ch(11,0);ch(12,0);break; case 2:ch(9,0);ch(10,0);ch(11,1);ch(12,0);break; case 3:ch(9,0);ch(10,0);ch(11,0);ch(12,1);break; }} void cl(){ segm=10; pd=0; an=0; segment(); anod(); an=1; segment(); anod(); an=2; segment(); anod(); an=3; segment();anod(); } void ch(int pin, int logic){digitalWrite(pin,logic);}
Форум — http://forum.rcl-radio.ru/viewtopic.php?id=148
Индикаторы — https://gotbest.by/redirect/cpa/o/q7r44lmph5thmzyesto83e4orgmgghso/
Дополнительные материалы
Печатную плату разработал и автор фотографий —
anatolij-postolenko@yandex.ru
Часы на светодиодных семисегментных индикаторах 1,8 дюйма_.lay6.zip
Опытный образец платы
Здравствуйте! Спрошу,у Вас точка DP морган? У меня просто горит.
Проверьте наличие секундных импульсов с выхода SQW DS3231
И на показания H влажности два раза мирцание
Так и должно быть, идет измирение, цикл программы на доли секунды останавливается, поддержание динамической индикации в этот момент не возможно
Проверил проводок на месте
Проверьте наличие секундных импульсов с выхода SQW DS3231 с помощью резистора и светодиода или просто можно посмотреть изминение напряжения при помощи мультиметра
Проверил отдельным светодиодом импульс есть, но точка Dp горит полу накалом всегда может это в скетче что то пропустил.
Светодиод сажал с клеммы SQW ds3231 на + 3.3в импульс четкий
Подайте на вход А0 5 В, потом GND, должны гореть и гаснуть все запятые. (отключить провод от SQW)
Вы могли перегрузить выход D13, у Вас был ограничительный резистор 50 Ом, это очень мало.
Почему после отключения питания время сбрасывается?
Проверьте элемент питания ds3231
Прошил версией 1.6.5 и перестало сбрасываться.
Arduino: 1.6.0 (Windows XP), Плата»Arduino Uno»
Выскакивает при компиляции:
Chasi.ino:1:88: fatal error: MsTimer2.h: No such file or directory
compilation terminated.
Ошибка компиляции.
В чем может быть причина? Код скопирован с сатйа
MsTimer2.h: No such file or directory
библиотека не установлена
Добрый вечер! У меня вопрос — что-бы исключить DTH11 какие строки нужно закоментировать, или можно в скетче ничего не трогать и при его отсутствии показания просто не будут выводиться?
убрать эти строки
else if((sek>=20&&sek< =25)||(sek>=40&&sek<=45)){ times = dht.readHumidity(); a[0]=14; a[1]=10; a[2]=times/10; a[3]=times%10; pd_p=0;} DHT dht(A1, DHT11); // выход DAT подключен к A1 dht.begin();
Спасибо! Буду пробовать.
Библиотека MsTimer2 установлена в директории с исходником, а также в Arduino/sketch/libraries. Библиотека с комментария исходника.