Схема не нарисована, так соединялось, есть такое исследование:
У экраньчика уже были микросхемки К1109КН2 и дешифраторы К561ИД1.
Это те, что на заднем плане чёрные, в высоком корпусе, которые белые в компактном корпусе, там сдвиговые регистры применены были вместо дешифраторов и td62783apg.
На ибее ценники так себе, особенно на доставку, есть не очень дорогие, но с лишними всякими символами типа такого https://www.ebay.com/itm/Vintage-Vacuum-VFD-Fluorescent-Display-Screens-...
схема питания интересна, с дешифраторами и регистрами и так всё ясно, у алика тьма вфд экранов от тыщи и выше, а у меня так их куча бу ждё своего часа.
Выводы с TD62783AFWG поменять местами, та что была подключена к сегментам подключить к сеткам разрядов, а другую соответственно с сеток на сегменты переключить. Поправил схему.
Только никак не могу найти как включить режим, чтобы показывало время-температура. Нашел только постоянно время, время-дата, а хочу время-температура. Или в этом скетче не задействован датчик который в DS3231 и надо вешать BMP280 ?
Да там используется BMP280. Нужно 36 строчку поменять с #define BMP_280 0 на #define BMP_280 1 и датчик повесить на i2c интерфейс.
Припаял датчик BME/BMP280, прописал #define BMP_280 1 , температуру кажет 0.0 С, давление вообще не понятно что кажет... Ни чего больше раскоментировать в скетче не надо? Может у меня датчик BME280?
По умолчанию адрес 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, оба вынесены просто на воздух и лежат рядом
Правда разница у рядом лежащего DS18B20 от другого девайса, 2 градуса. DS-ка на 2 градуса кажет ниже чем BMP, оба вынесены просто на воздух и лежат рядом
Хотя кто из них больше врет не понятно, надо идеальный градусник
Ну отображение влажности можно добавить, чтобы не пропадали показания за зря. Может версия BME280 на 3.3 вольта, вот он сам себя и греет, на али смотрел там на 5 и на 3.3 есть версии.
Еще заметил косячек: перед выводом температуры сначала бежит строка TEMPERATURA, потом еще раз выводится статически TEMPERATURA и только потом показания....надо убрать или бегущую строку или статическую...
Mode Start" это режим при включении, по умолчанию 1 это только показ времени, 4 это показ всего по порядку например. Насчёт косяка там нужно время на отображение меньше немного сделать. Например в 4 режиме строчка 626 "}else if(millis() - millB < 13500){ " если число 13500 уменьшить то отображение температуры появится быстрее, но тут экспериментировать нужно. Там алгоритм вывода такой, что функция "sndStr" выводит бегущую строку, а когда вывела то отображает просто что влезает в экран. Ну или использовать просто функцию "sendStr6" без прокрутки
Mode Start" это режим при включении, по умолчанию 1 это только показ времени, 4 это показ всего по порядку например. Насчёт косяка там нужно время на отображение меньше немного сделать. Например в 4 режиме строчка 626 "}else if(millis() - millB < 13500){ " если число 13500 уменьшить то отображение температуры появится быстрее, но тут экспериментировать нужно. Там алгоритм вывода такой, что функция "sndStr" выводит бегущую строку, а когда вывела то отображает просто что влезает в экран. Ну или использовать просто функцию "sendStr6" без прокрутки
Но самое странное что еще заметил, что измерения делаются только после сброса или вкл/выкл. а в режиме работы грей не грей показания не меняются...будто измерение делается только один раз а не в цикле
может их совсем убрать и оставить только bme.begin(0x76, &Wire);
Заремировал, все ОК!
В строке _gTP=bme.readPressure()/133.3+7; +7 что означает? попробовал без +7, ни чего не поменялось, давление кажет то же самое.
Это я под другой датчик типа юстировал, чтобы одинаковые значения показывал, но это для bmp датчика было. Почему не меняется сейчас я хз, у меня как раз менялось.
Ебей есть! Али не всем богат)
Схема не нарисована, так соединялось, есть такое исследование:
У экраньчика уже были микросхемки К1109КН2 и дешифраторы К561ИД1.
Это те, что на заднем плане чёрные, в высоком корпусе, которые белые в компактном корпусе, там сдвиговые регистры применены были вместо дешифраторов и td62783apg.
На ибее ценники так себе, особенно на доставку, есть не очень дорогие, но с лишними всякими символами типа такого https://www.ebay.com/itm/Vintage-Vacuum-VFD-Fluorescent-Display-Screens-...
схема питания интересна, с дешифраторами и регистрами и так всё ясно, у алика тьма вфд экранов от тыщи и выше, а у меня так их куча бу ждё своего часа.
Схема питания на МТ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 разрядами?
этот я и видел, возьми матричный куда больше возможностей.
Матричный не так интересно смотрится, у меня матричный есть такой scd5580a:
Прошу не кидайте тапками
свободного времени на это очень мало(((
А у нас девать некуда!
Подскажите пожалуйста
Что именно подсказать? Вы вопрос забыли задать.
взял скетч тут
Где?
Типа "Мы - наши туристы"?
YuriiOd - не ту библиотеку для часов взяли.
Спасибо большое, уже заменил на нужную, работает
...
Показывают время, дату, температуру, влажность, давление, есть будильник по дням недели.
Код для ардуино кому интересно:.....
Схемой подключения и скетчем не поделитесь для ИВ-18 ?
Для xplp...собрал по Вашей схеме и чего то не "взлетает"
Может где накосячил, взгляните...
Схема
Плата
Мой косяк, со схемой напортачил, колбу нужно по другому подключить. Там выводы сегментов и сеток поменять местами нужно. https://www.thingiverse.com/download:8720360
Выводы с TD62783AFWG поменять местами, та что была подключена к сегментам подключить к сеткам разрядов, а другую соответственно с сеток на сегменты переключить. Поправил схему.
Так?
Да всё верно.
Да всё верно.
Вечером перекину, отпишусь
В какой проге схема нарисована? Я рисовал в Dip Trace, но именно рисовал, полноценно пользоваться не умею (=
В какой проге схема нарисована? Я рисовал в Dip Trace, но именно рисовал, полноценно пользоваться не умею (=
Схему или печатку? Схему рисовал в Splan70, печатку в Layout60, но тоже именно рисую, а не трассирую.
Перекинул выводы, все отлично!
Только никак не могу найти как включить режим, чтобы показывало время-температура. Нашел только постоянно время, время-дата, а хочу время-температура. Или в этом скетче не задействован датчик который в DS3231 и надо вешать BMP280 ?
Да там используется BMP280. Нужно 36 строчку поменять с #define BMP_280 0 на #define BMP_280 1 и датчик повесить на i2c интерфейс.
Да там используется 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 ?
У меня нет сейчас такого датчика чтобы попробовать. Датчик если просто пример из библиотеки залить работает? На другой ардуинке.
Ссылка на скетч (измененный)
https://cloud.mail.ru/public/59GZ/4HBjaXWho
У меня нет сейчас такого датчика чтобы попробовать. Датчик если просто пример из библиотеки залить работает? На другой ардуинке.
Ну могу и эту затереть примером, но датчик в других примерах точно работал
/* ИВ-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
По умолчанию адрес 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, оба вынесены просто на воздух и лежат рядом
Если влажность не выводится то Adafruit_BME280::SAMPLING_NONE, /* humidity */
Правда разница у рядом лежащего DS18B20 от другого девайса, 2 градуса. DS-ка на 2 градуса кажет ниже чем BMP, оба вынесены просто на воздух и лежат рядом
Хотя кто из них больше врет не понятно, надо идеальный градусник
Ну отображение влажности можно добавить, чтобы не пропадали показания за зря. Может версия BME280 на 3.3 вольта, вот он сам себя и греет, на али смотрел там на 5 и на 3.3 есть версии.
Ну отображение влажности можно добавить, чтобы не пропадали показания за зря.
Вот они то мне больше и нужны в детской комнате, давление вроде пока и не нужно.
Может версия BME280 на 3.3 вольта, вот он сам себя и греет, на али смотрел там на 5 и на 3.3 есть версии.
У меня 5 вольтовая
Вот добавил влажность.
/* ИВ-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; }//*/ }Температуру не правильно кажет, 3.6 С градуса всего
А до этого правильно показывал? Потому что с температурой я ничего не делал.
А до этого правильно показывал? Потому что с температурой я ничего не делал.
Правильно показывало
А на самом деле какая температура? если нагревать или остужать пропорционально показывает?
А на самом деле какая температура? если нагревать или остужать пропорционально показывает?
Сейчас залил "старую" прошивку, кажет 27.0 С градусов, ну и давление 751
Я кажется понял в чём дело, такой код должен по идее это исправить:
/* ИВ-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; }//*/ }Сейчас все ОК! Спасибо!
Режим "Mode Start" что меняет?
Еще заметил косячек: перед выводом температуры сначала бежит строка TEMPERATURA, потом еще раз выводится статически TEMPERATURA и только потом показания....надо убрать или бегущую строку или статическую...
Mode Start" это режим при включении, по умолчанию 1 это только показ времени, 4 это показ всего по порядку например. Насчёт косяка там нужно время на отображение меньше немного сделать. Например в 4 режиме строчка 626 "}else if(millis() - millB < 13500){ " если число 13500 уменьшить то отображение температуры появится быстрее, но тут экспериментировать нужно. Там алгоритм вывода такой, что функция "sndStr" выводит бегущую строку, а когда вывела то отображает просто что влезает в экран. Ну или использовать просто функцию "sendStr6" без прокрутки
Mode Start" это режим при включении, по умолчанию 1 это только показ времени, 4 это показ всего по порядку например. Насчёт косяка там нужно время на отображение меньше немного сделать. Например в 4 режиме строчка 626 "}else if(millis() - millB < 13500){ " если число 13500 уменьшить то отображение температуры появится быстрее, но тут экспериментировать нужно. Там алгоритм вывода такой, что функция "sndStr" выводит бегущую строку, а когда вывела то отображает просто что влезает в экран. Ну или использовать просто функцию "sendStr6" без прокрутки
Но самое странное что еще заметил, что измерения делаются только после сброса или вкл/выкл. а в режиме работы грей не грей показания не меняются...будто измерение делается только один раз а не в цикле
Возможно дело в этих строчках:
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);
Возможно дело в этих строчках:
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, ни чего не поменялось, давление кажет то же самое.
Возможно дело в этих строчках:
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 датчика было. Почему не меняется сейчас я хз, у меня как раз менялось.