Контролер вентилятора в ванной

Тема в разделе "Arduino & Shields", создана пользователем RFSlab, 22 сен 2015.

  1. RFSlab

    RFSlab Нуб

    На основе OLED часы на arduino собрал контролер вентилятора для ванной добавил данные из проекта Контроллер вентилятора для ванной на Arduino. в итоге получился вот такой скетч(см .вложение):
    [
    Я что то запутался с условиями срабатывания по датчику света. Алгоритм должен быть таким:
    1. проверяем включен ли свет - если Да то ничего не делаем;
    2. Если Нет - проверяем параметры датчика влажности, если влажность выше 53%, то включаем вентилятор;
    3. при снижении влажности менее 50% вентилятор выключаем.
    4. если при включенном вентиляторе включить свет, ждем 2 минуты;
    5 если свет после 2-х минут не выключен, выключаем вентилятор
    6. переходим к п.1.

    так вот включение и выключение реле по датчику влажности срабатывает хорошо, а вот с добавлением условий по датчику света, начинаются заковырки: при попытке нагнать влажность (дышим на датчик влажности) показания влажности на OLED экране замораживаются примерно 2-3 минуты. Затем при снижении показателя влажности отключается реле. когда датчик света определяет что свет включен реле по превышению влажности не включается, но и не выключается по истечении 2-х минут (см. п.4), а отключается только по достижению условия п.3.

    Ардуино начал заниматься не давно (буквально месяц), так что знаний пока очень мало. Помогите настроить этот скетч.
     

    Вложения:

  2. Mestniy

    Mestniy Гуру

    А можно скетч сюда вложить, если не трудно? Проще будет...;)
     
  3. RFSlab

    RFSlab Нуб

    так скетч во вложении прикреплен.
    Ну или, вот кусок кода:
    Код (C++):
      int valsense = analogRead(sense_PIN);
    if(valsense>350){                          // проверяем, если включен свет, то переходим дальше, иначе пропускаем до проверки влажности

        if(digitalRead(Relay_PIN)==HIGH){        // проверяем выключен ли вентилятор, если нет то включаем задержку на 2 минуты, иначе пропускаем
          Serial.println("time1");              // вывод в монитор порта о вкл. задержки
          uint32_t start_time = millis();       // делаем задержку на 2(60000) мин.
          while ((millis() - start_time) < 60000);//
        }
        int valsense1 = analogRead(sense_PIN);  // повторно считываем АЦП с фотодатчика
        if(valsense1>350){                      // проверяем...если больше, то вкл. вентилятор, иначе пропускаем

          digitalWrite(Relay_PIN, LOW);        // выкл. вентелятор
        }

    }

      else{                                                     // проверка влажности
        if(h > 53){                                           // проверяем если влажность больше то
          digitalWrite(Relay_PIN, HIGH);        // вкл. вентелятор
        }
      else if(h < 50){                                       // проверяем если влажность меньше то
          digitalWrite(Relay_PIN, LOW );         // выкл. вентелятор
    }
    }
    }
     
    Последнее редактирование: 23 сен 2015
  4. DrProg

    DrProg Вечный нерд

    Вот это:
    Код (C++):
          uint32_t start_time = millis();       // делаем задержку на 2(60000) мин.
          while ((millis() - start_time) < 60000);//
    то же самое что delay(60000); то есть в это время программа останавливается и тупо ждет ничего не делая.

    Нужно полностью переделать концепт, снимает показания со всех датчиков (можно с некоторой частотой с помощью millis() и исходя из полученных данных о свете и влажности что то предпринимать. У вас же одно считывает и зависает не считав второго.
     
    ИгорьК нравится это.
  5. RFSlab

    RFSlab Нуб

    Спасибо за ответ, теперь потихоньку начинаю понимать почему не работает. Дело осталось за малым, узнать как выполнить данную концепцию, знаний катострафически не хватает ;). Не хватает на форму песочницы, что там новички задавали свои вопросы...
     
    Последнее редактирование: 23 сен 2015
  6. RFSlab

    RFSlab Нуб

    так как знаний пока не хватает, нашел другой проект с нужными мне функциями :) Применение Arduino — управление вентилятором в ванной взял от туда нужные куски кода (практически весь код) и заменил у своем скетче. То что получилось см. во вложении. На работе проверил скетч В Arduino 1.6.5 без подключения самой ардуины, всё скомпилировалось без ошибок.
    Но опять же не всё так гладко как хотелось бы, да еще хуже :(. Дома загрузил этот скетч в ардуину, точнее попытался через Ардуину Уно загрузить в Ардуину Про мини, выдает ошибку загрузки (avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0xb8 Проблема загрузки на плату. Для достижения дзен, курить http://www.arduino.cc/en/Guide/Troubleshooting#upload .), хотя вчера весь вечер всё нормально загружалось, после этого, до сегодняшнего момента, ни кто и ничего с этой Ардуиной Про ничего не делал, короче она была рабочая. Пробывал её же прошить через USB переходники, всё равно не прошивает. Ну думаю прошью новый скетч в Ардуино Уно, прошилось нормально, но на экране кроме двоеточий работы часов (без самих цифр, просто на черном экране мигает двоеточие). Прошил старый скетч, часы и значения температуры и влажности показывает нормально, опять прошил в Уно новый скетч, опять показывает двоеточие. Подкорректировал новый скетч и вот тут случилось страшное :( Уно перестал прошиваться, выдает ошибку "avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x00".
    Короче я уже не знаю что делать, я панике. Посмотрите пожалуйста, может быть что то не так в новом скетче написано, что он ломает ардуинки???? В винде com порт Ардуины определяется правильно.
    Что-то не везет мне этим проектом :(
     

    Вложения:

    Последнее редактирование: 24 сен 2015
  7. Mestniy

    Mestniy Гуру

    Вам быстрее помогут, если вы скетч
    Код (C++):
    сюда выложите
    а не во вложение
     
  8. Mestniy

    Mestniy Гуру

    А вообще мне кажется что это проблемя общения МК с Пк. но это чисто мое предположение. У вас есть схема пдключения к арде?
    А вообще попробуйте 1) Дрова поменять. 2) Проверить COM-порт на работоспособность. 3) Если сбой произошол после заливки, то попробйте TX и RX коротнуть(должно сбросится)...
    Ну если не поможет, скинте пожалуйста схему, и вложите код прямо сюда.
    Заранее спасибо.
     
    RFSlab нравится это.
  9. Mestniy

    Mestniy Гуру

    Ну или пробуйте сброс сделать(с помощью ресет). Если интересно могу написать) Хотя больше всего я грешу на дрова. далите их к едрени фени и установите обратно... По моему должно пойти... Ну если нет, то сброс делать(с помощью reset)...
     
    Последнее редактирование: 25 сен 2015
  10. RFSlab

    RFSlab Нуб

    Код (C++):
    int hidr = 0;
      unsigned long period = 60000*20;
      unsigned long time_dif = 0;
      int LightPin = 9; //Датчик фоторезистора подключен к цифровому пину номер 12
      int RedLedPin = 11; //Датчик красного светодиода подключен к цифровому пину номер 11
      int GreenLedPin = 10; //Датчик зеленого светодиода подключен к цифровому пину номер 10
      int VentPin = 6; //Датчик реле (включение вентилятора) подключен к цифровому пину номер 7
      boolean vent = 0;
      boolean Hidrvent = 0;
      boolean Lightvent = 0;
      boolean Light = 0;
      boolean PrevLight = 0;
      boolean NextLight = 0;
      boolean bool1 = 0;
      boolean bool2 = 0;
      unsigned long curMillis = 0;
      unsigned long LightcurMillis = 0;
      unsigned long LightVentMillis = 0;
     
     
    //Блок настроек, выполняется однократно
    void setup()
    {                                                                   // Начало инициализации блока
      Serial.begin(9600);                                // устанавливаем скорость обмена с компьютером
     
      pinMode(VentPin, OUTPUT);
      pinMode(RedLedPin, OUTPUT);
      pinMode(GreenLedPin, OUTPUT);
      pinMode(LightPin, INPUT);
     
    void loop() {                                                                                        // Начало инициализации блока
     
      NextLight = !digitalRead(LightPin);
     
      if (NextLight == 1)
      {
          vent = 0;
          Lightvent = 0;
          if (NextLight != PrevLight) PrevLight = NextLight;                // изменение состояния освещения
      }
      else
      {
        if (PrevLight == 1)
        {
          time_dif = millis() - LightcurMillis;                                   //фиксируем время работы вентилятора из-за света
          if (vent == 0)
          {
            vent = 1;
            LightcurMillis = millis();
            Lightvent = 1;
            //if (NextLight != PrevLight) PrevLight = NextLight;
          }
          else if ((millis() - LightcurMillis) > period)
          {
            vent = 0; ;                                                                         //если вентилятор работает больше времени работы после выключения света — выключаем вентилятор
            Lightvent = 0;
            if (NextLight != PrevLight) PrevLight = NextLight;
          }
         
        }
       
        if (!Lightvent && (hidr >= 53) )
        {
          vent = 1;                                                                          //если влажность больше 53% включаем вентилятор
          Hidrvent = 1;
        }
        else if (!Lightvent && (hidr < 50))
        {
          vent = 0;                                                                         //если влажность меньше 50% выключаем вентилятор
          Hidrvent = 0;
        }
      }
     
      //фиксируем состояное выходых пинов
       digitalWrite(VentPin, vent);
       digitalWrite(GreenLedPin, Lightvent);
       digitalWrite(RedLedPin, Hidrvent);
      delay(1000);
    }
     
  11. RFSlab

    RFSlab Нуб

    В том то и дело что COM порт Ардуины определяется нормально, значит по идее дрова нормально стоят. ти тем более я сначало через эту Arduino UNO прошивал Pro Mini, потом Nano (правда без USB) всё нормально прошивалось, а потом в один день перестали прошиваться чертез UNO и Pro Mini и Nano. 3 раза прошил UNO (сначало новым скетчем (не отображает время), потом старым (отображается на экране все нормально), подкорректировал новый и прошив опять в UNO, опять не отображается время) и всё, потом UNO перестал прошиваться. Такое чувство что что то в новом скетче затесалось...

    Вечером домой приду попробую дрова переставить, вдруг всё таки поможет...

    Да и, как сделать сброс через Reset?
     
  12. Mestniy

    Mestniy Гуру

    Сброс через Reset:
    1) Подключаем Ардуино к пк.
    2) Ждем секунд 30.
    3) Отключаем USB.
    4) Зажимаем кнопку Reset на плате.
    5) Неотпуская Reset подключаем USB.
    6) И в это время производим заливку нового скетча.
    ВНИМАНИЕ! Отключить Reset можно только тогда, когда скетч начал заливаться.
    После этого пробуем через UNO прошивать другие контроллеры.
     
  13. RFSlab

    RFSlab Нуб

    Коротнул TX и RX на UNO и всё нормально прошилось, спасибо за помощь!!!
     
    Последнее редактирование: 25 сен 2015