Вопрос на засыпку Помогите пожалуйста разобраться!

Тема в разделе "Arduino & Shields", создана пользователем sanik, 11 янв 2016.

  1. sanik

    sanik Гик

    Доброго время суток! Так как все части кода проверены и работают, привожу кусок где условия выполняются, проверено по прописанных для этих целей звукам, прежде чем писать условия делал комментарии, из них понятно что должно происходить подписана каждая строчка. По логике вентиляторы в функции void Pid() при высокой температуре или влажности должны работать оба Даже пробовал тупо ставить в HIGH Но на самом деле работает только один fanBlowing входной вентилятор А вытяжной fan ни при каких условиях не включается. За отсутствием датчика dht временно, для экспериментов завел две переменные, температуры и влажности и менял их. Посмотрите пожалуйста ведь оно все работает, условия выполняются, но вентилятор не включается может я чего упустил?
    Так как код большой сразу можно пропускать меню, прогрев, чтение ошибки датчиков Изгаляться начинает при включенном выключателе в ванной или туалете. В чем еще может быть причина? Сам вентилятор рабочий так как работает во всех остальных функциях в прогреве тоже работает.
     
  2. sanik

    sanik Гик

    Начало
    Код (C++):
    void loop()
    {

        }
        */

        //////////////////////////////////////////////////////////////////////////////////////// /
       //==============================       Прогрев          ====================//

        if (value_Y > 780) // кнопка вверх  waite
        {
          beeper(10);
          currentTime = millis(); // считываем время с момента включения
          if (flagShine == 0 && flagToilet == 0)// проверяем свет если выключен и в туалете и в ванной
          {
            while (millis() - currentTime <= (heatingTime + (timeHeat * 60000))) // таймер прогрева крутим цыкл пока не выйдет время
            {
              beeper(50);
              servoToiletIN.attach(6);
              servoToiletIN.write(35);
              delay(200);//ждем серву
              servoToiletIN.detach();
              OpenShine();  // открываем заслонки в ванной
              sensors.requestTemperatures();
              tempC = sensors.getTempCByIndex(0); //получаем температуру с датчика
              flagheating = 1; // ставим флаг
              //==============================PID====================//
              if (abs(tempC) > 0.1)//если текущая температура больше на 0,1 градус
              {
                Input = tempC; // присваиваем её на вход пид регулятора Input Входящий сигнал, который мы контролируем
              }
              Setpoint = sp; // заданая температура на уставки пид регулятора Setpoint Заданное значение контролируемого сигнала
              myPID.Compute(); // запускаем пид Расчет выходного сигнала
              delay(20);
              //if (!Output == 0.00)
              // {
              val = map(Output, 1, 255, 20, 170); // выход пид регулятора мапим в градусы поворота сервы Output Выходящий сигнал, которым мы управляем
              if (abs(val - val_old) > 4) // Сравниваем текущий выход пида со старым уголом поворота если больше 4
              {
                val_old = val;  // записывем новое значение
                myservo.write(val);//управляем сервой
                delay(200);
              }
              //}
              else
              {
                val = val_old; // иначе оставляем в том же месте
              }

       

        else if (value_Y < 290)  // кнопка вниз  waite
        {
          beeper(10);
          lcd.backlight();              // включаем подсветку
          TimeLCDOff = currentTime;     // в TimeLCDOff записываем новое значение
        }

     
     
    Последнее редактирование: 15 янв 2016
  3. sanik

    sanik Гик

    Продолжение если лень просматривать то вот с этого места выскакивает проблемма
    Код (C++):
        ///////////////////////////////////////////////////////////////////////////////////////////
        if (flagShine == 0 && flagToilet == 0)// проверяем состояние флагов
        {
          flagheating = 0; // снимаем флаг
          NoLight(); // уходим в функцию NoLight
        }
       

    }
     
    Последнее редактирование: 15 янв 2016
  4. sanik

    sanik Гик

    Собственно капризная функция
    Код (C++):
    void Pid()
    {
     }
     
    Последнее редактирование: 15 янв 2016
  5. 9xA59kK

    9xA59kK Гик

    С таким количеством delay() как у вас вообще ПИД работает? Я считаю что он не будет работать или точнее будет, но очень очень очень очень тупо и медленно. Предлогаю избавится от этой ( delay() ) функции.
     
    Последнее редактирование: 12 янв 2016
  6. sanik

    sanik Гик

    Да работает и меня устраивает скорость реагирования от сервы разве можно ждать большей скорости???
     
    Последнее редактирование: 12 янв 2016
  7. sanik

    sanik Гик

    Попутно появился вопрос если в функции выставить flag=1 он при выходе из функции сохраниться? И можно ли из одной функции минуя луп вызвать другую функцию?
     
  8. vvr

    vvr Инженерище

    как пропишите в коде так и будет
     
    sanik нравится это.
  9. sanik

    sanik Гик

    Спасибо а переход из функции в другую функцию тоже выполняется? Или при выходе с одной сразу в луп ?
     
  10. vvr

    vvr Инженерище

    и здесь тоже самое - как напишите логику работы мк так он и будет дубасить
     
  11. sanik

    sanik Гик

    Ок! Очень признателен!
     
  12. sanik

    sanik Гик

    Задумался почему серва в пиде реагирует быстро Если внимательно посмотреть на код то в условие где есть delay не всегда есть вход в этот цикл а значит лишней эта задержка не бывает она нужна лишь для того чтобы дождаться когда серва изменит угол а если она не меняла положении то и задержки нет, где то читал что делают расчет времени нужного для поворота сервы с о старого угла на новый. Буду признателен если поможете конкретным примером как его здесь применить. И расскажете как определять в каком угле находиться серва чтоб в остальных функция можно было бы перед изменение угла сервы поставить условие типа того если угол не тот который должен быть то заходим поправляем тогда будет замечательно зашли повернули серву и больше к ней не обращаемся пока не появиться необходимость повернуть её в новый угол.
     
  13. 9xA59kK

    9xA59kK Гик

    В обычной серве без обратной связи это сделать не получится, конечно если только ее разобрать и использовать внутренний датчик положения, собранный на переменном потенциометре. В инете есть примеры, но это совсем крайний случай. Если нужна такая точность то используйте шаговый двигатель или двигатель с энкодером и редуктором . Так же можно использовать в качестве датчика положения рычага выходного вала - аналоговый датчик Холла.
     
    Последнее редактирование: 21 янв 2016
  14. sanik

    sanik Гик

    Спасибо! Просто я мельком встречал но не разобрался, и не могу теперь вспомнить пример где заводиться переменная текущего положения угла и с её помощъю просчитывалось время нужное для доворота угла то есть чем меньше новый угол тем меньше делалась задержка через millis
     
  15. 9xA59kK

    9xA59kK Гик

    Опишите логику работы устройства как вы его представляете. А то, что то я не совсем понял ,что оно должно в итоге делать. Регулировать температуру или управлять вентиляцией чего то.?
     
  16. sanik

    sanik Гик

    Это устройство пока отложено в сторону Уже работает есть мелкие недочеты будет время займусь исправлять. На самом деле выполняет роль вентиляции с подогревом холодного воздуха если вдруг на улице холодно отслеживает повышенную влажность + следит за выключателями защита от забывчивости.
     
  17. Pahan

    Pahan Нуб

    ПОМОГИТЕ разобраться великие ардуинщики
    Есть радиопульт на 433 Мгц. Есть приемник на 433 под ардуино. Выход приемника подключен к esp-8266 b и светодиод например.
    При нажатии кнопки пульта 1 раз -светодиод загорается. При повторном нажатии этой же кнопки на радиопульте - светодиод гаснет. В таком скетче я разобрался. Только вот при удержании кнопки радиопульта - светодиод мигает.
    Как сделать, что бы хоть при однократном нажатии кнопки радиопульта, хоть при длительном(любое время) с последующим отпусканием - светодиод включился. А при повторном нажатии этой же кнопки радиопульта - хоть при однократном нажатии кнопки радиопульта, хоть при длительном(любое время) с последующим отпусканием - светодиод выключился.
    Вот управлять так с 2 кнопками радиопульта тоже научился, а с одной кнопкой -никак не могу.
    Мне бы как то по доступнее, если можно

    #include <RCSwitch.h>

    RCSwitch mySwitch = RCSwitch();
    int led = 12;

    void setup()
    {
    pinMode(12, OUTPUT);
    mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin #2
    }

    void loop()
    {
    if (mySwitch.available())
    {
    unsigned long value = mySwitch.getReceivedValue();
    Serial.print(value);
    switch (value) {
    case 0:
    Serial.println(" - Unknown encoding");
    break;
    case 2276802:
    digitalWrite(led, !digitalRead(led));
    break;
    default:
    Serial.println(" - EROR");
    }
    mySwitch.resetAvailable();
    }
    }
     
  18. neyasbltb_88

    neyasbltb_88 Нуб

    Нужно ввести флаг на нажатие кнопки. Как только нажали, светодиод загорелся, далее устроить ннбольшую задержку 100-200мс, и если кнопка все еще нажата, то флаг переключился. Затем, при следующем прохождении loop, светодиод уже не будет тухнуть, ведь флаг активен. Ну и в начале цикла отслеживать отпущенную кнопку, и при этом сбрасывать флаг.
     
  19. mcureenab

    mcureenab Гуру

    Наверное пульт при удержании кнопки шлет команду повторно с некоторым периодом t.

    Можно заметить время команды и если следующая команда пришла раньше времени (несколько периодов t), команду игнорировать, а время заметить снова. Если времени прошло больше, команду выполняем, и время замечаем.
     
  20. mcureenab

    mcureenab Гуру

    Я так поимаю пульт не шлет команду отбоя кнопки. Флаг никогда не сбросится.