1

Тема: Большие часы на семисегментных индикаторах BJ18101AH

Начало разработки

1,8 дюйма
http://forum.rcl-radio.ru/uploads/images/2020/03/e027507fd63f2f4938b4ea5141fa091a.png

http://forum.rcl-radio.ru/uploads/images/2020/03/9e74375cd77e8093a178d7cb3c049623.gif


Размер габаритный: 56х38х11 мм
Высота сивмола: 45 мм

Падение напряжения на сегменте: 1.8-2 вольт
Ток через сегмент: 20 ма
Падение напряжения на точке: 1.8-2 вольта
Ток через точку: 20 ма

Просто часы

http://forum.rcl-radio.ru/uploads/images/2020/03/d2a08b2a4cd62964bba6e6a3c1d72d43.png

http://forum.rcl-radio.ru/uploads/images/2020/03/c8eecf32779a905e7b19189172bcd363.png
Данный контент доступен только зарегистрированным пользователям.


#include <MsTimer2.h>  // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <DS3231.h>
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);}

2

Re: Большие часы на семисегментных индикаторах BJ18101AH

Часы + давление + температура + влажность

DS3231 + BMP280 + DHT11

http://forum.rcl-radio.ru/uploads/images/2020/03/d317cce0004fe122280daac363890a6e.png

Данный контент доступен только зарегистрированным пользователям.


http://forum.rcl-radio.ru/uploads/images/2020/03/ad72dc5b9a85dbf3e32cce34d1302a1f.png
http://forum.rcl-radio.ru/uploads/images/2020/03/b38812140ee5c9e3068739e10c704f88.png
http://forum.rcl-radio.ru/uploads/images/2020/03/7abee8b15f02ae7ab584eec6906efdbb.png
http://forum.rcl-radio.ru/uploads/images/2020/03/b0f858c675d9c4ff8aa7a9bcc9a82689.png

http://forum.rcl-radio.ru/uploads/images/2020/03/9568425d637cc8bafe362fcb7a39f990.png

#include <MsTimer2.h>  // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DS3231.h>
#include <DHT.h> 
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);}

3

Re: Большие часы на семисегментных индикаторах BJ18101AH

Подскажите пожалуйста, а как установить время?

4

Re: Большие часы на семисегментных индикаторах BJ18101AH

Ручная установка времени не предусмотрено, только по времени компиляции

Раскомментируйте строку
clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетча
обновите скетч
Закомментируйте строку
// clock.setDateTime(__DATE__, __TIME__); // Устанавливаем время на часах, основываясь на времени компиляции скетчаъ
снова обновите скетч

5

Re: Большие часы на семисегментных индикаторах BJ18101AH

Коррекция времени кнопками (не тестировалось)

#include <MsTimer2.h>  // http://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,hh,mm;
  byte a[4],w;
 
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 
 pinMode (A1,INPUT_PULLUP); // часы +
 pinMode (A2,INPUT_PULLUP); // минуты +
 // кнопки коррекци времени - нажатие === замыкание на GND 
 
}
 
void loop(){ 
  DateTime=clock.getDateTime();// опрос времени
  hh=DateTime.hour;mm=DateTime.minute;
  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;}

  ///////////////////////////////////// коррекция времени - часы и минуты
  if(analogRead(A1)<900){w=1;hh++;if(hh>23){hh=0;}delay(300);}
  if(analogRead(A2)<900){w=1;mm++;if(mm>59){mm=0;}delay(300);}
  if(w==1){w=0;clock.setDateTime(2020, 01, 01, hh, mm, 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);}
#include <MsTimer2.h>  // http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
#include <Wire.h> 
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <DS3231.h>
#include <DHT.h> 
DHT dht(A1, DHT11); // выход DAT подключен к A1
DS3231 clock;RTCDateTime DateTime;
Adafruit_BMP280 bmp; // I2C
  int an, segm,times,i,pd,pd_p,sek,hh,mm;
  byte a[4],w;
 
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 
 pinMode (A2,INPUT_PULLUP); // часы +
 pinMode (A3,INPUT_PULLUP); // минуты +
 // кнопки коррекци времени - нажатие === замыкание на GND 
}
 
void loop(){ 
  DateTime=clock.getDateTime();// опрос времени
  hh=DateTime.hour;mm=DateTime.minute;
  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;}
  }

  ///////////////////////////////////// коррекция времени - часы и минуты
  if(analogRead(A2)<900){w=1;hh++;if(hh>23){hh=0;}delay(300);}
  if(analogRead(A3)<900){w=1;mm++;if(mm>59){mm=0;}delay(300);}
  if(w==1){w=0;clock.setDateTime(2020, 01, 01, hh, mm, 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);}

6

Re: Большие часы на семисегментных индикаторах BJ18101AH

Отключение/включение кнопкой вывода информации датчиков

 #include <MsTimer2.h>  //
// http://rcl-radio.ru/wp-content/uploads/2018/11/MsTimer2.zip
 #include <Wire.h>
 #include <Adafruit_Sensor.h>
 #include <Adafruit_BMP280.h>
 #include <DS3231.h>
 #include <DHT.h>
 DHT dht(A1, DHT11); // выход DAT подключен к A1
 DS3231 clock;RTCDateTime DateTime;
 Adafruit_BMP280 bmp; // I2C
    int an, segm,times,i,pd,pd_p,sek,hh,mm,ppp;
    byte a[4],w;

 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
   pinMode (A2,INPUT_PULLUP); // часы +
   pinMode (A3,INPUT_PULLUP); // минуты +
   // кнопки коррекци времени - нажатие === замыкание на GND
   pinMode(A6,INPUT);
 }

 void loop(){
    DateTime=clock.getDateTime();// опрос времени
     if(analogRead(A6)>900&&ppp==0){ppp=1;delay(200);}
     if(analogRead(A6)>900&&ppp==1){ppp=0;delay(200);}
    hh=DateTime.hour;mm=DateTime.minute;
    sek=DateTime.second;
 if(ppp==1){
 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;}
     }}
     
     if(ppp==0){
     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;}
      }

    ///////////////////////////////////// коррекция времени - часы и минуты
 if(analogRead(A2)<900){w=1;hh++;if(hh>23){hh=0;}delay(300);}
 if(analogRead(A3)<900){w=1;mm++;if(mm>59){mm=0;}delay(300);}
    if(w==1){w=0;clock.setDateTime(2020, 01, 01, hh, mm, 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);}

7

Re: Большие часы на семисегментных индикаторах BJ18101AH

Соберу протестирую, выложу.

Но у меня индикатор ОА. Что нужно изменить в скетче.

Вы писали:
........Отключение/включение кнопкой вывода информации датчиков....
Показания переключатся автоматически или кнопкой?
........Коррекция времени кнопками (не тестировалось).....
Что это значит и как работает.

.....Показания датчиков выводятся два раза в минуту в течении 4 секунд на каждый параметр...
Это так?

Как задать интервал индикации параметра (в случае автоматического переключения

8

Re: Большие часы на семисегментных индикаторах BJ18101AH

Но у меня индикатор ОА. Что нужно изменить в скетче.

Это не проблема, но схема рассчитана только на эти индикаторы, если у Вас меньше ток потребления сегментов, то нужно менять токоограничивающие резисторы, так же измениться схема подключения анодов.

С индикаторами которые я использую уже есть проект печатной платы (см. на сайте)

Вы писали:
........Отключение/включение кнопкой вывода информации датчиков....
Показания переключатся автоматически или кнопкой?
........Коррекция времени кнопками (не тестировалось).....
Что это значит и как работает.

.....Показания датчиков выводятся два раза в минуту в течении 4 секунд на каждый параметр...
Это так?

Как задать интервал индикации параметра (в случае автоматического переключения

Добавятся три кнопки, две на коррекцию времени и еще одна для отключения датчиков. Подключение кнопок разное, для коррекции времени кнопка один контакт на вход, другой на GND, кнопка отключения имеет классическое подключение, одни контакт на вход и на резистор 10К > GND, другой контакт на +5В

скетч из 6-го поста протестирован

Время индикации датчиков ни как не регулируется, оно забито в скетче в нескольких местах, менять только вручную.

9 (2020-07-03 17:13:19 отредактировано sanj76a)

Re: Большие часы на семисегментных индикаторах BJ18101AH

выложите пожалуста полную схему с последними изменениями.
Скетч для индикаторов с ОА
Укажите где забито время индикации, я изменю сам

10

Re: Большие часы на семисегментных индикаторах BJ18101AH

выложите пожалуста полную схему с последними изменениями.

схемы нет, используйте схему из статьи на сайте, просто добавьте три кнопки

http://forum.rcl-radio.ru/uploads/images/2020/07/5d8ce13a9ff3e7f7a6abf9c1d9acaf56.png

Скетч для индикаторов с ОА

Инвертируйте выходы на сегменты индикаторов в этом блоке

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
    }}

пример

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 0: ch(2,0);ch(3,0);ch(4,0);ch(5,0);ch(6,0);ch(7,0);ch(8,1);ch(13,pd);break;//0

Укажите где забито время индикации, я изменю сам

Здесь все просто, вот блок кода:

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;}
     }}

например sek>=10&&sek<=15

значит что выводит показания датчика с 10 по 15 секунду

11 (2020-07-17 17:47:00 отредактировано sanj76a)

Re: Большие часы на семисегментных индикаторах BJ18101AH

здесь нужно что-то менять для индикатора ОА

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;

для коррекции 3 кнопки?

pinMode (A2,INPUT_PULLUP); // часы +
pinMode (A3,INPUT_PULLUP); // минуты +
   // кнопки коррекци времени - нажатие === замыкание на GND
pinMode(A6,INPUT);


не могу что-то найти куда подключается кнопка откл. датчиков

12

Re: Большие часы на семисегментных индикаторах BJ18101AH

если я подключу так-

   pinMode(2,OUTPUT);  // D2  === A0
   pinMode(3,OUTPUT); // D3 === A1
   pinMode(4,OUTPUT); // D4 === A2
   pinMode(5,OUTPUT); // D5 === A3
   pinMode(8,OUTPUT); // D8 === PD
   pinMode(9,OUTPUT);  // D9  === a
   pinMode(7,OUTPUT);  // D7  === b
   pinMode(10,OUTPUT);  // D10  === c
   pinMode(11,OUTPUT);  // D11  === d
   pinMode(12,OUTPUT);  // D12  === e
   pinMode(3,OUTPUT);  // D3  === f
   pinMode(6,OUTPUT);  // D6  === g

что еще изменить?

13

Re: Большие часы на семисегментных индикаторах BJ18101AH

Лучше подключить как в скетче, иначе придется полностью менять блок кода согласно сегментам индикатора и новым выводам:

http://forum.rcl-radio.ru/uploads/images/2020/07/0ff45739f0b8c90309efbc9bea9236ab.png


            //  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

14

Re: Большие часы на семисегментных индикаторах BJ18101AH

sanj76a пишет:

здесь нужно что-то менять для индикатора ОА

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;

для коррекции 3 кнопки?

pinMode (A2,INPUT_PULLUP); // часы +
pinMode (A3,INPUT_PULLUP); // минуты +
   // кнопки коррекци времени - нажатие === замыкание на GND
pinMode(A6,INPUT);


не могу что-то найти куда подключается кнопка откл. датчиков

15

Re: Большие часы на семисегментных индикаторах BJ18101AH

здесь нужно что-то менять для индикатора ОА

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;

ни чего менять не нужно

для коррекции 3 кнопки?

pinMode (A2,INPUT_PULLUP); // часы +
pinMode (A3,INPUT_PULLUP); // минуты +
   // кнопки коррекци времени - нажатие === замыкание на GND
pinMode(A6,INPUT);


не могу что-то найти куда подключается кнопка откл. датчиков

А2 А3 - это коррекция времени (часы и минуты)
А6 - вкл/отк датчиков (обычная кнопка с резистором на GND, коммутация на +5В)

16

Re: Большие часы на семисегментных индикаторах BJ18101AH

Добрый день.

1.Возник вопрос, т.к. у меня с ОА, то транзисторы должны быть pnp, но они открываются - 0,
  но по умолчанию D9-D12 digitalWrit LOW, нужно-ли их переводить в HIGT? Если да то где внести изменения?

2.Не плохо-бы было ввести сигнализацию вкл/откл дотчиков (светодиод).
   Светится-включены, не светится-отключены

17

Re: Большие часы на семисегментных индикаторах BJ18101AH

инвертирование
      case 0: ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;
      case 1: ch(9,1);ch(10,0);ch(11,1);ch(12,1);break;
      case 2: ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
      case 3: ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
    по второму вопросу после как у Вас все правильно заработает, опубликуете свой код, я доделаю.

18

Re: Большие часы на семисегментных индикаторах BJ18101AH

Как быть с транзисторами, все так и оставить?

19

Re: Большие часы на семисегментных индикаторах BJ18101AH

https://microkontroller.ru/wp-content/uploads/2015/02/Shema-vklyucheniya-mnogorazryadnogo-indikatora1.jpg

20

Re: Большие часы на семисегментных индикаторах BJ18101AH

Это я прекрасно знаю, что по другому нельзя, вы просто про транзисторы ничего не сказали...

21

Re: Большие часы на семисегментных индикаторах BJ18101AH

Транзисторы pnp, по другому ни как.

22

Re: Большие часы на семисегментных индикаторах BJ18101AH

По коду, либо так :
      case 0: ch(9,0);ch(10,1);ch(11,1);ch(12,1);break;
      case 1: ch(9,1);ch(10,0);ch(11,1);ch(12,1);break;
      case 2: ch(9,1);ch(10,1);ch(11,0);ch(12,1);break;
      case 3: ch(9,1);ch(10,1);ch(11,1);ch(12,0);break;
или так
      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;

23

Re: Большие часы на семисегментных индикаторах BJ18101AH

вы писали, что инвертировать, а почему сейчас - так ил так?
я буду пробовать, если проблемы - напишу.

24

Re: Большие часы на семисегментных индикаторах BJ18101AH

Я не уверен нужно ли инвертировать.

25 (2020-07-20 19:00:20 отредактировано sanj76a)

Re: Большие часы на семисегментных индикаторах BJ18101AH

можно-ли назначить на датчики кнопку А5,
А7-часы+, А6-минуты+.
Мне так удобней плату разводить