Как обьеденить DS18B20 с TM1637 ?
- Войдите на сайт для отправки комментариев
Пт, 23/10/2015 - 19:48
Уважаемые форумчане подскажите пожалуйста как обьеденить DS18B20 c TM1637 т.е. как сделать чтобы на дисплее отображалась температура с датчика ? Заранее спасибо! (поиск в просторах особых результатов не дал):)
без ардуины?
Извиняюсь с UNO R3
У меня получилось измерить положительную температуру но при замере в холодильнике :) дисплей не отображает отрицательной. Как поправить?
#include <TM1637Display.h> #include <OneWire.h> OneWire ds(9); const int CLK = 2; const int DIO = 3; int NumStep = 0; TM1637Display display(CLK, DIO); void setup() { display.setBrightness(0x0a); } void loop() { byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(1000); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1]<< 8)+data[0]; Temp = Temp>>4; display.showNumberDec(Temp); }Попробуйте инициировать Temp как float.
я бы разбил число на цифры и выводил по цифре. так и "-" можно выводить
Мне подсказали что в этой библиотеке просто нет знака минус
А термометр сделать хочется как быть?
Можно поподробнее?
Мне подсказали что в этой библиотеке просто нет знака минус
Вы имеете в виду библиотеку дисплея? Очень сомневаюсь. А OneWire минус не требуется. У вас с преобразованием типов проблема.
Мне подсказали что в этой библиотеке просто нет знака минус
Вы имеете в виду библиотеку дисплея? Очень сомневаюсь. А OneWire минус не требуется. У вас с преобразованием типов проблема.
Библиотека дисплея имеет только числа 0-9 и символы A,b,C,d,E,F. Пробовал копнуть в самой библиотеке - увы мало знаний в с++.
Это семисегментник что ли?
Это семисегментник что ли?
Да.Он самый
Тогда действительно, только библиотеку рыть или свой ногодрыг писать((((
так можно взять другую библиотеку (у меня их 2- TM1637Display.h TM1637.h )
в библиотеке можно поменять стороки как надо:
const uint8_t digitToSegment[] = { // XGFEDCBA 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111, // 9 0b01110111, // A 0b01111100, // b 0b00111001, // C 0b01011110, // d 0b01111001, // E 0b01110001 // F };в библиотеке можно поменять стороки как надо:
const uint8_t digitToSegment[] = { // XGFEDCBA 0b00111111, // 0 0b00000110, // 1 0b01011011, // 2 0b01001111, // 3 0b01100110, // 4 0b01101101, // 5 0b01111101, // 6 0b00000111, // 7 0b01111111, // 8 0b01101111, // 9 0b01110111, // A 0b01111100, // b 0b00111001, // C 0b01011110, // d 0b01111001, // E 0b01110001 // F };0b01000000 // - пробывал та же песня!
Не в минусе дело а в том что библиотека не понимает отрицательных чисел! Я правильно понимаю ?
Вам тогда надо, как Жека советовал, выводить по одному разряду.
я бы разбил число на цифры и выводил по цифре. так и "-" можно выводить
Можно поподробнее?
Я извиняюсь но что такое
в си есть два вида деления. / это после деления остается часть до запятой, % после запятой. своими словами так. как правильно звучик не помню. но с помощью этих делений можно разделить на цифры как во 2 коде разделяется число на 4 цифры, 48 + не обращай внимание , это для кодировки в коде откуда взят этот кусок
в си есть два вида деления. / это после деления остается часть до запятой, % после запятой. своими словами так. как правильно звучик не помню. но с помощью этих делений можно разделить на цифры как во 2 коде разделяется число на 4 цифры, 48 + не обращай внимание , это для кодировки в коде откуда взят этот кусок
Вот так?
#include <TM1637Display.h> #include <OneWire.h> OneWire ds(9); const int CLK = 2; const int DIO = 3; int NumStep = 0; TM1637Display display(CLK, DIO); void setup() { display.setBrightness(0x0e); } void loop() { byte data[8]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(1000); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int temp = (data[1]<< 8)+data[0]; temp = temp>>4; char c4=char(temp%10); char c3=char(temp%10); char c2=char(temp%10); char c1=char(temp%10); display.showNumberDec(char(temp)); }вместо char byte лучше использовать. во вторых забыл делить на 10 как в 2-4-6 строках. да и вывод неправильный вроде на дисплей
вместо char byte лучше использовать. во вторых забыл делить на 10 как в 2-4-6 строках. да и вывод неправильный вроде на дисплей
Подскажите пожалуйста как надо а то у меня сейчас взрыв мозга будет!
в коде ты разделил число из 4 цифр на 4 отдельные цифры. их выводи по одной. эти цифры хранятся в с1 с2 с3 с4
например 1237. ты разделил в с1=1, с2=2, с3=3, с4=7
это пример. у тебя в индикаторе 4 цифры. и тут 3 варианта. 1 цифра на индикаторе это знак, остальные 3 это температура. если температура не будет превывать 99.9 градусов то можно выводит с десятыми, если больше то 2 вариарт. без десятых от 0 до 125 без десятых, или до 99,9 с десятыми а после без десятых. 3 вариант.... короче как угодно можно комбинировать
в коде ты разделил число из 4 цифр на 4 отдельные цифры. их выводи по одной. эти цифры хранятся в с1 с2 с3 с4
например 1237. ты разделил в с1=1, с2=2, с3=3, с4=7
это пример. у тебя в индикаторе 4 цифры. и тут 3 варианта. 1 цифра на индикаторе это знак, остальные 3 это температура. если температура не будет превывать 99.9 градусов то можно выводит с десятыми, если больше то 2 вариарт. без десятых от 0 до 125 без десятых, или до 99,9 с десятыми а после без десятых. 3 вариант.... короче как угодно можно комбинировать
Вышел из положения так . Вашим методом не получается . Сейчас дисплей показывает и при минусовой температуре цифры но как воткнуть - так и не додумался!
#include <TM1637Display.h> #include <OneWire.h> OneWire ds(9); const int CLK = 2; const int DIO = 3; TM1637Display display(CLK, DIO); void setup() { display.setBrightness(0x0e); } void loop() { byte data[2]; ds.reset(); ds.write(0xCC); ds.write(0x44); delay(1000); ds.reset(); ds.write(0xCC); ds.write(0xBE); data[0] = ds.read(); data[1] = ds.read(); int Temp = (data[1]<< 8)+data[0]; Temp = Temp>>4; display.showNumberDec(abs(Temp)); }Пишу со смарта - простите.
Библиотека tm1637.h
Вывод символа-… dysplay(0,15);
0-номер ячейки
15 - выводимый символ
В библиотеке поменять 0x71 на что надо(0х01 пример)
71 спомощю калькулятора из hex перевести в bin
40- это минус
А можно поподробнее и в коде ?
#include <TM1637.h> //------------дисплей___ #define CLK 3//pins definitions for TM1637 and can be changed to other ports #define DIO 2 TM1637 tm1637(CLK,DIO); void setup() { tm1637.init(); tm1637.set(2);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7; . . . } void Ris() { tm1637.clearDisplay(); //---рисуем все 0------- tm1637.display(0,0); tm1637.display(1,0); tm1637.display(2,0); tm1637.display(3,0); delay(400); //---рисуем все 8------- tm1637.clearDisplay(); tm1637.display(0,8); tm1637.display(1,8); tm1637.display(2,8); tm1637.display(3,8); delay(400); //---рисуем 9,A,b,C------- tm1637.clearDisplay(); tm1637.display(0,9); tm1637.display(1,10); tm1637.display(2,11); tm1637.display(3,12); delay(400); /* если в файле TM1637.cpp в строке 26 заменить 0x71 на 0х40 то tm1637.display(0,15) выдаст в первом символе - */ }hex 0х71 - bin 1110001 ------ "F"
"-" bin 1000000 - hex 40 (0x40)
#include <TM1637.h> //------------дисплей___ #define CLK 3//pins definitions for TM1637 and can be changed to other ports #define DIO 2 TM1637 tm1637(CLK,DIO); void setup() { tm1637.init(); tm1637.set(2);//BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7; . . . } void Ris() { tm1637.clearDisplay(); //---рисуем все 0------- tm1637.display(0,0); tm1637.display(1,0); tm1637.display(2,0); tm1637.display(3,0); delay(400); //---рисуем все 8------- tm1637.clearDisplay(); tm1637.display(0,8); tm1637.display(1,8); tm1637.display(2,8); tm1637.display(3,8); delay(400); //---рисуем 9,A,b,C------- tm1637.clearDisplay(); tm1637.display(0,9); tm1637.display(1,10); tm1637.display(2,11); tm1637.display(3,12); delay(400); /* если в файле TM1637.cpp в строке 26 заменить 0x71 на 0х40 то tm1637.display(0,15) выдаст в первом символе - */ }Я не понимаю в этой библиотеке и так есть минус вот кусок кода из неё?
#include "TM1637.h" #include <Arduino.h> static int8_t TubeTab[] = {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, 0x40,0x00};//0~9,A,b,C,d,E,F,"-"," "Ну да. У меня другая версия библиотеки - без "-" и " "
В вашей версии нужно писать 16 в качестве параметра, вместо моих 15
Вот так?
Да. Только я не знаю, что делает вторая строка. Я начинающий.
Мучаю такой-же дисплейчик.
Как оказалось, код в библиотеке даже менять не надо, достаточно дописать свои ячейки.
#include "TM1637.h" #include <Arduino.h> static int8_t TubeTab[] = { 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71, //0~9,A,b,C,d,E,F 0x40,0x00,0x63,0x5c, // -,space,degre,n, 0x54,0x76,0x50,0x6d}; // n,H,r,Sдве нижние строки дописал.
добрый день, сегодня стал обладателем arduino uno r3, решил подключить DS18S20 c TM1637, взял скетч из начала темы, почему то не работает, на экране отображается E . может дело в том что датчик с маркировкой S ? где то нужно править код?
p.s. с порта нет данных, если использовать скетч из темы, пробовал скетчи от датчика и дисплея по отднльности, работает.
методом тыка, обнаружил если поменять Temp = Temp>>8; на Temp = Temp>>1; показания есть но они вправой части.
как перенести их влево? что бы отображалось к примеру 25.5
Всем добрый день!
Прочёл тему ивозник вопрос, по поводу DHT 22 (AM2302) датчика Нигде нет упаминания об активации DHT.h библиатек
Я хотел бы реаизовать 2 варианта отображения дисплеем
1. Отображение температуры и влажности поочерёдно по 2 секунды
2. отображение температуры и влажности одновременно через дваиточие целыми числами без десятичных
Проблему отображения знака минус для себя решил так:
int tempMin = -55; int tempMax = 00; void loop() { readDS18B20(); display.point(POINT_OFF); if (temp > tempMax) { timeDisp[0] = 16; } else { timeDisp[0] = 17; } timeDisp[1] = (abs(temp)) / 10; timeDisp[2] = (byte)(abs(temp)) % 10; timeDisp[3] = 18; }Проблему отображения знака минус для себя решил так:
int tempMin = -55; int tempMax = 00; void loop() { readDS18B20(); display.point(POINT_OFF); if (temp > tempMax) { timeDisp[0] = 16; } else { timeDisp[0] = 17; } timeDisp[1] = (abs(temp)) / 10; timeDisp[2] = (byte)(abs(temp)) % 10; timeDisp[3] = 18; }А можно скетч полностью?
Собирал часы в машину с отображением температуры.
Многие части кода были позаимствованы у других людей.
Возможно есть ошибки, сильно не пинайте я новичек. Часы работают второй месяц, глюков не наблюдаю.
#include <OneWire.h> #include <DI.h> #include <Meander.h> #include <Timer_P.h> #include <DS3231.h> #include <Wire.h> #include <EEPROM.h> #include "TM1637.h" #define ONE_WIRE_PIN 11 // пин для подключения DS18B20 OneWire oneWire(ONE_WIRE_PIN); //Массив, содержащий время компиляции char compileTime[] = __TIME__; char compileDate[] = __DATE__; #define DISPLAY_CLK_PIN 2 #define DISPLAY_DIO_PIN 3 #define MODE_KEY_PIN 5 #define MODE1_KEY_PIN 8 #define PLUS_KEY_PIN 6 #define MINUS_KEY_PIN 7 int tempMin = -55; int tempMax = 00; float temp; // переменная для хранения температуры TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN); DS3231 Clock(SDA, SCL); Time RTC_Time; DI ModeKey(MODE_KEY_PIN, 10), PlusKey(PLUS_KEY_PIN, 10), MinusKey(MINUS_KEY_PIN, 10), Mode1Key(MODE1_KEY_PIN, 10); Timer_P DisplayPeriod, AutoID_Timer, SecsSetted; Meander P_s; int Mode = 0, HourToSet, MinuteToSet, OutPeriod = 200; int Mode1 = 0; boolean ModeKey_old, PlusKey_old, MinusKey_old, Mode2_old, Mode3_old, SecsSetted_old; byte mode = 0; void setup() { //Serial.begin(115200); // Start the I2C interface Clock.begin(); //Включаем и настраиваем индикатор Wire.begin(); display.set(7); display.init(); //Получаем число из строки, зная номер первого символа byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 3); byte second = getInt(compileTime, 6); unsigned int hash = hour * 60 * 60 + minute * 60 + second; if (EEPROMReadInt(0) != hash) { //Сохраняем новый хэш EEPROMWriteInt(0, hash); Clock.adjust(compileDate, compileTime); } pinMode(13, OUTPUT); } void loop() { int8_t TimeDisp[4]; //Запускаем меандр P_s.MeanderV(OutPeriod * 2, OutPeriod); ModeKey.DI_Refresh(); Mode1Key.DI_Refresh(); PlusKey.DI_Refresh(); MinusKey.DI_Refresh(); DisplayPeriod.TimerV(!DisplayPeriod.Q0(), 0, 2, OutPeriod); // Самосбрасывающийся таймер периода AutoID_Timer.TimerV(!AutoID_Timer.Q0() && (PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) , 0, 2, OutPeriod * 2); SecsSetted.TimerV((Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))), 0, 1, 1500); if (ModeKey.DI_Read() && !ModeKey_old) Mode = (++Mode) % 4; //Перебор режимов if (Mode1Key.DI_Read() && !ModeKey_old) Mode1 = (++Mode1) % 2; //Перебор режимов if (!SecsSetted.Q0() && SecsSetted_old) Mode = 2; if (Mode == 2 && !Mode2_old) MinuteToSet = RTC_Time.min; if (Mode == 3 && !Mode3_old) HourToSet = RTC_Time.hour; if (Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))) Clock.setSecond(0); if (Mode != 2 && Mode2_old) Clock.setMinute(MinuteToSet); if (Mode != 3 && Mode3_old) Clock.setHour(HourToSet); if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 2) { if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) MinuteToSet = (++MinuteToSet) % 60; if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) MinuteToSet = --MinuteToSet; if (MinuteToSet < 0) MinuteToSet = 59; } if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 3) { if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) HourToSet = (++HourToSet) % 24; if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) HourToSet = --HourToSet; if (HourToSet < 0) HourToSet = 24; } if (DisplayPeriod.Q0()) { // Get data from the DS3231 int8_t timeDisp[4]; //Запрашиваем время RTC_Time = Clock.getTime(); // считываем температуру readDS18B20(); //Получаем десятки часов с помощью целочисленного деления timeDisp[0] = RTC_Time.hour / 10; timeDisp[1] = RTC_Time.hour % 10; timeDisp[2] = RTC_Time.min / 10; timeDisp[3] = RTC_Time.min % 10; switch (Mode) { case 1: //if (P_s.Q0()){ timeDisp[0] = 16; timeDisp[1] = 16; timeDisp[2] = 16; timeDisp[3] = 16; //} break; case 2: if (P_s.Q0()){ timeDisp[2] = MinuteToSet / 10; timeDisp[3] = MinuteToSet % 10; }else{ timeDisp[2] = 16; timeDisp[3] = 16; } break; case 3: if (P_s.Q0()){ timeDisp[0] = HourToSet / 10; timeDisp[1] = HourToSet % 10; }else{ timeDisp[0] = 16; timeDisp[1] = 16; } break; } switch (Mode1) { case 1: display.point(POINT_OFF); // выключаем точки if (temp > tempMax) // смотрим знак температуры - или + { timeDisp[0] = 16; } else { timeDisp[0] = 17; } timeDisp[1] = (abs(temp)) / 10; // заполняем массив timeDisp[2] = (byte)(abs(temp)) % 10; timeDisp[3] = 18; // C break; } display.display(timeDisp); display.point(((RTC_Time.sec % 2 ? POINT_ON : POINT_OFF) && !SecsSetted.Q0()) || (!P_s.Q0() && SecsSetted.Q0())); // Send Day-of-Week //Serial.print(Clock.getDOWStr()); //Serial.print(" "); // Send date //Serial.print(Clock.getDateStr()); //Serial.print(" -- "); // Send time //Serial.println(Clock.getTimeStr()); } ModeKey_old = ModeKey.DI_Read(); PlusKey_old = PlusKey.DI_Read(); MinusKey_old = MinusKey.DI_Read(); SecsSetted_old = SecsSetted.Q0(); Mode2_old = (Mode == 2); Mode3_old = (Mode == 3); digitalWrite(13, P_s.Q0()); } //Содержимое функции объяснено ниже char getInt(const char* string, int startIndex) { return int(string[startIndex] - '0') * 10 + int(string[startIndex + 1]) - '0'; } //Запись двухбайтового числа в память void EEPROMWriteInt(int address, int value) { EEPROM.write(address, lowByte(value)); EEPROM.write(address + 1, highByte(value)); } //Чтение числа из памяти unsigned int EEPROMReadInt(int address) { byte lowByte = EEPROM.read(address); byte highByte = EEPROM.read(address + 1); return (highByte << 8) | lowByte; } void readDS18B20() { static boolean n = false; // флаг работы: запрос температуры или её чтение n = !n; if (n) { oneWire.reset(); // сброс шины oneWire.write(0xCC); //обращение ко всем датчикам (если всего один DS18B20) //oneWire.select(sensorAddress); // выбор конкретного адреса - если несколько DS18B20 oneWire.write(0x44); // начать преобразование (без паразитного питания) } else { oneWire.reset(); // сброс шины oneWire.write(0xCC); //обращение ко всем датчикам (если всего один DS18B20) //oneWire.select(sensorAddress); // выбор конкретного адреса - если несколько DS18B20 oneWire.write(0xBE); // Read Scratchpad (чтение регистров) temp = (oneWire.read() | oneWire.read() << 8) / 16.0; //прочитаны 2 байта } }Я извиняюсь а не могли бы скинуть библиотеки из вашего скетча(например DI.h вообще немогу найти))
Библиотека DigitalTube и XDron.
В библиотеке DigitalTube добавлял символы.
https://yadi.sk/d/f4E9EW6mw9ndz
А показания темперетуры с чего снимал? Какой датчик?
Я DHT 22 с дисплеем ни как не могу подружить.
Чтобы включить отображение температуры на 9-м пине кнопка Mode1 (переключение между часами и температурой).
Тестировал в морозилке холодильника :)
Датчик DS18B20
Я когда эксперементировал со скетчем тоже 22-й использовать пытался, всё работало. Только на тот момент ещё не догнал как знак минус нарисовать, поэтому скетч не сохранился.
Для DHT-22 попробуйте этот скетч, правда проверить не на чем. Датчик так-же к 11 пину.
#include <DHT.h> #include <DI.h> #include <Meander.h> #include <Timer_P.h> #include <DS3231.h> #include <EEPROM.h> #include "TM1637.h" #define DHTPIN 11 // what digital pin we're connected to #define DHTTYPE DHT22 // DHT 22 DHT dht(DHTPIN, DHTTYPE); //Массив, содержащий время компиляции char compileTime[] = __TIME__; char compileDate[] = __DATE__; #define DISPLAY_CLK_PIN 2 #define DISPLAY_DIO_PIN 3 #define MODE_KEY_PIN 6 #define MODE1_KEY_PIN 9 #define PLUS_KEY_PIN 7 #define MINUS_KEY_PIN 8 int tempMin = -55; int tempMax = 00; float temp = dht.readTemperature(); TM1637 display(DISPLAY_CLK_PIN, DISPLAY_DIO_PIN); DS3231 Clock(4, 5); Time RTC_Time; DI ModeKey(MODE_KEY_PIN, 10), PlusKey(PLUS_KEY_PIN, 10), MinusKey(MINUS_KEY_PIN, 10), Mode1Key(MODE1_KEY_PIN, 10); Timer_P DisplayPeriod, AutoID_Timer, SecsSetted; Meander P_s; int Mode = 0, HourToSet, MinuteToSet, OutPeriod = 200; int Mode1 = 0; boolean ModeKey_old, Mode1Key_old, PlusKey_old, MinusKey_old, Mode2_old, Mode3_old, SecsSetted_old; byte mode = 0; void setup() { //Serial.begin(115200); // Start the I2C interface dht.begin(); Clock.begin(); //Включаем и настраиваем индикатор display.set(7); display.init(); //Получаем число из строки, зная номер первого символа byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 3); byte second = getInt(compileTime, 6); unsigned int hash = hour * 60 * 60 + minute * 60 + second; if (EEPROMReadInt(0) != hash) { //Сохраняем новый хэш EEPROMWriteInt(0, hash); Clock.adjust(compileDate, compileTime); } pinMode(13, OUTPUT); } void loop() { int8_t TimeDisp[4]; //Запускаем меандр P_s.MeanderV(OutPeriod * 2, OutPeriod); ModeKey.DI_Refresh(); Mode1Key.DI_Refresh(); PlusKey.DI_Refresh(); MinusKey.DI_Refresh(); DisplayPeriod.TimerV(!DisplayPeriod.Q0(), 0, 2, OutPeriod); // Самосбрасывающийся таймер периода AutoID_Timer.TimerV(!AutoID_Timer.Q0() && (PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) , 0, 2, OutPeriod * 2); SecsSetted.TimerV((Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))), 0, 1, 1500); if (ModeKey.DI_Read() && !ModeKey_old) Mode = (++Mode) % 4; //Перебор режимов if (Mode1Key.DI_Read() && !Mode1Key_old) Mode1 = (++Mode1) % 2; //Перебор режимов if (!SecsSetted.Q0() && SecsSetted_old) Mode = 2; if (Mode == 2 && !Mode2_old) MinuteToSet = RTC_Time.min; if (Mode == 3 && !Mode3_old) HourToSet = RTC_Time.hour; if (Mode == 1 && ((PlusKey.DI_Read() && !PlusKey_old) || (MinusKey.DI_Read() && !MinusKey_old))) Clock.setSecond(0); if (Mode != 2 && Mode2_old) Clock.setMinute(MinuteToSet); if (Mode != 3 && Mode3_old) Clock.setHour(HourToSet); if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 2) { if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) MinuteToSet = (++MinuteToSet) % 60; if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) MinuteToSet = --MinuteToSet; if (MinuteToSet < 0) MinuteToSet = 59; } if ((PlusKey.DI_Read() || MinusKey.DI_Read()) && !(PlusKey.DI_Read() && MinusKey.DI_Read()) && Mode == 3) { if (PlusKey.DI_Read() && (!PlusKey_old || AutoID_Timer.Q0())) HourToSet = (++HourToSet) % 24; if (MinusKey.DI_Read() && (!MinusKey_old || AutoID_Timer.Q0())) HourToSet = --HourToSet; if (HourToSet < 0) HourToSet = 24; } if (DisplayPeriod.Q0()) { // Get data from the DS3231 int8_t timeDisp[4]; //Запрашиваем время RTC_Time = Clock.getTime(); //Получаем десятки часов с помощью целочисленного деления timeDisp[0] = RTC_Time.hour / 10; timeDisp[1] = RTC_Time.hour % 10; timeDisp[2] = RTC_Time.min / 10; timeDisp[3] = RTC_Time.min % 10; switch (Mode) { case 1: //if (P_s.Q0()){ timeDisp[0] = 16; timeDisp[1] = 16; timeDisp[2] = 16; timeDisp[3] = 16; //} break; case 2: if (P_s.Q0()){ timeDisp[2] = MinuteToSet / 10; timeDisp[3] = MinuteToSet % 10; }else{ timeDisp[2] = 16; timeDisp[3] = 16; } break; case 3: if (P_s.Q0()){ timeDisp[0] = HourToSet / 10; timeDisp[1] = HourToSet % 10; }else{ timeDisp[0] = 16; timeDisp[1] = 16; } break; } switch (Mode1) { case 1: display.point(POINT_OFF); // выключаем точки if (temp > tempMax) // смотрим знак температуры - или + { timeDisp[0] = 16; } else { timeDisp[0] = 17; } timeDisp[1] = (abs(temp)) / 10; // заполняем массив timeDisp[2] = (byte)(abs(temp)) % 10; timeDisp[3] = 18; // C break; } display.display(timeDisp); display.point(((RTC_Time.sec % 2 ? POINT_ON : POINT_OFF) && !SecsSetted.Q0()) || (!P_s.Q0() && SecsSetted.Q0())); // Send Day-of-Week //Serial.print(Clock.getDOWStr()); //Serial.print(" "); // Send date //Serial.print(Clock.getDateStr()); //Serial.print(" -- "); // Send time //Serial.println(Clock.getTimeStr()); } ModeKey_old = ModeKey.DI_Read(); Mode1Key_old = Mode1Key.DI_Read(); PlusKey_old = PlusKey.DI_Read(); MinusKey_old = MinusKey.DI_Read(); SecsSetted_old = SecsSetted.Q0(); Mode2_old = (Mode == 2); Mode3_old = (Mode == 3); digitalWrite(13, P_s.Q0()); } //Содержимое функции объяснено ниже char getInt(const char* string, int startIndex) { return int(string[startIndex] - '0') * 10 + int(string[startIndex + 1]) - '0'; } //Запись двухбайтового числа в память void EEPROMWriteInt(int address, int value) { EEPROM.write(address, lowByte(value)); EEPROM.write(address + 1, highByte(value)); } //Чтение числа из памяти unsigned int EEPROMReadInt(int address) { byte lowByte = EEPROM.read(address); byte highByte = EEPROM.read(address + 1); return (highByte << 8) | lowByte; }#include <dht.h> #include "TM1637.h" //{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //0~9,A,b,C,d,E,F #define dht_pin 2 // Pin sensor is connected to #define CLK 3//Pins for TM1637 #define DIO 4 TM1637 tm1637(CLK,DIO); dht DHT; void setup(){ tm1637.init(); tm1637.set(BRIGHT_TYPICAL); //BRIGHT_TYPICAL = 2,BRIGHT_DARKEST = 0,BRIGHTEST = 7; delay(1500);//Delay to let system boot }//end "setup()" void loop(){ //Start of Program DHT.read11(dht_pin); int temp = DHT.temperature; int humidity = DHT.humidity; int digitoneT = temp / 10; int digittwoT = temp % 10; int digitoneH = humidity / 10; int digittwoH = humidity % 10; tm1637.display(1,digitoneT); tm1637.display(2,digittwoT); tm1637.display(3,12); // put a C at the end delay (3000); tm1637.display(1,23); tm1637.display(2,digitoneH); tm1637.display(3,digittwoH); //Wait 3 seconds before accessing sensor again. //Fastest should be once every two seconds. delay(3000); }// end loop()Вот нашол то что нужно https://brainy-bits.com/tutorials/4-bits-7-segment-led-display-with-arduino/ но при компиляции выдаёт ошибку в 34 строке DHT.read11(dht_pin); Подскажите пожалуйста как исправить