Часы, будильник, термометр. На ARDUINO NANO, DS3231.

sel_oleg
Offline
Зарегистрирован: 08.02.2020

mrWang
Offline
Зарегистрирован: 19.03.2017

Ебей есть! Али не всем богат)

xplp
Offline
Зарегистрирован: 21.12.2012

Схема не нарисована, так соединялось, есть такое исследование:

У экраньчика уже были микросхемки К1109КН2 и дешифраторы К561ИД1.

Это те, что на заднем плане чёрные, в высоком корпусе, которые белые в компактном корпусе, там сдвиговые регистры применены были вместо дешифраторов и td62783apg.
На ибее ценники так себе, особенно на доставку, есть не очень дорогие, но с лишними всякими символами типа такого https://www.ebay.com/itm/Vintage-Vacuum-VFD-Fluorescent-Display-Screens-...

DarkGenius
Offline
Зарегистрирован: 09.07.2015

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

xplp
Offline
Зарегистрирован: 21.12.2012

Схема питания на МТ3608 сделана, 30 вольт выкручено и всё нормально, накал или 3,3 или 5 вольт. На алике вот такой нашёл https://aliexpress.ru/item/32797486846.html?spm=a2g0o.productlist.0.0.3a9a48f9cKuVXz&algo_pvid=d6eaf1a2-42c4-4b8a-b5f6-39e7259e137e&algo_expid=d6eaf1a2-42c4-4b8a-b5f6-39e7259e137e-4&btsid=0be3743b15890291807631551e895a&ws_ab_test=searchweb0_0,searchweb201602_,searchweb201603_ но там 8 разрядов всего, есть ссылка на похожее, но с 16 разрядами?

DarkGenius
Offline
Зарегистрирован: 09.07.2015

этот я и видел, возьми матричный куда больше возможностей.

xplp
Offline
Зарегистрирован: 21.12.2012

Матричный не так интересно смотрится, у меня матричный есть такой scd5580a:

пока не знаю для чего его применить.

YuriiOd
Offline
Зарегистрирован: 22.04.2019
 
Прошу не кидайте тапками, я только учусь и свободного времени на это очень мало(((
Подскажите пожалуйста, взял скетч тут, при проверке выдает такую вот ошибку:
 
sketch_aug04c:3:8: error: no matching function for call to 'DS3231::DS3231()'
 DS3231 clock;
        ^~~~~
In file included from C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino:2:0:
C:\Users\Lenovo\Documents\Arduino\libraries\DS3231/DS3231.h:80:3: note: candidate: DS3231::DS3231(uint8_t, uint8_t)
   DS3231(uint8_t data_pin, uint8_t sclk_pin);
   ^~~~~~
C:\Users\Lenovo\Documents\Arduino\libraries\DS3231/DS3231.h:80:3: note:   candidate expects 2 arguments, 0 provided
C:\Users\Lenovo\Documents\Arduino\libraries\DS3231/DS3231.h:77:7: note: candidate: constexpr DS3231::DS3231(const DS3231&)
 class DS3231
       ^~~~~~
C:\Users\Lenovo\Documents\Arduino\libraries\DS3231/DS3231.h:77:7: note:   candidate expects 1 argument, 0 provided
C:\Users\Lenovo\Documents\Arduino\libraries\DS3231/DS3231.h:77:7: note: candidate: constexpr DS3231::DS3231(DS3231&&)
C:\Users\Lenovo\Documents\Arduino\libraries\DS3231/DS3231.h:77:7: note:   candidate expects 1 argument, 0 provided
sketch_aug04c:4:1: error: 'RTCDateTime' does not name a type
 RTCDateTime dt;
 ^~~~~~~~~~~
sketch_aug04c:5:1: error: 'RTCAlarmTime' does not name a type
 RTCAlarmTime al;
 ^~~~~~~~~~~~
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void loop()':
sketch_aug04c:63:13: error: 'class DS3231' has no member named 'isArmed1'
   if (clock.isArmed1()) {
             ^~~~~~~~
sketch_aug04c:64:15: error: 'class DS3231' has no member named 'isAlarm1'
     if (clock.isAlarm1()) {
               ^~~~~~~~
sketch_aug04c:70:9: error: 'dt' was not declared in this scope
     if (dt.second % 2 == 0) tone(PinBuzzer, 2000, 100);
         ^~
sketch_aug04c:78:7: error: 'dt' was not declared in this scope
       dt = clock.getDateTime();
       ^~
sketch_aug04c:78:18: error: 'class DS3231' has no member named 'getDateTime'; did you mean 'getTime'?
       dt = clock.getDateTime();
                  ^~~~~~~~~~~
                  getTime
sketch_aug04c:81:10: error: 'dt' was not declared in this scope
     if ((dt.minute % 10) == 0 && dt.second >= 10 && dt.second < 30) {
          ^~
sketch_aug04c:143:17: error: 'class DS3231' has no member named 'isAlarm1'
           clock.isAlarm1(LOW);
                 ^~~~~~~~
sketch_aug04c:144:17: error: 'class DS3231' has no member named 'clearAlarm1'
           clock.clearAlarm1();
                 ^~~~~~~~~~~
sketch_aug04c:156:23: error: 'class DS3231' has no member named 'isArmed1'
             if (clock.isArmed1()) {
                       ^~~~~~~~
sketch_aug04c:157:15: error: 'al' was not declared in this scope
               al = clock.getAlarm1();
               ^~
sketch_aug04c:157:26: error: 'class DS3231' has no member named 'getAlarm1'
               al = clock.getAlarm1();
                          ^~~~~~~~~
sketch_aug04c:158:21: error: 'class DS3231' has no member named 'setAlarm1'
               clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW);
                     ^~~~~~~~~
sketch_aug04c:158:62: error: 'DS3231_MATCH_H_M_S' was not declared in this scope
               clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW);
                                                              ^~~~~~~~~~~~~~~~~~
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino:158:62: note: suggested alternative: 'DS3231_ADDR_R'
               clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, LOW);
                                                              ^~~~~~~~~~~~~~~~~~
                                                              DS3231_ADDR_R
sketch_aug04c:161:15: error: 'al' was not declared in this scope
               al = clock.getAlarm1();
               ^~
sketch_aug04c:161:26: error: 'class DS3231' has no member named 'getAlarm1'
               al = clock.getAlarm1();
                          ^~~~~~~~~
sketch_aug04c:162:21: error: 'class DS3231' has no member named 'setAlarm1'
               clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
                     ^~~~~~~~~
sketch_aug04c:162:62: error: 'DS3231_MATCH_H_M_S' was not declared in this scope
               clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
                                                              ^~~~~~~~~~~~~~~~~~
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino:162:62: note: suggested alternative: 'DS3231_ADDR_R'
               clock.setAlarm1(al.day, al.hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
                                                              ^~~~~~~~~~~~~~~~~~
                                                              DS3231_ADDR_R
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void IncMinutes()':
sketch_aug04c:184:3: error: 'dt' was not declared in this scope
   dt = clock.getDateTime();
   ^~
sketch_aug04c:184:14: error: 'class DS3231' has no member named 'getDateTime'; did you mean 'getTime'?
   dt = clock.getDateTime();
              ^~~~~~~~~~~
              getTime
sketch_aug04c:187:9: error: 'class DS3231' has no member named 'setDateTime'; did you mean 'setTime'?
   clock.setDateTime(dt.year, dt.month, dt.day, dt.hour, Minute, 0);
         ^~~~~~~~~~~
         setTime
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void IncAlarmMinutes()':
sketch_aug04c:191:3: error: 'al' was not declared in this scope
   al = clock.getAlarm1();
   ^~
sketch_aug04c:191:14: error: 'class DS3231' has no member named 'getAlarm1'
   al = clock.getAlarm1();
              ^~~~~~~~~
sketch_aug04c:194:9: error: 'class DS3231' has no member named 'setAlarm1'
   clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH);
         ^~~~~~~~~
sketch_aug04c:194:47: error: 'DS3231_MATCH_H_M_S' was not declared in this scope
   clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH);
                                               ^~~~~~~~~~~~~~~~~~
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino:194:47: note: suggested alternative: 'DS3231_ADDR_R'
   clock.setAlarm1(al.day, al.hour, Minute, 0, DS3231_MATCH_H_M_S, HIGH);
                                               ^~~~~~~~~~~~~~~~~~
                                               DS3231_ADDR_R
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void IncHour()':
sketch_aug04c:198:3: error: 'dt' was not declared in this scope
   dt = clock.getDateTime();
   ^~
sketch_aug04c:198:14: error: 'class DS3231' has no member named 'getDateTime'; did you mean 'getTime'?
   dt = clock.getDateTime();
              ^~~~~~~~~~~
              getTime
sketch_aug04c:201:9: error: 'class DS3231' has no member named 'setDateTime'; did you mean 'setTime'?
   clock.setDateTime(dt.year, dt.month, dt.day, Hour, dt.minute, 0);
         ^~~~~~~~~~~
         setTime
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void IncAlarmHour()':
sketch_aug04c:205:3: error: 'al' was not declared in this scope
   al = clock.getAlarm1();
   ^~
sketch_aug04c:205:14: error: 'class DS3231' has no member named 'getAlarm1'
   al = clock.getAlarm1();
              ^~~~~~~~~
sketch_aug04c:208:9: error: 'class DS3231' has no member named 'setAlarm1'
   clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
         ^~~~~~~~~
sketch_aug04c:208:47: error: 'DS3231_MATCH_H_M_S' was not declared in this scope
   clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
                                               ^~~~~~~~~~~~~~~~~~
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino:208:47: note: suggested alternative: 'DS3231_ADDR_R'
   clock.setAlarm1(al.day, Hour, al.minute, 0, DS3231_MATCH_H_M_S, HIGH);
                                               ^~~~~~~~~~~~~~~~~~
                                               DS3231_ADDR_R
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void LED_WriteTime()':
sketch_aug04c:212:3: error: 'dt' was not declared in this scope
   dt = clock.getDateTime();
   ^~
sketch_aug04c:212:14: error: 'class DS3231' has no member named 'getDateTime'; did you mean 'getTime'?
   dt = clock.getDateTime();
              ^~~~~~~~~~~
              getTime
sketch_aug04c:221:40: error: 'class DS3231' has no member named 'isArmed1'
   LED_WriteDigit(4, Minute % 10, clock.isArmed1());
                                        ^~~~~~~~
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void LED_WriteAlarm()':
sketch_aug04c:224:3: error: 'dt' was not declared in this scope
   dt = clock.getDateTime();
   ^~
sketch_aug04c:224:14: error: 'class DS3231' has no member named 'getDateTime'; did you mean 'getTime'?
   dt = clock.getDateTime();
              ^~~~~~~~~~~
              getTime
sketch_aug04c:225:3: error: 'al' was not declared in this scope
   al = clock.getAlarm1();
   ^~
sketch_aug04c:225:14: error: 'class DS3231' has no member named 'getAlarm1'
   al = clock.getAlarm1();
              ^~~~~~~~~
sketch_aug04c:234:40: error: 'class DS3231' has no member named 'isArmed1'
   LED_WriteDigit(4, Minute % 10, clock.isArmed1());
                                        ^~~~~~~~
C:\Users\Lenovo\Documents\Arduino\sketch_aug04c\sketch_aug04c.ino: In function 'void LED_WriteTemp()':
sketch_aug04c:237:22: error: 'class DS3231' has no member named 'readTemperature'
   float Temp = clock.readTemperature();
                      ^~~~~~~~~~~~~~~
exit status 1
no matching function for call to 'DS3231::DS3231()'
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

YuriiOd пишет:

Прошу не кидайте тапками

Ну, щас! А чем можно кидать?

YuriiOd пишет:

свободного времени на это очень мало(((

А у нас девать некуда!

YuriiOd пишет:

Подскажите пожалуйста

Что именно подсказать? Вы вопрос забыли задать.

YuriiOd пишет:

взял скетч тут

Где?

Типа "Мы - наши туристы"?

b707
Offline
Зарегистрирован: 26.05.2017

YuriiOd - не ту библиотеку для часов взяли.

YuriiOd
Offline
Зарегистрирован: 22.04.2019

Спасибо большое, уже заменил на нужную, работает

 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

...

Показывают время, дату, температуру, влажность, давление, есть будильник по дням недели.

Код для ардуино кому интересно:.....

Схемой подключения и скетчем не поделитесь для ИВ-18 ?

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Для xplp...собрал по Вашей схеме и чего то не "взлетает"

Может где накосячил, взгляните...

Схема

Плата

 

xplp
Offline
Зарегистрирован: 21.12.2012

Мой косяк, со схемой напортачил, колбу нужно по другому подключить. Там выводы сегментов и сеток поменять местами нужно. https://www.thingiverse.com/download:8720360

xplp
Offline
Зарегистрирован: 21.12.2012

ИВ-18

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

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Так?

xplp
Offline
Зарегистрирован: 21.12.2012

Да всё верно.

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

Да всё верно.

Вечером перекину, отпишусь

xplp
Offline
Зарегистрирован: 21.12.2012

В какой проге схема нарисована? Я рисовал в Dip Trace, но именно рисовал, полноценно пользоваться не умею (=

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

В какой проге схема нарисована? Я рисовал в Dip Trace, но именно рисовал, полноценно пользоваться не умею (=

Схему или печатку? Схему рисовал в Splan70, печатку в Layout60, но тоже именно рисую, а не трассирую.

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Перекинул выводы, все отлично!

Только никак не могу найти как включить режим, чтобы показывало время-температура. Нашел только постоянно время, время-дата, а хочу время-температура. Или в этом скетче не задействован датчик который в DS3231 и надо вешать BMP280 ?

xplp
Offline
Зарегистрирован: 21.12.2012

Да там используется BMP280. Нужно 36 строчку поменять с #define BMP_280 0 на #define BMP_280 1 и датчик повесить на i2c интерфейс.

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

Да там используется BMP280. Нужно 36 строчку поменять с #define BMP_280 0 на #define BMP_280 1 и датчик повесить на i2c интерфейс.

Припаял датчик BME/BMP280, прописал #define BMP_280 1 , температуру кажет 0.0 С, давление вообще не понятно что кажет... Ни чего больше раскоментировать в скетче не надо? Может у меня датчик BME280?

Вот такой https://b.allegroimg.com/original/01d764/0cfcf5a44d21b8084d673d859bdb

Покурил инет, у меня похоже точно BME280

Заменил библиотеку на Adafruit_BME280.h, заменил все что было bmp на bme, все равно по нолям.

Может конкретно надо указывать адрес на шине I2C ?

xplp
Offline
Зарегистрирован: 21.12.2012

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

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Ссылка на скетч (измененный)

https://cloud.mail.ru/public/59GZ/4HBjaXWho

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

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

Ну могу и эту затереть примером, но датчик в других примерах точно работал

xplp
Offline
Зарегистрирован: 21.12.2012
/* ИВ-18
 1 – Катод, проводящий слой внутренней поверхности баллона;
 2 – dp1...dp8 – аноды-сегменты с 1го по 8й разряд;
 3 – d1...d8 – аноды-сегменты с 1го по 8й разряд;
 4 – c1...c8 – аноды-сегменты с 1го по 8й разряд;
 5 – e1...e8 – аноды-сегменты с 1го по 8й разряд;
 6 – (свободный);
 7 – (свободный);
 8 – (свободный);
 9 – g1...g8 – аноды-сегменты с 1го по 8й разряд;
10 – b1...b8 – аноды-сегменты с 1го по 8й разряд;
11 – f1...f8 – аноды-сегменты с 1го по 8й разряд;
12 – a1...a8 – аноды-сегменты с 1го по 8й разряд;
13 – Катод;
14 – Сетка 9го разряда;
15 – Сетка 1го разряда;
16 – Сетка 3го разряда;
17 – Сетка 5го разряда;
18 – Сетка 8го разряда;
19 – Сетка 7го разряда;
20 – Сетка 6го разряда;
21 – Сетка 4го разряда;
22 – Сетка 2го разряда.
// ABCDEFG
 */
#define bt0 A0
#define bt1 A1
#define bt2 A2
#define BME_280 1 //используем датчик BME280 температуры и давления или нет
#include <EEPROM.h>

#include <Wire.h>
#if (BME_280 == 1)
#include <Adafruit_BME280.h>
#endif
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231); 
#if (BME_280 == 1)
Adafruit_BME280 bme; // Подключение датчика по шине I2C
#endif
byte digitEf[] = {B01111111,
                  B00111111,
                  B00111101,
                  B00011101,
                  B00011100,
                  B00011000,
                  B00001000,
                  B00000000};//для эффекта смены цифр
//byte segment[]={SEG1,SEG2,SEG3,SEG4};  // куда подключены сетки индикатора
byte digit[] = {0,0,0,0,0,0,0,0};  // содержимое для отображения на сегментах
byte digit_old[] = {0,0,0,0,0,0,0,0};  //старое содержимое сегментов для эффектов смены цифр
byte digit_i[] = {0,0,0,0,0,0,0,0};  // счётчики для эффектов на сегментах
unsigned long digit_mill[] = {0,0,0,0,0,0,0,0}; // для функции эффекта смены цифры
bool dot[] = {0,0,0,0,0,0,0,0}; // где рисовать точку
byte _tmscr=0;
byte _tm=0;
byte tmpchar=0;
byte _size=0;
bool scroll=1;
byte valSc = 127;
//byte valSo = 192;
bool getTP=0; 
byte mod = 1;
byte timeCR = 30;
bool _tCR=1;
bool _dot = 0;
float temperature = 0;
#define BRIGHTNESS 16
volatile byte indiDimm[8]= {BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS};// величина диммирования (0-16)
volatile byte indiCounter[8];     // счётчик каждого индикатора (0-16)
volatile byte indiDigits[8];      // цифры, которые должны показать индикаторы (0-10)
volatile byte curIndi;            // текущий индикатор (0-7)

unsigned long mill=0;
unsigned long mill0=0;
unsigned long millB=0;
int _gTP = 0;
String tmpTP; 

byte num[]={
  // ABCDEFG
   B01111110,//0
   B00110000,//1
   B01101101,//2
   B01111001,//3
   B00110011,//4
   B01011011,//5
   B01011111,//6
   B01110000,//7
   B01111111,//8
   B01111011,//9
   B00000001,//9
  };
 byte efnt[]={
  0b01110111, //A
  0b00011111, //b
  0b01001110, //C
  0b00111101, //d 
  0b01001111, //E
  0b01000111, //F
  0b01011110, //G
  0b00010111, //h
  0b00110000, //I 
  0b00111000, //J
  0b01010111, //k
  0b00001110, //L
  0b01010101, //m
  0b00010101, //n
  0b00011101, //o
  0b01100111, //P 
  0b01110011, //q
  0b00000101, //r
  0b01011011, //S
  0b00001111, //t
  0b00011100, //u
  0b00111110, //V
  0b00111111, //w
  0b00110111, //X
  0b00111011, //y
  0b01101101, //Z
  0b00000001, //-
  0b01000000, //=
  0b00001000, //_(*)
  0b01100011, //^
//  0b10000000, //.
  };   

void setup() {
  for(byte i=0; i<12; i++)
  pinMode(i, OUTPUT);
  pinMode(bt0, INPUT_PULLUP);
  pinMode(bt1, INPUT_PULLUP);
  pinMode(bt2, INPUT_PULLUP);
  if(EEPROM.read(1)>5){
        EEPROM.write(0, timeCR);
        EEPROM.write(1, mod);
  }else{
  timeCR = EEPROM.read(0);
  mod = EEPROM.read(1);
  }
  // перенастраиваем частоту ШИМ на пинах 3 и 11 на 7.8 кГц и разрешаем прерывания COMPA
  TCCR2B = (TCCR2B & B11111000) | 2;    // делитель 8
  TCCR2A |= (1 << WGM21);   // включить CTC режим для COMPA
  TIMSK2 |= (1 << OCIE2A);  // включить прерывания по совпадению COMPA
   
  delay(100);
   //time.begin();
   time.period(1000);
   delay(100);
#if (BME_280 == 1)
   bme.begin(); 
    bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );
#endif                  
   //time.gettime();
}

ISR(TIMER2_COMPA_vect) {
  indiCounter[curIndi]++;             // счётчик индикатора
  if (indiCounter[curIndi] >= indiDimm[curIndi]){  // если достигли порога диммирования       
    PORTD  = B00000000; // выключить сегменты 
  }
  if (indiCounter[curIndi] > 16) {    // достигли порога в X единиц
    indiCounter[curIndi] = 0;         // сброс счетчика лампы
    if (++curIndi >= 8) curIndi = 0;  // смена лампы закольцованная

    if (indiDimm[curIndi] > 0) {
  
        PORTD = digit[curIndi]+(dot[curIndi]<<7);//B10000000; 
        PORTB = curIndi; // включить сетку на текущую лампу       
    }
  }

}
void _timeCR(){// функция для коррекции времени, увеличивает или уменьшает на заданное количество секунд раз в сутки
  
if(time.Hours == 3 && time.minutes == 15 && time.seconds == 30 && _tCR==1){
   _tCR=0;
   if(timeCR <31){
   time.settime(time.seconds-(30-timeCR), time.minutes, time.Hours);
   }else{
    time.settime(time.seconds+(timeCR-30), time.minutes, time.Hours);
    }
}else if(time.Hours == 3 && time.minutes == 16 && _tCR==0){
  _tCR=1;
}
}
void sendByte(byte _A, byte _S){
    digit[7-_S]=_A;
}
 
void sendStr6(String _st){// вывод строки
  for(byte i =0; i<8; i++){
    if(_st[i]>47 && _st[i]<58){
    sendByte((num[_st[i]-48]),i);
    }else if(_st[i]>64 && _st[i<91]){
      sendByte((efnt[_st[i]-65]),i);
      }else if(_st[i]==45){
        sendByte(efnt[26],i);
        }else if(_st[i]==61){
          sendByte(efnt[27],i);
          }else if(_st[i]==42){
            sendByte(efnt[28],i);
            }else if(_st[i]==95){
              sendByte(efnt[29],i);
            }else{sendByte(B0,i);
        }
    }
  }
void sndStr(String _lst){// бегущая строка
  _size=_lst.length();
  if(_size>8 && scroll==1){
  _lst="     "+_lst;
  if(millis()- mill > valSc+20){
  _tmscr++;mill=millis();
  }
  sendStr6( (String)_lst[_tmscr]+
            (String)_lst[_tmscr+1]+
            (String)_lst[_tmscr+2]+
            (String)_lst[_tmscr+3]+
            (String)_lst[_tmscr+4]+
            (String)_lst[_tmscr+5]+
            (String)_lst[_tmscr+6]+
            (String)_lst[_tmscr+7]
            );
            if(_tmscr>_size+8){
              scroll=0;_tmscr=0;
              }//mill0=millis();
  }else{
    sendStr6(_lst);
    }
  }  
void dotSet(byte _d){// рисуем точки в заданной позиции
  if(millis()-millB < 1000&& mod<9){
    for(byte i=0; i<8; i++){
        if(i==8-mod){
        dot[i]=1;
        }else{
        dot[i]=0; 
        }
     }
  }else{
  for(byte i=0; i<8; i++){dot[i]=bitRead(_d, i);} 
}
}
void dSP(byte _a, byte _n){//функция для плавной смены цифры с эффектами(6 эффектов)
  //delay(2);
 if(millis()-digit_mill[_a]>20){
 if(mod<10){
    if(_n!=digit_old[_a]){
      digit_i[_a] = random(6)<<5;
    }  
  if((_n!=digit_old[_a]||digit_i[_a]>0)){
  digit_old[_a]=_n;    
  switch((digit_i[_a]>>5)){   
  case 0:
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=(digit[_a]>>1)&(~(1));//0b1111111111111110;
      indiDimm[_a]--;
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=(_n>>(15-(digit_i[_a]&B00011111)))&(~(1));
      indiDimm[_a]++;
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;  
    
    case 1:
    if((digit_i[_a]&B00011111)<BRIGHTNESS){
      //digit[_a]=digit[_a]>>1;
      indiDimm[_a]--;
      digit_i[_a]++;      
    }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2){
      digit[_a]=_n;
      indiDimm[_a]++;
      //delay(1);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)!=0){
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;
    
    case 2:
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(~digitEf[(digit_i[_a]&B00011111)-8]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;
   
   case 3: 
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(digitEf[(digit_i[_a]&B00011111)]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;

   case 4: 
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;

   case 5:
    if((digit_i[_a]&B00011111)<BRIGHTNESS){
      //digit[_a]=digit[_a]>>1;
      indiDimm[_a]--;
      digit_i[_a]++;      
    }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2+1){
      digit[_a]=_n;//>>(15-digit_i[_a]);
      indiDimm[_a]++;
      //delay(1);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)!=0){
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;
    
    default:
      digit[_a]=_n;
      indiDimm[_a]=BRIGHTNESS;
    }
        }else{
        indiDimm[_a]=BRIGHTNESS;
        digit[_a]=_n;
        }
  }else if(mod>10){
    digit[_a]=_n;
    indiDimm[_a]=BRIGHTNESS;
  }
  digit_mill[_a]=millis();}
}
void digitTD(byte _c, byte _d, byte _y, byte _b){// рисуем 8м цифр
  digit[7] = num[_c/10];
  digit[6] = num[_c%10];
  digit[5] = num[_d/10];
  digit[4] = num[_d%10];
  digit[3] = num[_y/10];
  digit[2] = num[_y%10];
  digit[1] = num[_b/10];
  digit[0] = num[_b%10];  
}
void digitTD3(byte _a, byte _b, byte _c){// рисуем 6м цифр веремени + разделительные секунды
  dSP(7,num[_a/10]);
  dSP(6,num[_a%10]); 
  dSP(4,num[_b/10]);
  dSP(3,num[_b%10]); 
  dSP(1,num[_c/10]);
  dSP(0,num[_c%10]);
  if(millis()/1000%10<5){
  digit[5] = 0b01000000>>(millis()/1000%6);
  digit[2] = 0b01000000>>(millis()/100%6);
  }else{
  digit[5] = 0b00000001<<(millis()/1000%3*3);
  digit[2] = 0b00000001<<((millis()-500)/1000%3*3);
  }
}
void clr(){ // очистка буфера, установка яркости по умолчанию
  if(getTP==0){  
  for(byte i=0; i<8; i++){
    //digit[i]=0;
    digit_old[i]=0;
    indiDimm[i]=BRIGHTNESS;  
  }getTP=1;
}
}
void keyR(){//чтение кнопок +/-
  if(digitalRead(bt0)==LOW && millis()-millB>300){mod++;scroll=1;_tmscr=0;millB=millis();}
  if(digitalRead(bt2)==LOW && millis()-millB>300){mod--;scroll=1;_tmscr=0;millB=millis();} 
}
int _keyH(int i){
  if(millis() - millB > 200){    //читаем кнопку +
  if(digitalRead(bt0)==LOW){ 
      millB = millis();
           i++;
      }
   }
   return i;
}

int _keyL(int i){
  if(millis() - millB > 200){    //читаем кнопку -
  if(digitalRead(bt2)==LOW){ 
      millB = millis();
           i--;
      }
  }
   return i;
}
int _sm(int i, int a){  //значение в диапазоне 0-a
      if(i>=a){
        i-=a;
      }else if(i<0){
        i+=a;
      }
   return i; 
} 
bool _keyS(){//чтение кнопки ОК
  if(millis() - millB > 300){ 
    if(digitalRead(bt1)==LOW){
      scroll=1;_tmscr=0;millB=millis();
      return true; 
    }else{return false;}
  }else{return false;}

}
void loop() {
//digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
  ///*
_timeCR();  
  switch(mod){
    case 0:
    #if (BME_280 == 1)
    mod = 4;
    #else 
    mod = 2;
    #endif
    break;
    case 1:
    keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
    if(millis() - millB < 500){   
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
            dotSet(B10000000>>(millis()/80%8));
        }       
        digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
      }else if(millis()-millB <25000){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      }else{
        getTP=0;
        clr();
        millB = millis()-1000;     
      }
    break;
    case 2:
    keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
  if(time.seconds%10<1){
    sndStr("  TIME");
    dotSet(B00000000);
    }else if(time.seconds%10<6){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      scroll=1;
    }else if(time.seconds%10<7){
     sndStr("  DATA");
     dotSet(B00000000);
    }else if(time.seconds%10<9){
      digitTD(time.day,time.month,20,time.year);
      dotSet(B01010000<<(millis()/500%2*4));
      scroll=1;
    }else{
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
          dotSet(B10000000>>(millis()/80%8));
        }
        for(byte i=0; i<8; i++){
          digit_old[i]=B0;
        }
      digitTD(millis()/30%100,millis()/70%60,millis()/60%70,millis()/80%100);
    }
    break;
    #if (BME_280 == 1)
    case 3:
    keyR();
    //if(_keyS()==true){mod=10;}
    time.gettime();
  if(time.seconds%10<2){
     sndStr("TEMPERATURA");
     dotSet(B00000000);
     if(!getTP){
      getTP=1;
      temperature = bme.readTemperature();//lm75a_sensor.getTemperatureInDegrees();
      //sprintf(tmpTP, "%03d", ((int)(temperature*10)));
      _gTP= ((int)(temperature*10));
      }
            if(_gTP>99){
        tmpTP="  "+(String)(_gTP)+"^C";
      }else if(_gTP>=10){
        tmpTP="   "+(String)((_gTP))+"^C";
      }else if(_gTP>=0){
        tmpTP="   0"+(String)((_gTP))+"^C";
      }else if(_gTP<=(-1)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else if(_gTP>(-99)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else {
        tmpTP=" "+(String)((_gTP))+"^C";
      }
    }else if(time.seconds%10<4){
      _tmscr=0;
      scroll=1;
      getTP=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
    }else if(time.seconds%10<6){
     sndStr("DAVLENIE MM*HG");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readPressure()/133.3+7;
      }
      tmpTP=(String)((int)(_gTP))+" MMHG";
    }else if(time.seconds%10<8){
      _tmscr=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
      getTP=0;
    }else{
      digitTD(millis()/16%100,millis()/8%100,millis()/16%100,millis()/8%100);
      dotSet(B10000000>>(millis()/50%8));
      scroll=1;
      getTP=0;
    }

    break;
  
    case 4:
      keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
  if(time.seconds%20<1){
    sndStr("  TIME");
    dotSet(B00000000);
    }else if(time.seconds%20<7){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      scroll=1;
    }else if(time.seconds%20<8){
     sndStr("  DATA");
     dotSet(B00000000);
    }else if(time.seconds%20<11){
      digitTD(time.day,time.month,20,time.year);
      dotSet(B01010000<<(millis()/500%2*4));
      scroll=1;
    }else if(time.seconds%20<12){
     sndStr("TEMPER^C");
     dotSet(B00000000);
     if(!getTP){
      getTP=1;
      temperature = bme.readTemperature();//lm75a_sensor.getTemperatureInDegrees();
      _gTP= temperature*10;
      }
            if(_gTP>99){
        tmpTP="  "+(String)(_gTP)+"^C";
      }else if(_gTP>=10){
        tmpTP="   "+(String)((_gTP))+"^C";
      }else if(_gTP>=0){
        tmpTP="   0"+(String)((_gTP))+"^C";
      }else if(_gTP<=(-1)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else if(_gTP>(-99)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else {
        tmpTP=" "+(String)((_gTP))+"^C";
      }
    }else if(time.seconds%20<14){
      _tmscr=0;
      scroll=1;
      getTP=0;
      sendStr6(tmpTP);
      dotSet(B00010000); 
     }else if(time.seconds%20<16){
     sndStr("DAVLENIE MM*HG");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readPressure()/133.3+7;
      }
      tmpTP=(String)((int)(_gTP))+" MMHG";
    }else if(time.seconds%20<19){
      _tmscr=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
      getTP=0;
    }else{
    if(millis()/160%8<4){
      dotSet(B1<<(millis()/80%8));
      }else{
      dotSet(B10000000>>(millis()/80%8));
    }
      for(byte i=0; i<8; i++){
          digit_old[i]=B0;
        }
      digitTD(millis()/30%100,millis()/70%60,millis()/60%70,millis()/80%100);
    }
    break;
    #endif
    case 9:
    mod= 14;
    break;
    case 10:
    sndStr("TIME SETUP");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=20;}    
    break;
    case 11:
    sndStr("DATA SETUP");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=30;} 
    break;
    case 12:
    sndStr("CORRECT TIME");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=40;} 
    break;
    case 13:
    sndStr("MODE START");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){_tm=EEPROM.read(1)-1;mod=50;} 
    break;
    case 14:
    sndStr("  EXIT");
    keyR();
    if(_keyS()==true){mod=1;} 
    dotSet(B00000000);
    break;
    case 15:
    mod = 10;
    break;
    
    case 20:
            if(millis()/50%10<5){
              digit[7] = B00000000;
              digit[6] = B00000000;
            dotSet(B11000000); 
            }else{
              digitTD3(time.Hours,time.minutes,time.seconds);
              dotSet(B00000000); }
            time.Hours=_sm(_keyH(int(time.Hours)),24);
            time.Hours=_sm(_keyL(int(time.Hours)),24);
            if(_keyS()==true){mod++;}
      break;
      case 21:
            if(millis()/50%10<5){
              digit[3] = B00000000;
              digit[4] = B00000000;
            dotSet(B00011000); 
            }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds);}
            time.minutes=_sm(_keyH(int(time.minutes)),60);
            time.minutes=_sm(_keyL(int(time.minutes)),60);
            if(_keyS()==true){mod++;}
      break;
      case 22:
            if(millis()/50%10<5){
              digit[0] = B00000000;
              digit[1] = B00000000;
            dotSet(B00000011); 
            }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds);}
            time.seconds=_sm(_keyH(int(time.seconds)),60);
            time.seconds=_sm(_keyL(int(time.seconds)),60);
            if(_keyS()==true){mod++;}
      break;
      case 23:
          time.settime(time.seconds, time.minutes, time.Hours);
          mod=10;
      break;
      
      case 30:
            if(millis()/50%10<5){
              digit[7] = B00000000;
              digit[6] = B00000000;
            dotSet(B11000000); 
            }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year);}
            time.day=_sm(_keyH(int(time.day)),32);
            time.day=_sm(_keyL(int(time.day)),32);
            if(_keyS()==true){mod++;}
      break;
      case 31:
            //digitTD(time.day,time.month);
            if(millis()/50%10<5){
              digit[5] = B00000000;
              digit[4] = B00000000;
            dotSet(B00110000); 
            }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year);}
            time.month=_sm(_keyH(int(time.month)),13);
            time.month=_sm(_keyL(int(time.month)),13);
            if(_keyS()==true){mod++;}
      break;
      case 32:
            if(millis()/50%10<5){
              digit[1] = B00000000;
              digit[0] = B00000000;
            dotSet(B00001111); 
            }else{dotSet(B00000000); digitTD(time.day,time.month,20,time.year);}

            time.year=_sm(_keyH(int(time.year)),100);
            time.year=_sm(_keyL(int(time.year)),100);
            if(_keyS()==true){mod++;}

      break;
      case 33:
          time.settime(0, -1, -1, time.day, time.month, time.year);
          mod=11;
      break;
      
      case 40:
           
            if(timeCR<30){
              sendStr6("COR*T-"+(String)(30-timeCR));
            }else{
              sendStr6("COR*T "+(String)(timeCR-30));
            }
            dotSet(B0000); 
            timeCR=_sm(_keyH(int(timeCR)),59);
            timeCR=_sm(_keyL(int(timeCR)),59);
            if(_keyS()==true){mod++;}

      break;
      case 41:
          EEPROM.write(0, timeCR);
          mod=12;
      break;

      case 50:
            sendStr6("MODE * "+(String)(_tm+1));
            dotSet(B10000000>>_tm); 
            #if (BME_280 == 1)
            _tm=_sm(_keyH(int(_tm)),4);
            _tm=_sm(_keyL(int(_tm)),4);
            #else
            _tm=_sm(_keyH(int(_tm)),2);
            _tm=_sm(_keyL(int(_tm)),2);
            #endif
            if(_keyS()==true){mod++;}

      break;
      case 51:
          EEPROM.write(1, (_tm+1));
          _tm=0;
          mod=13;
      break;
      
    default:
    mod = 1;
  }//*/
}

там инициализация разная в setup,  поменял из примера на BME280 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

По умолчанию адрес BME280 I2C 0x76,  ( http://arduino.ru/forum/apparatnye-voprosy/pomenyat-adres-i2c-na-bme280) вписал так: #if (BME_280 == 1) bme.begin(0x76, &Wire); и все "взлетело" Правда разница у рядом лежащего DS18B20 от другого девайса, 2 градуса.  DS-ка на 2 градуса кажет ниже чем BMP, оба вынесены просто на воздух и лежат рядом

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Если влажность не выводится то Adafruit_BME280::SAMPLING_NONE,    /* humidity */

ShAlex13
Offline
Зарегистрирован: 19.01.2018

ShAlex13 пишет:

Правда разница у рядом лежащего DS18B20 от другого девайса, 2 градуса.  DS-ка на 2 градуса кажет ниже чем BMP, оба вынесены просто на воздух и лежат рядом

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

xplp
Offline
Зарегистрирован: 21.12.2012

Ну отображение влажности можно добавить, чтобы не пропадали показания за зря. Может версия BME280 на 3.3 вольта, вот он сам себя и греет, на али смотрел там на 5 и на 3.3 есть версии.

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

Ну отображение влажности можно добавить, чтобы не пропадали показания за зря. 

Вот они то мне больше и нужны в детской комнате, давление вроде пока и не нужно.

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

Может версия BME280 на 3.3 вольта, вот он сам себя и греет, на али смотрел там на 5 и на 3.3 есть версии.

У меня 5 вольтовая

xplp
Offline
Зарегистрирован: 21.12.2012

Вот добавил влажность.

/* ИВ-18
 1 – Катод, проводящий слой внутренней поверхности баллона;
 2 – dp1...dp8 – аноды-сегменты с 1го по 8й разряд;
 3 – d1...d8 – аноды-сегменты с 1го по 8й разряд;
 4 – c1...c8 – аноды-сегменты с 1го по 8й разряд;
 5 – e1...e8 – аноды-сегменты с 1го по 8й разряд;
 6 – (свободный);
 7 – (свободный);
 8 – (свободный);
 9 – g1...g8 – аноды-сегменты с 1го по 8й разряд;
10 – b1...b8 – аноды-сегменты с 1го по 8й разряд;
11 – f1...f8 – аноды-сегменты с 1го по 8й разряд;
12 – a1...a8 – аноды-сегменты с 1го по 8й разряд;
13 – Катод;
14 – Сетка 9го разряда;
15 – Сетка 1го разряда;
16 – Сетка 3го разряда;
17 – Сетка 5го разряда;
18 – Сетка 8го разряда;
19 – Сетка 7го разряда;
20 – Сетка 6го разряда;
21 – Сетка 4го разряда;
22 – Сетка 2го разряда.
// ABCDEFG
 */
#define bt0 A0
#define bt1 A1
#define bt2 A2
#define BME_280 1 //используем датчик BME280 температуры и давления или нет
#include <EEPROM.h>

#include <Wire.h>
#if (BME_280 == 1)
#include <Adafruit_BME280.h>
#endif
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231); 
#if (BME_280 == 1)
Adafruit_BME280 bme; // Подключение датчика по шине I2C
#endif
byte digitEf[] = {B01111111,
                  B00111111,
                  B00111101,
                  B00011101,
                  B00011100,
                  B00011000,
                  B00001000,
                  B00000000};//для эффекта смены цифр
//byte segment[]={SEG1,SEG2,SEG3,SEG4};  // куда подключены сетки индикатора
byte digit[] = {0,0,0,0,0,0,0,0};  // содержимое для отображения на сегментах
byte digit_old[] = {0,0,0,0,0,0,0,0};  //старое содержимое сегментов для эффектов смены цифр
byte digit_i[] = {0,0,0,0,0,0,0,0};  // счётчики для эффектов на сегментах
unsigned long digit_mill[] = {0,0,0,0,0,0,0,0}; // для функции эффекта смены цифры
bool dot[] = {0,0,0,0,0,0,0,0}; // где рисовать точку
byte _tmscr=0;
byte _tm=0;
byte tmpchar=0;
byte _size=0;
bool scroll=1;
byte valSc = 127;
//byte valSo = 192;
bool getTP=0; 
byte mod = 1;
byte timeCR = 30;
bool _tCR=1;
bool _dot = 0;
float temperature = 0;
#define BRIGHTNESS 16
volatile byte indiDimm[8]= {BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS};// величина диммирования (0-16)
volatile byte indiCounter[8];     // счётчик каждого индикатора (0-16)
volatile byte indiDigits[8];      // цифры, которые должны показать индикаторы (0-10)
volatile byte curIndi;            // текущий индикатор (0-7)

unsigned long mill=0;
unsigned long mill0=0;
unsigned long millB=0;
int _gTP = 0;
String tmpTP; 

byte num[]={
  // ABCDEFG
   B01111110,//0
   B00110000,//1
   B01101101,//2
   B01111001,//3
   B00110011,//4
   B01011011,//5
   B01011111,//6
   B01110000,//7
   B01111111,//8
   B01111011,//9
   B00000001,//9
  };
 byte efnt[]={
  0b01110111, //A
  0b00011111, //b
  0b01001110, //C
  0b00111101, //d 
  0b01001111, //E
  0b01000111, //F
  0b01011110, //G
  0b00010111, //h
  0b00110000, //I 
  0b00111000, //J
  0b01010111, //k
  0b00001110, //L
  0b01010101, //m
  0b00010101, //n
  0b00011101, //o
  0b01100111, //P 
  0b01110011, //q
  0b00000101, //r
  0b01011011, //S
  0b00001111, //t
  0b00011100, //u
  0b00111110, //V
  0b00111111, //w
  0b00110111, //X
  0b00111011, //y
  0b01101101, //Z
  0b00000001, //-
  0b01000000, //=
  0b00001000, //_(*)
  0b01100011, //^
//  0b10000000, //.
  };   

void setup() {
  for(byte i=0; i<12; i++)
  pinMode(i, OUTPUT);
  pinMode(bt0, INPUT_PULLUP);
  pinMode(bt1, INPUT_PULLUP);
  pinMode(bt2, INPUT_PULLUP);
  if(EEPROM.read(1)>5){
        EEPROM.write(0, timeCR);
        EEPROM.write(1, mod);
  }else{
  timeCR = EEPROM.read(0);
  mod = EEPROM.read(1);
  }
  // перенастраиваем частоту ШИМ на пинах 3 и 11 на 7.8 кГц и разрешаем прерывания COMPA
  TCCR2B = (TCCR2B & B11111000) | 2;    // делитель 8
  TCCR2A |= (1 << WGM21);   // включить CTC режим для COMPA
  TIMSK2 |= (1 << OCIE2A);  // включить прерывания по совпадению COMPA
   
  delay(100);
   //time.begin();
   time.period(1000);
   delay(100);
#if (BME_280 == 1)
   bme.begin(); 
    bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );
#endif                  
   //time.gettime();
}

ISR(TIMER2_COMPA_vect) {
  indiCounter[curIndi]++;             // счётчик индикатора
  if (indiCounter[curIndi] >= indiDimm[curIndi]){  // если достигли порога диммирования       
    PORTD  = B00000000; // выключить сегменты 
  }
  if (indiCounter[curIndi] > 16) {    // достигли порога в X единиц
    indiCounter[curIndi] = 0;         // сброс счетчика лампы
    if (++curIndi >= 8) curIndi = 0;  // смена лампы закольцованная

    if (indiDimm[curIndi] > 0) {
  
        PORTD = digit[curIndi]+(dot[curIndi]<<7);//B10000000; 
        PORTB = curIndi; // включить сетку на текущую лампу       
    }
  }

}
void _timeCR(){// функция для коррекции времени, увеличивает или уменьшает на заданное количество секунд раз в сутки
  
if(time.Hours == 3 && time.minutes == 15 && time.seconds == 30 && _tCR==1){
   _tCR=0;
   if(timeCR <31){
   time.settime(time.seconds-(30-timeCR), time.minutes, time.Hours);
   }else{
    time.settime(time.seconds+(timeCR-30), time.minutes, time.Hours);
    }
}else if(time.Hours == 3 && time.minutes == 16 && _tCR==0){
  _tCR=1;
}
}
void sendByte(byte _A, byte _S){
    digit[7-_S]=_A;
}
 
void sendStr6(String _st){// вывод строки
  for(byte i =0; i<8; i++){
    if(_st[i]>47 && _st[i]<58){
    sendByte((num[_st[i]-48]),i);
    }else if(_st[i]>64 && _st[i<91]){
      sendByte((efnt[_st[i]-65]),i);
      }else if(_st[i]==45){
        sendByte(efnt[26],i);
        }else if(_st[i]==61){
          sendByte(efnt[27],i);
          }else if(_st[i]==42){
            sendByte(efnt[28],i);
            }else if(_st[i]==95){
              sendByte(efnt[29],i);
            }else{sendByte(B0,i);
        }
    }
  }
void sndStr(String _lst){// бегущая строка
  _size=_lst.length();
  if(_size>8 && scroll==1){
  _lst="     "+_lst;
  if(millis()- mill > valSc+20){
  _tmscr++;mill=millis();
  }
  sendStr6( (String)_lst[_tmscr]+
            (String)_lst[_tmscr+1]+
            (String)_lst[_tmscr+2]+
            (String)_lst[_tmscr+3]+
            (String)_lst[_tmscr+4]+
            (String)_lst[_tmscr+5]+
            (String)_lst[_tmscr+6]+
            (String)_lst[_tmscr+7]
            );
            if(_tmscr>_size+8){
              scroll=0;_tmscr=0;
              }//mill0=millis();
  }else{
    sendStr6(_lst);
    }
  }  
void dotSet(byte _d){// рисуем точки в заданной позиции
  if(millis()-millB < 1000&& mod<9){
    for(byte i=0; i<8; i++){
        if(i==8-mod){
        dot[i]=1;
        }else{
        dot[i]=0; 
        }
     }
  }else{
  for(byte i=0; i<8; i++){dot[i]=bitRead(_d, i);} 
}
}
void dSP(byte _a, byte _n){//функция для плавной смены цифры с эффектами(6 эффектов)
  //delay(2);
 if(millis()-digit_mill[_a]>20){
 if(mod<10){
    if(_n!=digit_old[_a]){
      digit_i[_a] = random(6)<<5;
    }  
  if((_n!=digit_old[_a]||digit_i[_a]>0)){
  digit_old[_a]=_n;    
  switch((digit_i[_a]>>5)){   
  case 0:
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=(digit[_a]>>1)&(~(1));//0b1111111111111110;
      indiDimm[_a]--;
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=(_n>>(15-(digit_i[_a]&B00011111)))&(~(1));
      indiDimm[_a]++;
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;  
    
    case 1:
    if((digit_i[_a]&B00011111)<BRIGHTNESS){
      //digit[_a]=digit[_a]>>1;
      indiDimm[_a]--;
      digit_i[_a]++;      
    }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2){
      digit[_a]=_n;
      indiDimm[_a]++;
      //delay(1);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)!=0){
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;
    
    case 2:
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(~digitEf[(digit_i[_a]&B00011111)-8]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;
   
   case 3: 
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(digitEf[(digit_i[_a]&B00011111)]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;

   case 4: 
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;

   case 5:
    if((digit_i[_a]&B00011111)<BRIGHTNESS){
      //digit[_a]=digit[_a]>>1;
      indiDimm[_a]--;
      digit_i[_a]++;      
    }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2+1){
      digit[_a]=_n;//>>(15-digit_i[_a]);
      indiDimm[_a]++;
      //delay(1);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)!=0){
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;
    
    default:
      digit[_a]=_n;
      indiDimm[_a]=BRIGHTNESS;
    }
        }else{
        indiDimm[_a]=BRIGHTNESS;
        digit[_a]=_n;
        }
  }else if(mod>10){
    digit[_a]=_n;
    indiDimm[_a]=BRIGHTNESS;
  }
  digit_mill[_a]=millis();}
}
void digitTD(byte _c, byte _d, byte _y, byte _b){// рисуем 8м цифр
  digit[7] = num[_c/10];
  digit[6] = num[_c%10];
  digit[5] = num[_d/10];
  digit[4] = num[_d%10];
  digit[3] = num[_y/10];
  digit[2] = num[_y%10];
  digit[1] = num[_b/10];
  digit[0] = num[_b%10];  
}
void digitTD3(byte _a, byte _b, byte _c){// рисуем 6м цифр веремени + разделительные секунды
  dSP(7,num[_a/10]);
  dSP(6,num[_a%10]); 
  dSP(4,num[_b/10]);
  dSP(3,num[_b%10]); 
  dSP(1,num[_c/10]);
  dSP(0,num[_c%10]);
  if(millis()/1000%10<5){
  digit[5] = 0b01000000>>(millis()/1000%6);
  digit[2] = 0b01000000>>(millis()/100%6);
  }else{
  digit[5] = 0b00000001<<(millis()/1000%3*3);
  digit[2] = 0b00000001<<((millis()-500)/1000%3*3);
  }
}
void clr(){ // очистка буфера, установка яркости по умолчанию
  if(getTP==0){  
  for(byte i=0; i<8; i++){
    //digit[i]=0;
    digit_old[i]=0;
    indiDimm[i]=BRIGHTNESS;  
  }getTP=1;
}
}
void keyR(){//чтение кнопок +/-
  if(digitalRead(bt0)==LOW && millis()-millB>300){mod++;scroll=1;_tmscr=0;millB=millis();}
  if(digitalRead(bt2)==LOW && millis()-millB>300){mod--;scroll=1;_tmscr=0;millB=millis();} 
}
int _keyH(int i){
  if(millis() - millB > 200){    //читаем кнопку +
  if(digitalRead(bt0)==LOW){ 
      millB = millis();
           i++;
      }
   }
   return i;
}

int _keyL(int i){
  if(millis() - millB > 200){    //читаем кнопку -
  if(digitalRead(bt2)==LOW){ 
      millB = millis();
           i--;
      }
  }
   return i;
}
int _sm(int i, int a){  //значение в диапазоне 0-a
      if(i>=a){
        i-=a;
      }else if(i<0){
        i+=a;
      }
   return i; 
} 
bool _keyS(){//чтение кнопки ОК
  if(millis() - millB > 300){ 
    if(digitalRead(bt1)==LOW){
      scroll=1;_tmscr=0;millB=millis();
      return true; 
    }else{return false;}
  }else{return false;}

}
void loop() {
//digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
  ///*
_timeCR();  
  switch(mod){
    case 0:
    #if (BME_280 == 1)
    mod = 4;
    #else 
    mod = 2;
    #endif
    break;
    case 1:
    keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
    if(millis() - millB < 500){   
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
            dotSet(B10000000>>(millis()/80%8));
        }       
        digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
      }else if(millis()-millB <25000){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      }else{
        getTP=0;
        clr();
        millB = millis()-1000;     
      }
    break;
    case 2:
    keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
  if(millis() - millB < 300){
    digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
    clr();
    }else if(millis() - millB < 1000){
    sndStr("  TIME");
    dotSet(B00000000);
    }else if(millis() - millB < 4500){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      scroll=1;
    }else if(millis() - millB < 5500){
     sndStr("  DATA");
     getTP=0;
     dotSet(B00000000);
    }else if(millis() - millB < 8500){
      clr();
      digitTD(time.day,time.month,20,time.year);
      dotSet(B01010000<<(millis()/500%2*4));
      scroll=1;
    }else{
      millB = millis()-300; 
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
          dotSet(B10000000>>(millis()/80%8));
        }
        for(byte i=0; i<8; i++){
          digit_old[i]=B0;
        }
      digitTD(millis()/30%100,millis()/70%60,millis()/60%70,millis()/80%100);
    }
    break;
    #if (BME_280 == 1)
    case 3:
    keyR();
    //if(_keyS()==true){mod=10;}
    time.gettime();
    if(millis() - millB < 300){
    digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
    clr();
    }else if(millis() - millB < 1000){
     sndStr("TEMPERATURA");
     dotSet(B00000000);
     if(!getTP){
      getTP=1;
      temperature = bme.readTemperature();//lm75a_sensor.getTemperatureInDegrees();
      //sprintf(tmpTP, "%03d", ((int)(temperature*10)));
      _gTP= ((int)(temperature*10));
      }
            if(_gTP>99){
        tmpTP="  "+(String)(_gTP)+"^C";
      }else if(_gTP>=10){
        tmpTP="   "+(String)((_gTP))+"^C";
      }else if(_gTP>=0){
        tmpTP="   0"+(String)((_gTP))+"^C";
      }else if(_gTP<=(-1)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else if(_gTP>(-99)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else {
        tmpTP=" "+(String)((_gTP))+"^C";
      }
    }else if(millis() - millB < 3500){
      _tmscr=0;
      scroll=1;
      getTP=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
    }else if(millis() - millB < 4500){
     sndStr("DAVLENIE MM*HG");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readPressure()/133.3+7;
      }
      tmpTP=(String)((int)(_gTP))+" MMHG";
    }else if(millis() - millB < 8500){
      _tmscr=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
      getTP=0;
    }else if(millis() - millB < 10000){
     sndStr("VLAZHNOST H  ");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readHumidity();
      }
      tmpTP="  H- "+(String)((int)(_gTP));
    }else if(millis() - millB < 12500){
      _tmscr=0;
      sendStr6(tmpTP);
      getTP=0; 
    }else{
      digitTD(millis()/16%100,millis()/8%100,millis()/16%100,millis()/8%100);
      dotSet(B10000000>>(millis()/50%8));
      scroll=1;
      getTP=0;
      millB = millis()-300; 
         for(byte i=0; i<16; i++){
          digit_old[i]=0;
        } 
    }

    break;
  
    case 4:
      keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
  if(millis() - millB < 300){
    digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
    clr();
    }else if(millis() - millB < 1000){
    sndStr("  TIME");
    dotSet(B00000000);
    }else if(millis() - millB < 4500){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      scroll=1;
    }else if(millis() - millB < 5500){
     sndStr("  DATA");
     dotSet(B00000000);
     getTP=0;
    }else if(millis() - millB < 8500){
      clr();
      digitTD(time.day,time.month,20,time.year);
      dotSet(B01010000<<(millis()/500%2*4));
      scroll=1;
    }else if(millis() - millB < 12500){
     sndStr("TEMPERATURA");
     dotSet(B00000000);
     if(!getTP){
      getTP=1;
      temperature = bme.readTemperature();//lm75a_sensor.getTemperatureInDegrees();
      //sprintf(tmpTP, "%03d", ((int)(temperature*10)));
      _gTP= ((int)(temperature*10));
      }
            if(_gTP>99){
        tmpTP="  "+(String)(_gTP)+"^C";
      }else if(_gTP>=10){
        tmpTP="   "+(String)((_gTP))+"^C";
      }else if(_gTP>=0){
        tmpTP="   0"+(String)((_gTP))+"^C";
      }else if(_gTP<=(-1)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else if(_gTP>(-99)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else {
        tmpTP=" "+(String)((_gTP))+"^C";
      }
    }else if(millis() - millB < 13500){
      _tmscr=0;
      scroll=1;
      getTP=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
    }else if(millis() - millB < 16500){
     sndStr("DAVLENIE MM*HG");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readPressure()/133.3+7;
      }
      tmpTP=(String)((int)(_gTP))+" MMHG";
    }else if(millis() - millB < 18500){
      _tmscr=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
      getTP=0;
    }else if(millis() - millB < 20500){
     sndStr("VLAZHNOST H- ");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readHumidity();
      }
      tmpTP="  H- "+(String)((int)(_gTP));
    }else if(millis() - millB < 23500){
      _tmscr=0;
      sendStr6(tmpTP);
      getTP=0;  
    }else{
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
          dotSet(B10000000>>(millis()/80%8));
        }
        for(byte i=0; i<8; i++){
          digit_old[i]=B0;
        }
      digitTD(millis()/30%100,millis()/70%60,millis()/60%70,millis()/80%100);
      millB = millis()-300; 
    }
    break;
    #endif
    case 9:
    mod= 14;
    break;
    case 10:
    sndStr("TIME SETUP");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=20;}    
    break;
    case 11:
    sndStr("DATA SETUP");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=30;} 
    break;
    case 12:
    sndStr("CORRECT TIME");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=40;} 
    break;
    case 13:
    sndStr("MODE START");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){_tm=EEPROM.read(1)-1;mod=50;} 
    break;
    case 14:
    sndStr("  EXIT");
    keyR();
    if(_keyS()==true){mod=1;} 
    dotSet(B00000000);
    break;
    case 15:
    mod = 10;
    break;
    
    case 20:
            if(millis()/50%10<5){
              digit[7] = B00000000;
              digit[6] = B00000000;
            dotSet(B11000000); 
            }else{
              digitTD3(time.Hours,time.minutes,time.seconds);
              dotSet(B00000000); }
            time.Hours=_sm(_keyH(int(time.Hours)),24);
            time.Hours=_sm(_keyL(int(time.Hours)),24);
            if(_keyS()==true){mod++;}
      break;
      case 21:
            if(millis()/50%10<5){
              digit[3] = B00000000;
              digit[4] = B00000000;
            dotSet(B00011000); 
            }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds);}
            time.minutes=_sm(_keyH(int(time.minutes)),60);
            time.minutes=_sm(_keyL(int(time.minutes)),60);
            if(_keyS()==true){mod++;}
      break;
      case 22:
            if(millis()/50%10<5){
              digit[0] = B00000000;
              digit[1] = B00000000;
            dotSet(B00000011); 
            }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds);}
            time.seconds=_sm(_keyH(int(time.seconds)),60);
            time.seconds=_sm(_keyL(int(time.seconds)),60);
            if(_keyS()==true){mod++;}
      break;
      case 23:
          time.settime(time.seconds, time.minutes, time.Hours);
          mod=10;
      break;
      
      case 30:
            if(millis()/50%10<5){
              digit[7] = B00000000;
              digit[6] = B00000000;
            dotSet(B11000000); 
            }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year);}
            time.day=_sm(_keyH(int(time.day)),32);
            time.day=_sm(_keyL(int(time.day)),32);
            if(_keyS()==true){mod++;}
      break;
      case 31:
            //digitTD(time.day,time.month);
            if(millis()/50%10<5){
              digit[5] = B00000000;
              digit[4] = B00000000;
            dotSet(B00110000); 
            }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year);}
            time.month=_sm(_keyH(int(time.month)),13);
            time.month=_sm(_keyL(int(time.month)),13);
            if(_keyS()==true){mod++;}
      break;
      case 32:
            if(millis()/50%10<5){
              digit[1] = B00000000;
              digit[0] = B00000000;
            dotSet(B00001111); 
            }else{dotSet(B00000000); digitTD(time.day,time.month,20,time.year);}

            time.year=_sm(_keyH(int(time.year)),100);
            time.year=_sm(_keyL(int(time.year)),100);
            if(_keyS()==true){mod++;}

      break;
      case 33:
          time.settime(0, -1, -1, time.day, time.month, time.year);
          mod=11;
      break;
      
      case 40:
           
            if(timeCR<30){
              sendStr6("COR*T-"+(String)(30-timeCR));
            }else{
              sendStr6("COR*T "+(String)(timeCR-30));
            }
            dotSet(B0000); 
            timeCR=_sm(_keyH(int(timeCR)),59);
            timeCR=_sm(_keyL(int(timeCR)),59);
            if(_keyS()==true){mod++;}

      break;
      case 41:
          EEPROM.write(0, timeCR);
          mod=12;
      break;

      case 50:
            sendStr6("MODE * "+(String)(_tm+1));
            dotSet(B10000000>>_tm); 
            #if (BME_280 == 1)
            _tm=_sm(_keyH(int(_tm)),4);
            _tm=_sm(_keyL(int(_tm)),4);
            #else
            _tm=_sm(_keyH(int(_tm)),2);
            _tm=_sm(_keyL(int(_tm)),2);
            #endif
            if(_keyS()==true){mod++;}

      break;
      case 51:
          EEPROM.write(1, (_tm+1));
          _tm=0;
          mod=13;
      break;
      
    default:
    mod = 1;
  }//*/
}

 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Температуру не правильно кажет, 3.6 С градуса всего

xplp
Offline
Зарегистрирован: 21.12.2012

А до этого правильно показывал? Потому что с температурой я ничего не делал.

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

А до этого правильно показывал? Потому что с температурой я ничего не делал.

Правильно показывало

xplp
Offline
Зарегистрирован: 21.12.2012

А на самом деле какая температура? если нагревать или остужать пропорционально показывает?

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

А на самом деле какая температура? если нагревать или остужать пропорционально показывает?

Сейчас залил "старую" прошивку, кажет 27.0 С градусов, ну и давление 751

xplp
Offline
Зарегистрирован: 21.12.2012

Я кажется понял в чём дело, такой код должен по идее это исправить:

/* ИВ-18
 1 – Катод, проводящий слой внутренней поверхности баллона;
 2 – dp1...dp8 – аноды-сегменты с 1го по 8й разряд;
 3 – d1...d8 – аноды-сегменты с 1го по 8й разряд;
 4 – c1...c8 – аноды-сегменты с 1го по 8й разряд;
 5 – e1...e8 – аноды-сегменты с 1го по 8й разряд;
 6 – (свободный);
 7 – (свободный);
 8 – (свободный);
 9 – g1...g8 – аноды-сегменты с 1го по 8й разряд;
10 – b1...b8 – аноды-сегменты с 1го по 8й разряд;
11 – f1...f8 – аноды-сегменты с 1го по 8й разряд;
12 – a1...a8 – аноды-сегменты с 1го по 8й разряд;
13 – Катод;
14 – Сетка 9го разряда;
15 – Сетка 1го разряда;
16 – Сетка 3го разряда;
17 – Сетка 5го разряда;
18 – Сетка 8го разряда;
19 – Сетка 7го разряда;
20 – Сетка 6го разряда;
21 – Сетка 4го разряда;
22 – Сетка 2го разряда.
// ABCDEFG
 */
#define bt0 A0
#define bt1 A1
#define bt2 A2
#define BME_280 1 //используем датчик BME280 температуры и давления или нет
#include <EEPROM.h>

#include <Wire.h>
#if (BME_280 == 1)
#include <Adafruit_BME280.h>
#endif
#include <iarduino_RTC.h>
iarduino_RTC time(RTC_DS3231); 
#if (BME_280 == 1)
Adafruit_BME280 bme; // Подключение датчика по шине I2C
#endif
byte digitEf[] = {B01111111,
                  B00111111,
                  B00111101,
                  B00011101,
                  B00011100,
                  B00011000,
                  B00001000,
                  B00000000};//для эффекта смены цифр
//byte segment[]={SEG1,SEG2,SEG3,SEG4};  // куда подключены сетки индикатора
byte digit[] = {0,0,0,0,0,0,0,0};  // содержимое для отображения на сегментах
byte digit_old[] = {0,0,0,0,0,0,0,0};  //старое содержимое сегментов для эффектов смены цифр
byte digit_i[] = {0,0,0,0,0,0,0,0};  // счётчики для эффектов на сегментах
unsigned long digit_mill[] = {0,0,0,0,0,0,0,0}; // для функции эффекта смены цифры
bool dot[] = {0,0,0,0,0,0,0,0}; // где рисовать точку
byte _tmscr=0;
byte _tm=0;
byte tmpchar=0;
byte _size=0;
bool scroll=1;
byte valSc = 127;
//byte valSo = 192;
bool getTP=0; 
byte mod = 1;
byte timeCR = 30;
bool _tCR=1;
bool _dot = 0;
float temperature = 0;
#define BRIGHTNESS 16
volatile byte indiDimm[8]= {BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS,BRIGHTNESS};// величина диммирования (0-16)
volatile byte indiCounter[8];     // счётчик каждого индикатора (0-16)
volatile byte indiDigits[8];      // цифры, которые должны показать индикаторы (0-10)
volatile byte curIndi;            // текущий индикатор (0-7)

unsigned long mill=0;
unsigned long mill0=0;
unsigned long millB=0;
int _gTP = 0;
String tmpTP; 

byte num[]={
  // ABCDEFG
   B01111110,//0
   B00110000,//1
   B01101101,//2
   B01111001,//3
   B00110011,//4
   B01011011,//5
   B01011111,//6
   B01110000,//7
   B01111111,//8
   B01111011,//9
   B00000001,//9
  };
 byte efnt[]={
  0b01110111, //A
  0b00011111, //b
  0b01001110, //C
  0b00111101, //d 
  0b01001111, //E
  0b01000111, //F
  0b01011110, //G
  0b00010111, //h
  0b00110000, //I 
  0b00111000, //J
  0b01010111, //k
  0b00001110, //L
  0b01010101, //m
  0b00010101, //n
  0b00011101, //o
  0b01100111, //P 
  0b01110011, //q
  0b00000101, //r
  0b01011011, //S
  0b00001111, //t
  0b00011100, //u
  0b00111110, //V
  0b00111111, //w
  0b00110111, //X
  0b00111011, //y
  0b01101101, //Z
  0b00000001, //-
  0b01000000, //=
  0b00001000, //_(*)
  0b01100011, //^
//  0b10000000, //.
  };   

void setup() {
  for(byte i=0; i<12; i++)
  pinMode(i, OUTPUT);
  pinMode(bt0, INPUT_PULLUP);
  pinMode(bt1, INPUT_PULLUP);
  pinMode(bt2, INPUT_PULLUP);
  if(EEPROM.read(1)>5){
        EEPROM.write(0, timeCR);
        EEPROM.write(1, mod);
  }else{
  timeCR = EEPROM.read(0);
  mod = EEPROM.read(1);
  }
  // перенастраиваем частоту ШИМ на пинах 3 и 11 на 7.8 кГц и разрешаем прерывания COMPA
  TCCR2B = (TCCR2B & B11111000) | 2;    // делитель 8
  TCCR2A |= (1 << WGM21);   // включить CTC режим для COMPA
  TIMSK2 |= (1 << OCIE2A);  // включить прерывания по совпадению COMPA
   
  delay(100);
   //time.begin();
   time.period(1000);
   delay(100);
#if (BME_280 == 1)
   bme.begin(); 
    bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );
#endif                  
   //time.gettime();
}

ISR(TIMER2_COMPA_vect) {
  indiCounter[curIndi]++;             // счётчик индикатора
  if (indiCounter[curIndi] >= indiDimm[curIndi]){  // если достигли порога диммирования       
    PORTD  = B00000000; // выключить сегменты 
  }
  if (indiCounter[curIndi] > 16) {    // достигли порога в X единиц
    indiCounter[curIndi] = 0;         // сброс счетчика лампы
    if (++curIndi >= 8) curIndi = 0;  // смена лампы закольцованная

    if (indiDimm[curIndi] > 0) {
  
        PORTD = digit[curIndi]+(dot[curIndi]<<7);//B10000000; 
        PORTB = curIndi; // включить сетку на текущую лампу       
    }
  }

}
void _timeCR(){// функция для коррекции времени, увеличивает или уменьшает на заданное количество секунд раз в сутки
  
if(time.Hours == 3 && time.minutes == 15 && time.seconds == 30 && _tCR==1){
   _tCR=0;
   if(timeCR <31){
   time.settime(time.seconds-(30-timeCR), time.minutes, time.Hours);
   }else{
    time.settime(time.seconds+(timeCR-30), time.minutes, time.Hours);
    }
}else if(time.Hours == 3 && time.minutes == 16 && _tCR==0){
  _tCR=1;
}
}
void sendByte(byte _A, byte _S){
    digit[7-_S]=_A;
}
 
void sendStr6(String _st){// вывод строки
  for(byte i =0; i<8; i++){
    if(_st[i]>47 && _st[i]<58){
    sendByte((num[_st[i]-48]),i);
    }else if(_st[i]>64 && _st[i<91]){
      sendByte((efnt[_st[i]-65]),i);
      }else if(_st[i]==45){
        sendByte(efnt[26],i);
        }else if(_st[i]==61){
          sendByte(efnt[27],i);
          }else if(_st[i]==42){
            sendByte(efnt[28],i);
            }else if(_st[i]==95){
              sendByte(efnt[29],i);
            }else{sendByte(B0,i);
        }
    }
  }
void sndStr(String _lst){// бегущая строка
  _size=_lst.length();
  if(_size>8 && scroll==1){
  _lst="     "+_lst;
  if(millis()- mill > valSc+20){
  _tmscr++;mill=millis();
  }
  sendStr6( (String)_lst[_tmscr]+
            (String)_lst[_tmscr+1]+
            (String)_lst[_tmscr+2]+
            (String)_lst[_tmscr+3]+
            (String)_lst[_tmscr+4]+
            (String)_lst[_tmscr+5]+
            (String)_lst[_tmscr+6]+
            (String)_lst[_tmscr+7]
            );
            if(_tmscr>_size+8){
              scroll=0;_tmscr=0;
              }//mill0=millis();
  }else{
    sendStr6(_lst);
    }
  }  
void dotSet(byte _d){// рисуем точки в заданной позиции
  if(millis()-millB < 1000&& mod<9){
    for(byte i=0; i<8; i++){
        if(i==8-mod){
        dot[i]=1;
        }else{
        dot[i]=0; 
        }
     }
  }else{
  for(byte i=0; i<8; i++){dot[i]=bitRead(_d, i);} 
}
}
void dSP(byte _a, byte _n){//функция для плавной смены цифры с эффектами(6 эффектов)
  //delay(2);
 if(millis()-digit_mill[_a]>20){
 if(mod<10){
    if(_n!=digit_old[_a]){
      digit_i[_a] = random(6)<<5;
    }  
  if((_n!=digit_old[_a]||digit_i[_a]>0)){
  digit_old[_a]=_n;    
  switch((digit_i[_a]>>5)){   
  case 0:
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=(digit[_a]>>1)&(~(1));//0b1111111111111110;
      indiDimm[_a]--;
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=(_n>>(15-(digit_i[_a]&B00011111)))&(~(1));
      indiDimm[_a]++;
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;  
    
    case 1:
    if((digit_i[_a]&B00011111)<BRIGHTNESS){
      //digit[_a]=digit[_a]>>1;
      indiDimm[_a]--;
      digit_i[_a]++;      
    }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2){
      digit[_a]=_n;
      indiDimm[_a]++;
      //delay(1);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)!=0){
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;
    
    case 2:
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(~digitEf[(digit_i[_a]&B00011111)-8]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;
   
   case 3: 
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(digitEf[(digit_i[_a]&B00011111)]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;

   case 4: 
    if((digit_i[_a]&B00011111)<8){
      digit[_a]=digit[_a]&(~digitEf[(7-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)<16){
      digit[_a]=_n&(digitEf[(15-(digit_i[_a]&B00011111))]);
      digit_i[_a]++;
    }else{
      digit_i[_a]=0;
      digit[_a]=_n;
      }
   break;

   case 5:
    if((digit_i[_a]&B00011111)<BRIGHTNESS){
      //digit[_a]=digit[_a]>>1;
      indiDimm[_a]--;
      digit_i[_a]++;      
    }else if((digit_i[_a]&B00011111)<BRIGHTNESS*2+1){
      digit[_a]=_n;//>>(15-digit_i[_a]);
      indiDimm[_a]++;
      //delay(1);
      digit_i[_a]++;
    }else if((digit_i[_a]&B00011111)!=0){
      digit_i[_a]=0;
      digit[_a]=_n;
      }
    break;
    
    default:
      digit[_a]=_n;
      indiDimm[_a]=BRIGHTNESS;
    }
        }else{
        indiDimm[_a]=BRIGHTNESS;
        digit[_a]=_n;
        }
  }else if(mod>10){
    digit[_a]=_n;
    indiDimm[_a]=BRIGHTNESS;
  }
  digit_mill[_a]=millis();}
}
void digitTD(byte _c, byte _d, byte _y, byte _b){// рисуем 8м цифр
  digit[7] = num[_c/10];
  digit[6] = num[_c%10];
  digit[5] = num[_d/10];
  digit[4] = num[_d%10];
  digit[3] = num[_y/10];
  digit[2] = num[_y%10];
  digit[1] = num[_b/10];
  digit[0] = num[_b%10];  
}
void digitTD3(byte _a, byte _b, byte _c){// рисуем 6м цифр веремени + разделительные секунды
  dSP(7,num[_a/10]);
  dSP(6,num[_a%10]); 
  dSP(4,num[_b/10]);
  dSP(3,num[_b%10]); 
  dSP(1,num[_c/10]);
  dSP(0,num[_c%10]);
  if(millis()/1000%10<5){
  digit[5] = 0b01000000>>(millis()/1000%6);
  digit[2] = 0b01000000>>(millis()/100%6);
  }else{
  digit[5] = 0b00000001<<(millis()/1000%3*3);
  digit[2] = 0b00000001<<((millis()-500)/1000%3*3);
  }
}
void clr(){ // очистка буфера, установка яркости по умолчанию
  if(getTP==0){  
  for(byte i=0; i<8; i++){
    //digit[i]=0;
    digit_old[i]=0;
    indiDimm[i]=BRIGHTNESS;  
  }getTP=1;
}
}
void keyR(){//чтение кнопок +/-
  if(digitalRead(bt0)==LOW && millis()-millB>300){mod++;scroll=1;_tmscr=0;millB=millis();}
  if(digitalRead(bt2)==LOW && millis()-millB>300){mod--;scroll=1;_tmscr=0;millB=millis();} 
}
int _keyH(int i){
  if(millis() - millB > 200){    //читаем кнопку +
  if(digitalRead(bt0)==LOW){ 
      millB = millis();
           i++;
      }
   }
   return i;
}

int _keyL(int i){
  if(millis() - millB > 200){    //читаем кнопку -
  if(digitalRead(bt2)==LOW){ 
      millB = millis();
           i--;
      }
  }
   return i;
}
int _sm(int i, int a){  //значение в диапазоне 0-a
      if(i>=a){
        i-=a;
      }else if(i<0){
        i+=a;
      }
   return i; 
} 
bool _keyS(){//чтение кнопки ОК
  if(millis() - millB > 300){ 
    if(digitalRead(bt1)==LOW){
      scroll=1;_tmscr=0;millB=millis();
      return true; 
    }else{return false;}
  }else{return false;}

}
void loop() {
//digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
  ///*
_timeCR();  
  switch(mod){
    case 0:
    #if (BME_280 == 1)
    mod = 4;
    #else 
    mod = 2;
    #endif
    break;
    case 1:
    keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
    if(millis() - millB < 500){   
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
            dotSet(B10000000>>(millis()/80%8));
        }       
        digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
      }else if(millis()-millB <25000){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      }else{
        getTP=0;
        clr();
        millB = millis()-1000;     
      }
    break;
    case 2:
    keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
  if(millis() - millB < 300){
    digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
    clr();
    }else if(millis() - millB < 1000){
    sndStr("  TIME");
    dotSet(B00000000);
    }else if(millis() - millB < 4500){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      scroll=1;
    }else if(millis() - millB < 5500){
     sndStr("  DATA");
     getTP=0;
     dotSet(B00000000);
    }else if(millis() - millB < 8500){
      clr();
      digitTD(time.day,time.month,20,time.year);
      dotSet(B01010000<<(millis()/500%2*4));
      scroll=1;
    }else{
      millB = millis()-300; 
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
          dotSet(B10000000>>(millis()/80%8));
        }
        for(byte i=0; i<8; i++){
          digit_old[i]=B0;
        }
      digitTD(millis()/30%100,millis()/70%60,millis()/60%70,millis()/80%100);
    }
    break;
    #if (BME_280 == 1)
    case 3:
    keyR();
    //if(_keyS()==true){mod=10;}
    time.gettime();
    if(millis() - millB < 300){
    digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
    clr();
    }else if(millis() - millB < 1000){
     sndStr("TEMPERATURA");
     dotSet(B00000000);
     getTP=0;
    }else if(millis() - millB < 1200){

     if(!getTP){
      getTP=1;
      temperature = bme.readTemperature();//lm75a_sensor.getTemperatureInDegrees();
      //sprintf(tmpTP, "%03d", ((int)(temperature*10)));
      _gTP= ((int)(temperature*10));
      }
            if(_gTP>99){
        tmpTP="  "+(String)(_gTP)+"^C";
      }else if(_gTP>=10){
        tmpTP="   "+(String)((_gTP))+"^C";
      }else if(_gTP>=0){
        tmpTP="   0"+(String)((_gTP))+"^C";
      }else if(_gTP<=(-1)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else if(_gTP>(-99)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else {
        tmpTP=" "+(String)((_gTP))+"^C";
      }
    }else if(millis() - millB < 3500){
      _tmscr=0;
      scroll=1;
      getTP=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
    }else if(millis() - millB < 4500){
     sndStr("DAVLENIE MM*HG");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readPressure()/133.3+7;
      }
      tmpTP=(String)((int)(_gTP))+" MMHG";
    }else if(millis() - millB < 8500){
      _tmscr=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
      getTP=0;
    }else if(millis() - millB < 10000){
     sndStr("VLAZHNOST H  ");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readHumidity();
      }
      tmpTP="  H- "+(String)((int)(_gTP));
    }else if(millis() - millB < 12500){
      _tmscr=0;
      sendStr6(tmpTP);
      getTP=0; 
    }else{
      digitTD(millis()/16%100,millis()/8%100,millis()/16%100,millis()/8%100);
      dotSet(B10000000>>(millis()/50%8));
      scroll=1;
      getTP=0;
      millB = millis()-300; 
         for(byte i=0; i<16; i++){
          digit_old[i]=0;
        } 
    }

    break;
  
    case 4:
      keyR();
    if(_keyS()==true){mod=10;}
    time.gettime();
  if(millis() - millB < 300){
    digitTD(millis()/1000000%100,millis()/10000%10,millis()/100%100,millis()%100);
    clr();
    }else if(millis() - millB < 1000){
    sndStr("  TIME");
    dotSet(B00000000);
    }else if(millis() - millB < 4500){
      digitTD3(time.Hours,time.minutes,time.seconds);
      dotSet(B00000000);
      scroll=1;
    }else if(millis() - millB < 5500){
     sndStr("  DATA");
     dotSet(B00000000);
     getTP=0;
    }else if(millis() - millB < 8500){
      clr();
      digitTD(time.day,time.month,20,time.year);
      dotSet(B01010000<<(millis()/500%2*4));
      scroll=1;
    }else if(millis() - millB < 12300){
     sndStr("TEMPERATURA");
     dotSet(B00000000);
     getTP=0;
    }else if(millis() - millB < 12500){

     if(!getTP){
      getTP=1;
      temperature = bme.readTemperature();//lm75a_sensor.getTemperatureInDegrees();
      //sprintf(tmpTP, "%03d", ((int)(temperature*10)));
      _gTP= ((int)(temperature*10));
      }
            if(_gTP>99){
        tmpTP="  "+(String)(_gTP)+"^C";
      }else if(_gTP>=10){
        tmpTP="   "+(String)((_gTP))+"^C";
      }else if(_gTP>=0){
        tmpTP="   0"+(String)((_gTP))+"^C";
      }else if(_gTP<=(-1)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else if(_gTP>(-99)){
        tmpTP="  "+(String)((_gTP))+"^C";
      }else {
        tmpTP=" "+(String)((_gTP))+"^C";
      }
    }else if(millis() - millB < 13500){
      _tmscr=0;
      scroll=1;
      getTP=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
    }else if(millis() - millB < 16500){
     sndStr("DAVLENIE MM*HG");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readPressure()/133.3+7;
      }
      tmpTP=(String)((int)(_gTP))+" MMHG";
    }else if(millis() - millB < 18500){
      _tmscr=0;
      sendStr6(tmpTP);
      dotSet(B00010000);
      getTP=0;
    }else if(millis() - millB < 20500){
     sndStr("VLAZHNOST H- ");
     dotSet(B0);
      if(!getTP){
      getTP=1;
      _gTP=bme.readHumidity();
      }
      tmpTP="  H- "+(String)((int)(_gTP));
    }else if(millis() - millB < 23500){
      _tmscr=0;
      sendStr6(tmpTP);
      getTP=0;  
    }else{
        if(millis()/160%8<4){
          dotSet(B1<<(millis()/80%8));
          }else{
          dotSet(B10000000>>(millis()/80%8));
        }
        for(byte i=0; i<8; i++){
          digit_old[i]=B0;
        }
      digitTD(millis()/30%100,millis()/70%60,millis()/60%70,millis()/80%100);
      millB = millis()-300; 
    }
    break;
    #endif
    case 9:
    mod= 14;
    break;
    case 10:
    sndStr("TIME SETUP");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=20;}    
    break;
    case 11:
    sndStr("DATA SETUP");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=30;} 
    break;
    case 12:
    sndStr("CORRECT TIME");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){mod=40;} 
    break;
    case 13:
    sndStr("MODE START");
    dotSet(B00000000);
    keyR();
    if(_keyS()==true){_tm=EEPROM.read(1)-1;mod=50;} 
    break;
    case 14:
    sndStr("  EXIT");
    keyR();
    if(_keyS()==true){mod=1;} 
    dotSet(B00000000);
    break;
    case 15:
    mod = 10;
    break;
    
    case 20:
            if(millis()/50%10<5){
              digit[7] = B00000000;
              digit[6] = B00000000;
            dotSet(B11000000); 
            }else{
              digitTD3(time.Hours,time.minutes,time.seconds);
              dotSet(B00000000); }
            time.Hours=_sm(_keyH(int(time.Hours)),24);
            time.Hours=_sm(_keyL(int(time.Hours)),24);
            if(_keyS()==true){mod++;}
      break;
      case 21:
            if(millis()/50%10<5){
              digit[3] = B00000000;
              digit[4] = B00000000;
            dotSet(B00011000); 
            }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds);}
            time.minutes=_sm(_keyH(int(time.minutes)),60);
            time.minutes=_sm(_keyL(int(time.minutes)),60);
            if(_keyS()==true){mod++;}
      break;
      case 22:
            if(millis()/50%10<5){
              digit[0] = B00000000;
              digit[1] = B00000000;
            dotSet(B00000011); 
            }else{dotSet(B00000000); digitTD3(time.Hours,time.minutes,time.seconds);}
            time.seconds=_sm(_keyH(int(time.seconds)),60);
            time.seconds=_sm(_keyL(int(time.seconds)),60);
            if(_keyS()==true){mod++;}
      break;
      case 23:
          time.settime(time.seconds, time.minutes, time.Hours);
          mod=10;
      break;
      
      case 30:
            if(millis()/50%10<5){
              digit[7] = B00000000;
              digit[6] = B00000000;
            dotSet(B11000000); 
            }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year);}
            time.day=_sm(_keyH(int(time.day)),32);
            time.day=_sm(_keyL(int(time.day)),32);
            if(_keyS()==true){mod++;}
      break;
      case 31:
            //digitTD(time.day,time.month);
            if(millis()/50%10<5){
              digit[5] = B00000000;
              digit[4] = B00000000;
            dotSet(B00110000); 
            }else{dotSet(B0000); digitTD(time.day,time.month,20,time.year);}
            time.month=_sm(_keyH(int(time.month)),13);
            time.month=_sm(_keyL(int(time.month)),13);
            if(_keyS()==true){mod++;}
      break;
      case 32:
            if(millis()/50%10<5){
              digit[1] = B00000000;
              digit[0] = B00000000;
            dotSet(B00001111); 
            }else{dotSet(B00000000); digitTD(time.day,time.month,20,time.year);}

            time.year=_sm(_keyH(int(time.year)),100);
            time.year=_sm(_keyL(int(time.year)),100);
            if(_keyS()==true){mod++;}

      break;
      case 33:
          time.settime(0, -1, -1, time.day, time.month, time.year);
          mod=11;
      break;
      
      case 40:
           
            if(timeCR<30){
              sendStr6("COR*T-"+(String)(30-timeCR));
            }else{
              sendStr6("COR*T "+(String)(timeCR-30));
            }
            dotSet(B0000); 
            timeCR=_sm(_keyH(int(timeCR)),59);
            timeCR=_sm(_keyL(int(timeCR)),59);
            if(_keyS()==true){mod++;}

      break;
      case 41:
          EEPROM.write(0, timeCR);
          mod=12;
      break;

      case 50:
            sendStr6("MODE * "+(String)(_tm+1));
            dotSet(B10000000>>_tm); 
            #if (BME_280 == 1)
            _tm=_sm(_keyH(int(_tm)),4);
            _tm=_sm(_keyL(int(_tm)),4);
            #else
            _tm=_sm(_keyH(int(_tm)),2);
            _tm=_sm(_keyL(int(_tm)),2);
            #endif
            if(_keyS()==true){mod++;}

      break;
      case 51:
          EEPROM.write(1, (_tm+1));
          _tm=0;
          mod=13;
      break;
      
    default:
    mod = 1;
  }//*/
}

 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

Сейчас все ОК! Спасибо!

Режим "Mode Start" что меняет?

Еще заметил косячек: перед выводом температуры сначала бежит строка TEMPERATURA, потом еще раз выводится статически TEMPERATURA и только потом показания....надо убрать или бегущую строку или статическую...

xplp
Offline
Зарегистрирован: 21.12.2012

Mode Start" это режим при включении, по умолчанию 1 это только показ времени, 4 это показ всего по порядку например. Насчёт косяка там нужно время на отображение меньше немного сделать. Например в 4 режиме строчка 626 "}else if(millis() - millB < 13500){ " если число 13500 уменьшить то отображение температуры появится быстрее, но тут экспериментировать нужно. Там алгоритм вывода такой, что функция "sndStr" выводит бегущую строку, а когда вывела то отображает просто что влезает в экран. Ну или использовать просто функцию "sendStr6" без прокрутки

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

Mode Start" это режим при включении, по умолчанию 1 это только показ времени, 4 это показ всего по порядку например. Насчёт косяка там нужно время на отображение меньше немного сделать. Например в 4 режиме строчка 626 "}else if(millis() - millB < 13500){ " если число 13500 уменьшить то отображение температуры появится быстрее, но тут экспериментировать нужно. Там алгоритм вывода такой, что функция "sndStr" выводит бегущую строку, а когда вывела то отображает просто что влезает в экран. Ну или использовать просто функцию "sendStr6" без прокрутки

Но самое странное что еще заметил, что измерения делаются только после сброса или вкл/выкл. а в режиме работы грей не грей показания не меняются...будто измерение делается только один раз а не в цикле

xplp
Offline
Зарегистрирован: 21.12.2012

Возможно дело в этих строчках:

   bme.begin(0x76, &Wire); 
    bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );

может их совсем убрать и оставить только    bme.begin(0x76, &Wire); 

 

ShAlex13
Offline
Зарегистрирован: 19.01.2018

xplp пишет:

Возможно дело в этих строчках:

   bme.begin(0x76, &Wire); 
    bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );

может их совсем убрать и оставить только    bme.begin(0x76, &Wire); 

Заремировал, все ОК!

В строке _gTP=bme.readPressure()/133.3+7;  +7 что означает? попробовал без +7, ни чего не поменялось, давление кажет то же самое.

xplp
Offline
Зарегистрирован: 21.12.2012

ShAlex13 пишет:

xplp пишет:

Возможно дело в этих строчках:

   bme.begin(0x76, &Wire); 
    bme.setSampling(Adafruit_BME280::MODE_FORCED,
                    Adafruit_BME280::SAMPLING_X1, // temperature
                    Adafruit_BME280::SAMPLING_X1, // pressure
                    Adafruit_BME280::SAMPLING_X1, // humidity
                    Adafruit_BME280::FILTER_OFF   );

может их совсем убрать и оставить только    bme.begin(0x76, &Wire); 

Заремировал, все ОК!

В строке _gTP=bme.readPressure()/133.3+7;  +7 что означает? попробовал без +7, ни чего не поменялось, давление кажет то же самое.

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