Уважаемые Амперщики. Прошу помочь советом. Очень заинтересовал проект по контролю влажности разработанный уважаемым автором. Ссылку привожу: http://samopal.pro/h-controller1/ Но в проекте применяется стандартный двухразрядный семисегментый индикатор CPS03621BR, я же планирую применить вот такой с i2c портом. https://ru.aliexpress.com/item/J34-...32401419391.html?spm=a2g0s.9042311.0.0.W3o3qH Признаюсь честно-в скетчах пока слабо разбираюсь, хотя уже и сделал более 10 устройств на Ардуино, поэтому и прошу ответить на вопрос: Что нужно поменять в скетче, что б применить светодиодный дисплей с i2c портом. Сетч от автора привожу: #include <SevenSegmentDisplay.h> #include <DHT.h> #include <DHT_U.h> //#include <DHT.h> //#include <SevenSegmentDisplay.h> #define DEBUG 1 #define TIMER_PERIOD 2400 #define ctrPIN 13 //Дискретный вывод для вентелятора #define dhtPIN 15 //Дискретный вход для датчика температуры #define btnPIN 18 //Кнопка // Указатель на функцию перезагрузки контроллера void(* resetFunc) (void) = 0; // Reset MC function // Инициируем светодиодную матрицу SevenSegmentDisplay<true, BiDigit<17, 16> > ss(9, 8, 7, 6, 5, 4, 3, 2); // Инициируем DHT11 на контроллере с частотой 8МГц //DHT dht(dhtPIN, DHT11, 3);// 8Мгц DHT dht(dhtPIN, DHT11); //16МГц // Состояния FSM enum TMode { tmWait, //Режим ожидания tmNeedPower, //Требуется включение вентилятора tmAutoPower, //Вентилятор работает в автоматическом режиме tmManualPower //Вентилятор работает в ручном режиме }; // Состояния отображения enum TDisplayMode { tdmTemp , //Отображение температуры tdmHum , //Отображение влажности tdmTimer //Отображение таймера }; //int h_prev; int t,h,a0; int h_arr[6]; void setup() { // Инициируем порт отладки #ifdef DEBUG Serial.begin(9600); Serial.println("Humidity controller start ..."); #endif // Инициируем выход управления pinMode(ctrPIN, OUTPUT); // будем мигать лампочкой при передаче digitalWrite(ctrPIN, LOW); // Инициируем вход с кнопкой pinMode(btnPIN, INPUT); //Включаем подтягивающий резистор digitalWrite(btnPIN, HIGH); // Инициируем датчик температуры DHT11 dht.begin(); // Считываем первоначальное значение влажности h = dht.readHumidity(); for( int i=0; i<6; i++)h_arr = h; } // Счетчик 0.5 секудных тактов unsigned long cnt05 = 0; unsigned long ms1 = 0; // Флаг включения света boolean flag_light = false; // Флаг нажатия кнопки boolean flag_btn = false; // Флаг влажерсти boolean flag_hum = false; // Считчик таймера работы вентилятора unsigned int timer = 0; TMode mode = tmWait; TDisplayMode dmode = tdmTemp; boolean blink_stat = false; void loop () { unsigned long ms = millis(); int p = ms - ms1; // Считываем состояние кнопки if( digitalRead(btnPIN) == LOW ){ int n = 1; for( int i=0; i<9; i++ ){ if( digitalRead(btnPIN) == LOW )n++; delay(10); } if( n > 9 )flag_btn = true; delay(400); #ifdef DEBUG Serial.println("Button is press"); #endif }//end if // Проверка, что прошло не менее 0.5 сек if( p < 0 || p > 500 ){ cnt05++; ms1 = ms; // Считываем состояние фоторезистора a0 = analogRead(A0); if( a0 > 1000 )flag_light = false; else flag_light = true; // Каждые 10 секунд опрашиваем датчик DHT11 и меняем отображение дисплея if( cnt05%20 == 0 ){ h = dht.readHumidity(); t = dht.readTemperature(); // Если влажность изменилась на 3% или влажность превысила 85% if( h - h_arr[5] > 3 || h > 85 )flag_hum = true; // Исправлена ошибка из предыдущей версии for( int i=5; i>0; i--)h_arr = h_arr[i-1]; h_arr[0] = h; #ifdef DEBUG Serial.print("VAL: Temp="); Serial.print(t); Serial.print(" H="); Serial.print(h); Serial.print(" A0="); Serial.print(a0); Serial.print(" X="); Serial.print(cnt05); Serial.print(" TM="); Serial.print(timer); Serial.print(" MODE="); Serial.print(mode); Serial.print(" DMODE="); Serial.print(dmode); Serial.println(""); #endif // Переключаем дисплей switch( dmode ){ case tdmTemp : dmode = tdmHum; break; case tdmHum : dmode = tdmTimer; break; default: dmode = tdmTemp; }//end switch }//end if( cnt05%20 == 0 ) blink_stat = !blink_stat; SetStatusFSM(); }//end if( p < 0 || p > 500 ){ DisplayStatus(); }//end loop() /** * Функция отображение разных параметров */ void DisplayStatus(){ // Настройка отображения режима в int point = -1; switch( mode ){ case tmNeedPower: point = 0; break; case tmAutoPower: case tmManualPower: if( blink_stat )point = 0; break; } switch( dmode ){ case tdmTemp : ss.print((unsigned)t,point,50); break; case tdmHum : ss.print((unsigned)h,point,50); break; case tdmTimer: // Показываем минуты if( timer > 120 )ss.print((unsigned)(timer/120),point,50); // Показываем секунды else if( timer > 0 )ss.print((unsigned)(timer/2),point,50); // Показываем 0 else ss.print(0,point,50); // ss.print((unsigned)(a0/100),point,50); break; }//end switch } /** * Функция перехода автомата состояний */ void SetStatusFSM(){ switch(mode){ // Режим ожидания case tmWait : digitalWrite(ctrPIN, LOW); // Нажата кнопка if( flag_btn ){ timer = TIMER_PERIOD; mode = tmManualPower; } // Если сработал датчик влажности else if( flag_hum ){ timer = TIMER_PERIOD; mode = tmNeedPower; } break; // Состояние ожилания работы вентилятора case tmNeedPower: digitalWrite(ctrPIN, LOW); // Нажата кнопка if( flag_btn ){ mode = tmManualPower; } // Свет выключен else if( !flag_light ){ mode = tmAutoPower; } break; // Состояние "Вентилятор работает в автомате" case tmAutoPower: // Включить вентилятор digitalWrite(ctrPIN, HIGH); // Таймер считает if( timer > 0 )timer--; // Нажата кнопка if( flag_btn ){ mode = tmWait; timer = 0; } // Включился чвет else if( flag_light ){ mode = tmNeedPower; } // Таймер сработал else if( timer <= 0 ){ timer = 0; mode = tmWait; } break; // Состояние "Вентилятор работает в ручном режиме" case tmManualPower: // Включить вентилятор digitalWrite(ctrPIN, HIGH); // Таймер считает if( timer > 0 )timer--; // Нажата кнопка if( flag_btn ){ mode = tmWait; timer = 0; } // Таймер сработал else if( timer <= 0 ){ timer = 0; mode = tmWait; } break; } // Сбросить флани кнопка и влажность flag_btn = false; flag_hum = false; } Заранее всем благодарен за помощь.