| Ваш IP: 3.228.220.31 | Online(40) - гости: 24, боты: 16 | Загрузка сервера: 0.27 ::::::::::::


Часы на светодиодных семисегментных индикаторах 1,8 дюйма (Arduino)

Используя платформу Arduino на 4-х индикаторах BJ18101AH (1,8 дюйма) можно собрать часы с большими цифрами. Светодиодные семисегментные индикаторы BJ18101AH (общий катод) имеют  габаритный размер 56х38х11 мм, при высоте символа 45 мм.

Схема подключения к Arduino очень простая, содержит несколько резисторов и четыре транзистора BC337. Питание анодов сегментов индикатора происходит напрямую от цифровых выходов Arduino, при указанных на схеме номиналах ток потребления одного сегмента не превышает 17 мА (макс. 40 мА на один цифровой выход при максимальном общем токе на все выходы не более 200 мА), при этом сегменты индикаторов имеют достаточно большую яркость свечения.

Для отсчета времени в схеме используются часы реального времени DS3231.

Часы используют динамическую систему индикации, все одноименные выводы сегментов всех четырех индикаторов соединяются вместе. Во втором разряде используется точка для индикации такта секунд. Сигнал такта секунд подается в Arduino с выхода SQW DS3231.

#include <MsTimer2.h>  // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h>  
#include <DS3231.h>    // https://github.com/jarzebski/Arduino-DS3231/archive/master.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>  // https://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <Adafruit_Sensor.h>  // https://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_Sensor.zip
#include <Adafruit_BMP280.h> // https://rcl-radio.ru/wp-content/uploads/2018/08/Adafruit_BMP280.zip
#include <DS3231.h>  // https://github.com/jarzebski/Arduino-DS3231/archive/master.zip
#include <DHT.h>  // https://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

 

Опытный образец платы

 

Комментарии

Добавить комментарий

Войти с помощью: 

Случайные статьи

  • Номинальная статическая характеристика для платиновых термометров сопротивления и чувствительных элементов R0 от 1 до 500 Ом , α = 0,00391 °С

    Номинальная статическая характеристика для платиновых термометров сопротивления и чувствительных элементов R0 от 1 до 500 Ом , α = 0,00391 °С

    Термометр сопротивления — электронный прибор, датчик, предназначенный для измерения температуры. Принцип действия основан на зависимости электрического сопротивления металлов, сплавов и полупроводниковых материалов от температуры. Металлический термометр сопротивления представляет собой резистор, изготовленный из металлической проволоки или металлической плёнки на диэлектрической подложке и имеющий известную зависимость электрического сопротивления от температуры. Наиболее точный …Подробнее...
  • MAX865 преобразователь напряжения 6В  в ±12В

    MAX865 преобразователь напряжения 6В в ±12В

    ИМС MAX685 может быть использована во всех схемах, где доступен источник положительного напряжения и где есть потребность в источнике биполярного напряжения с максимальным током потребления 20 мА. Характеристики Входное напряжение от +1.5 В до +6.0 В Минимальная частота преобразования 20 кГц (выше уровня аудио- частот) Максимальный выходной ток 20 мА …Подробнее...
  • Микросхемы-регуляторы для аудиоаппаратуры

    Микросхемы-регуляторы для аудиоаппаратуры

    Литература РК2002-3Подробнее...
  • Импортные полевые транзисторы — справочник

    Импортные полевые транзисторы — справочник

    Полевой (униполярный) транзистор — полупроводниковый прибор, работа которого основана на управлении электрическим сопротивлением токопроводящего канала поперечным электрическим полем, создаваемым приложенным к затвору напряжением. Область, из которой носители заряда уходят в канал, называется истоком, область, в которую они входят, называется стоком, электрод, на который подается управляющее напряжение, называется затвором. Полевые транзисторы …Подробнее...
  • УМЗЧ 100Вт на транзисторах

    УМЗЧ 100Вт на транзисторах

    Благодаря использованию на выходе усилителя мощных транзисторов TIP142 TIP147, можно сделать простой и мощный усилитель всего на пяти транзисторах. Выходная мощность усилителя 100Вт на нагрузке 8 Ом и достигает 150 Вт на нагрузке 4 Ом. Транзисторы VT3 VT4 VT5 крепятся на одном радиаторе. R9 R10 5Вт.   TIP41 BC556B  Подробнее...