| Ваш IP: 44.197.197.23 | Online(44) - гости: 9, боты: 35 | Загрузка сервера: 0.49 ::::::::::::

Часы на светодиодных семисегментных индикаторах 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

 

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

Большие часы — 2.lay6

Большие часы — 2

 

Комментарии

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

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

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

  • Реле времени для фотопечати

    Основные параметры: Диапазон выдержек I — 1…6с II — 5,5…33с III — 31…186с Стабильность выдержки 2% Потребляемая мощность 2,5Вт К сети реле времени подключают тумблером S1. Для смены кадров фотоувеличитель включают выключателем S4. При выключенном положении тумблера S1 его контакты S1.2 шунтирует симистор V16 и напряжение сети поступает непосредственно на …Подробнее...
  • Комбинированный биостимулятор

    На рисунке показана схема простого биостимулятора, он совмещает в себе 2-а уст-ва: прибор для электропунктуры и фотостимулятор биологически активных точек (БАТ) организма. Стимулятор может работать в режиме непрерывной генерации ( используем переключатель SA1). Режимы работы стимулятора можно менять переключателями SA1 SA2. Схема биостимулятора проста и после сборки в налаживании не …Подробнее...
  • Автогенераторы на элементах ТТЛ

    При помощи элементов ТТЛ можно изготовить автогенераторы у которых выходная частота превышает 30 МГц. Для того чтобы автогенератор быстро возбуждался и работал стабильно во всем диапазоне внешних воздействий, усилительная линейка должна быть не инвертирующей с большим коэффициентом усиления Ku, который по возможности следует стабилизировать. Схемы простых автогенераторов показаны на рисунках …Подробнее...
  • К1055ХВ7Р — ИС УПРАВЛЕНИЯ РЕЛЕ ВКЛЮЧЕНИЯ ЛАМП АВТОМОБИЛЯ

    К1055ХВ7Р — ИС УПРАВЛЕНИЯ РЕЛЕ ВКЛЮЧЕНИЯ ЛАМП АВТОМОБИЛЯ

    Микросхема К1055ХВ7Р является интегральной схемой управления реле включения ламп автомобиля. Она изготовлена по уникальной биполярной технологии, разработанной для класса ИС, ориентированных на применение в бортовой сети автомобилей. ИС предназначена для работы в качестве мощного счетного триггера в составе реле включения задних противотуманных огней, реле включения передних противотуманных огней, реле включения / переключения ближнего и дальнего света автомобиля с …Подробнее...
  • Домашняя метеостанция (Arduino)

    Домашняя метеостанция (Arduino)

    В домашней метеостанции будут использоваться следующие компоненты: Arduino Nano модуль DS3231 — часы реального времени модуль BMP280 — датчик атмосферного давления и температуры (измерение атмосферного давления в мм.рт.ст и  температуры в комнате) модуль 18B20 — цифровой датчик температуры (измерение температуры на улице) модуль DHT11 — датчик влажности LCD 1602  на базе …Подробнее...