В чем проблема? РЕШЕНО.

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

Метки:
  1. Flopik

    Flopik Нерд

    возникла проблема:
    и она следующего характера: дуня меряет температуру, но при попытке управлять реле согласно показаниям, дуня артачится. При этом исправно высвечивает сообщение "холодно" при уменьшении температуры ниже заданного. Релле в простой програмке исправно дергает контактами . то есть, все исправно , все цело, блок питания справляется. Не ясно, почему все. работающее в отдельности в куче не работает( я про программу).
     
  2. AlexKooper

    AlexKooper Нуб

    digitalWrite(10,HIGH); вижу, а где digitalWrite(10,low);?
     
  3. Flopik

    Flopik Нерд

    Я пытался в void setup задать 10 пин как закрытый, но он там закрывается, а в функции (ЕСЛИ<25 )все равно не открывается. При этом сообщение " XOLODHO" отображается или нет, в зависимости от температуры.То есть половина функции ЕСЛИ работает, а вторая нет.Я пытался убрать вывод сообщения и оставил только открывание 10 го пина. Все равно не включается.При этом заметил, что не зависимо, где стоит функция digitalWrite, хоть в SETUP хоть в LOOP, выполняется один раз при включении и потом программа на изменение температуры не реагирует. Если стоит и в SETUP и в LOOP, то 10пин встает в состояние, заданое первым, а при изменении температуры не выполняет условий перехода во второе состояние.
     
  4. imMan

    imMan Нерд

    А relay shield не с обратной логикой?
    У меня такой, я в setup задаю HIGH, а при наступлении события LOW
     
  5. Flopik

    Flopik Нерд

    суть в том,что : if(sensors.getTempCByIndex(0)<25)
    {myGLCD.setFont(SmallFont);
    myGLCD.print( "XOLODHO.", 15,30);
    digitalWrite(10,HIGH);}
    здесь не работает именно digitalWrite(10,HIGH); текст отображается корректно, в зависимости от показаний. Но 10 пин состояния не меняет. ПАЧАМУУУ!!!??
     
  6. imMan

    imMan Нерд

    Когда ардуина стартует реле сразу включается?
     
  7. Flopik

    Flopik Нерд

    встает в состояние, прописанное в digitalWrite и больше не меняется.
     
  8. imMan

    imMan Нерд

    Попробуйте в setup digitalWrite(10,HIGH), а в программе digitalWrite(10,LOW),мой шилд именно так и работает, только у вас в программе только одно состояние реле, второго не видно, или это не весь код?
     
  9. AlexKooper

    AlexKooper Нуб

    Реле в простой программе исправно дергает контактами? по задержке в цикле клацает? В эту простую программу добавляйте блоки своей программы, и смотрите, с какого момента перестаёт клацать (пусть клацает не по температуре, а по циклу, срабатывание по условию закомментить (только само срабатывание пина). И поставьте размыкание , если условие не выполнено.
     
  10. buregon

    buregon Нуб

    Ответили верно, осталось убедить в этом автора топика)
    Смотри, логика программы простая, разберем на пальцах :) У тебя идет проверка
    Код (Text):

      1. Если ТЕМПЕРАТУРА меньше 25
          то:
          написать ХОЛОДНО
          включить реле
      2. подождать 5 секунд
      3. очистить экран
      4. перейти к пункту 1.
     
    а надо
    Код (Text):

      1. Если ТЕМПЕРАТУРА меньше 25
          то:
          написать ХОЛОДНО
          включить реле
    >  иначе:
    >  выключить реле
      2. подождать 5 секунд
      3. очистить экран
      4. перейти к пункту 1.
     
    На экране у тебя значения меняются штатно только потому, что ты сбрасываешь дисплей в конце каждого цикла(команда myGLCD.clrScr()), а вот релюшку ты только поднимаешь, опускать забыл.
    И проверь, действительно ли у тебя реле включается по HIGH, а выключается по LOW, может быть наоборот
     
  11. Flopik

    Flopik Нерд

    Всем доброго утра. Там написано выше, что состояние пина 10 я пытался задавать в void setup и уже по показаниям термометра его менять на противоположеное в функции ЕСЛИ. Даже тогда, релле встает в положение заданое в void setup а по условиям ЕСЛИ не меняется. При чем текст реагирует на изменение температуры. Когда держу датчик в руках, он не отображается (Т>25). Вопрос по тому и возник: если напряжения хватает и на релле и не дуню, то почему половина ЕСЛИ выполняется.а вторая-нет. Причем выполнение не половинчатое само по себе.Я убирал отображение текста , компилировал, ставил его вторым при выполнении условий, после digitalWrite(10,HIGH) по любому текст реагирует на температуру, а пин-нет.
     
  12. imMan

    imMan Нерд

    Попробуйте вместо реле светодиод подключить, может с реле что не так
     
  13. Flopik

    Flopik Нерд

    Так реле по программе
    дергается исправно.Да и на самом реле есть светодиод, отображающий состояние реле.
     
  14. Flopik

    Flopik Нерд

    Если пин задан как ВЫХОД , дуня сама по умолчанию задает его состояние( закрыто, открыто)?
     
  15. imMan

    imMan Нерд

    В своей программе в setup после pinmode поставьте digitalWrite(Relay,HIGH)
     
  16. buregon

    buregon Нуб

    И все же попробуй так. Да, у тебя в проверке используется 4 пин, а в программе - 10. Точно не запутался в выходах?
    Если не запустится - попробуй перекинуть реле на другой порт, может десятому карачун пришел...

    Код (C++):
    #include <LCD5110_Basic.h>
    #include <OneWire.h>
    #include <DallasTemperature.h>

    // Data wire is plugged into port 2 on the Arduino
    #define ONE_WIRE_BUS 11
    #define RELE1=10

    // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
    OneWire oneWire(ONE_WIRE_BUS);

    // Pass our oneWire reference to Dallas Temperature.
    DallasTemperature sensors(&oneWire);
    LCD5110 myGLCD(3,4,5,6,7);
    extern uint8_t SmallFont[];
    extern uint8_t MediumNumbers[];

    void setup(void)
    {
      myGLCD.InitLCD();
      pinMode(10,OUTPUT);
      digitalWrite(10,HIGH);
    }

    void loop(void)
    {
      sensors.requestTemperatures(); // Send the command to get temperatures
      myGLCD.setFont(MediumNumbers);
      myGLCD.printNumF( sensors.getTempCByIndex(0),2,CENTER,0);
      if(sensors.getTempCByIndex(0)<25)
      {
        myGLCD.setFont(SmallFont);
        myGLCD.print( "XOLODHO.", 15, 30);
        digitalWrite(10, HIGH);
      }
      else
      {
        myGLCD.setFont(SmallFont);
        myGLCD.print( "TEPLO.", 15, 30);
        digitalWrite(10, LOW);
      }
      delay(5000);
      myGLCD.clrScr();
    }
     
  17. Flopik

    Flopik Нерд

    СПАСИБО. Так заработало. Тогда получается, функция ЕСЛИ работала с пином не корректно без функции ИНАЧЕ?
     
  18. buregon

    buregon Нуб

    Корректно. Но без возврата. Т.е. он один раз поднимался в случайный момент времени после загрузки, и все.
     
  19. Flopik

    Flopik Нерд

    Ясно.СПАСИБО всем.
     
  20. MESS

    MESS Гик

    Посмотрите еще вариант без библиотеки <DallasTemperature.h>. Работает точно также.
    как эти варианты сравнить -какой более приемлемый ?
    Код (C++):
     //   Вариант    без библиотеки <DallasTemperature.h>
    #include <LCD5110_Basic.h>
    #include <OneWire.h>
    //#include <DallasTemperature.h>

     
    OneWire  ds(11);
    //#define ONE_WIRE_BUS 11
    #define RELE1=10

    LCD5110 myGLCD(3,4,5,6,7);
    extern uint8_t SmallFont[];
    extern uint8_t MediumNumbers[];

    void setup(void)
    {
      myGLCD.InitLCD();
      pinMode(10,OUTPUT);
      digitalWrite(10,HIGH);
    }

    void loop(void)
    {
      byte addr[8];
    if ( !ds.search(addr)) { ds.reset_search(); }
       ds.reset();
       ds.select(addr);  
       ds.write(0x44);  
      ds.reset();
      ds.select(addr);
      ds.write(0xBE);      

      float temperature =  (ds.read() | (ds.read()<<8)) / 16.0  ;

      //sensors.requestTemperatures(); // Send the command to get temperatures
      myGLCD.setFont(MediumNumbers);
      myGLCD.printNumF( temperature,/2,CENTER,0);
      //if(sensors.getTempCByIndex(0)<25)
      if (temperature <25 )
      {
        myGLCD.setFont(SmallFont);
        myGLCD.print( "XOLODHO.", 15, 30);
        digitalWrite(10, HIGH);
      }
      else
      {
        myGLCD.setFont(SmallFont);
        myGLCD.print( "TEPLO.", 15, 30);
        digitalWrite(10, LOW);
      }
      delay(5000);
      myGLCD.clrScr();
    }