Контроллер управления вытяжным вентилятором

Тема в разделе "Посоветуйте детальки", создана пользователем dwk26111974, 20 июл 2017.

  1. dwk26111974

    dwk26111974 Гик

    Уважаемые Амперщики. Прошу помочь советом. Очень заинтересовал проект по контролю влажности разработанный уважаемым автором.
    Ссылку привожу:
    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;

    }

    Заранее всем благодарен за помощь.
     
  2. null

    null Нерд

    Длинные скетчи надо прятать в спойлер.
     
  3. DetSimen

    DetSimen Гик

    И обращаться сначала к аффтару.
     
  4. vvr

    vvr Инженерище

    и код нормально вставить отформатировав, вроде не первый год на форуме