Первый опыт с ардуино, пара вопросов

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

  1. Alex_dv

    Alex_dv Нерд

    Доброго времени суток, вот приобрел arduino uno + некоторую обвязку(oled, твердотельное реле, датчик температуры). Устройство очень понравилось, все работает как задумано.

    Хотел спросить, допустимо ли подключать реле напрямую к пинам, как сделал я? и нормально ли, что на такую простую программу уходит 51 процент памяти? И можно ли через это реле подключать обогреватель на 1,5 - 2 кВт(хоть и указано 25 ампер, но все-таки боязно). Заранее спасибо

    Код (C++):
    #include "U8glib.h"


    U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9, 8);

    int run = 0;
    int sensorPin = A0;
    int i = 0;
    int time;




    void setup(void)
    {

      u8g.setColorIndex(1);

      pinMode(7, OUTPUT);
    }

    float sensor(void)   //метод считавает показания датчика
    {
      int reading = analogRead(sensorPin);
      float volt = reading * 5.0;
      volt /= 1024.0;
      return (volt - 0.5) * 100 ;

    }

    void loop(void)
    {

    float t = sensor();
    int tx = millis()/1000;

    if ((t > 21) && (t > 23))  //условие включения, гистерезис 2 градуса
    {
      digitalWrite(7, HIGH);
      run = 1;
    }
    if ((t < 21) && (t < 23))   //условие выключения
    {
      digitalWrite(7, LOW);
      run = 0;
    }


      time = millis()/1000 - 60*i; //обнуление числа секунд по достижении 60
      if (tx/60 > i ) ++i;


    char a[9]; char buf2[9];char buf3[9];



    sprintf (buf2, "%d", time);sprintf (buf3, "%d", millis()/60000);

    u8g.firstPage();
    do {
      u8g.setFont(u8g_font_unifont);
      u8g.drawStr(1, 12, "lamp status:");

      if (run == 0)   //показывает состояние нагрузки
      {
       u8g.drawStr(101, 12, "off");
      }
      else
      {
        u8g.drawStr(101, 12, "on");
      }

      u8g.drawStr(5, 30, "uptime:"); u8g.drawStr(60, 30, buf3); u8g.drawStr(81, 30, "m."); u8g.drawStr(100, 30, buf2); u8g.drawStr(119, 30, "s.");
      u8g.setFont(u8g_font_6x10);
      u8g.drawStr(5, 51, "Temp ="); u8g.setPrintPos(45, 51); u8g.print(t); u8g.drawStr(77, 51, "'C");
      delay(50);
    } while( u8g.nextPage() );


       delay(1000);

    }
     
     

    Вложения:

    Последнее редактирование: 30 ноя 2016
  2. rkit

    rkit Гуру

    Зависит от характеристик реле. С пина больше 20мА тока брать нельзя.

    Программа не простая, к ней подключена огромная библиотека для управления дисплеем.
     
  3. Alex_dv

    Alex_dv Нерд

    Спасибо! Почему то думал, что допустимый ток 40 мА, в даташите написано typCurrent 17 mA 5V.

    Поставил резистор на 1 кОм, реле работает стабильно.
     
  4. rkit

    rkit Гуру

    40 абсолютный максимум. Но рекомендуется 20, потому что если нагрузить несколько пинов на 40, то уже можно пожечь что-нибудь.
     
  5. olegoriy

    olegoriy Гик

    [​IMG]
    Вот такое реле питаю напрямую от пина ардуины.
    На свое же реле если указанно 25 ампер то 2 киловатта подключай смело. Если будет греться, то нужен радиатор.
     
    Последнее редактирование: 30 ноя 2016
  6. Flyfisherman

    Flyfisherman Нерд

    Реле на 25А должно без труда выдерживать 5КВт(при этом еще останется некоторый запас по току). Необходимость установки радиатора можно оценить запустив прибор на тестовый прогон, нагрев реле до 70-80 градусов норма и радиатор, в этом случае, никакой ненужен.
     
  7. Alex_dv

    Alex_dv Нерд

    Спасибо всем! Вот еще вопрос есть: хочу использовать два модуля - http://amperka.ru/product/troyka-rtc?utm_source=man&utm_campaign=troyka-rtc&utm_medium=wiki (Часы реального времени) и http://amperka.ru/product/troyka-barometer (Барометр).

    Как их подключить параллельно? Они просто уже распаяны на платах, а для параллельного подключения по i2c, как я понял, нужны общие подтягивающие резисторы.
     
  8. Alex_dv

    Alex_dv Нерд

    Подключил параллельно, без резисторов к искре мини. Все работает
     
  9. Alex_dv

    Alex_dv Нерд

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

    Вложения:

  10. Alex_dv

    Alex_dv Нерд

    изображение на дисплее меняется при нажатии кнопки(режим установки температуры).
    Код (C++):
    #include "U8glib.h"
    #include <Wire.h>
    #include <TroykaDHT11.h>
    #include <TroykaIMU.h>
    #include "TroykaRTC.h"
    #include <EEPROM.h>
    #include <avr/wdt.h>

    Barometer barometer;
    U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9, 8);
    DHT11 dht(6);  
    RTC clock;

    // размер массива для времени с учётом завершающего нуля
    #define LEN_TIME 12
    // размер массива для даты с учётом завершающего нуля
    #define LEN_DATE 12
    // размер массива для дня недели с учётом завершающего нуля
    #define LEN_DOW 12
    int run = 0;
    int temp = 21; //заданная температура
    boolean isTurnOn = true;  // включать ли нагрузку?
    boolean state = true;  // включен ли реле?

    void setup(void)
    {
     
      u8g.setColorIndex(1);
      dht.begin();
      clock.begin();
      // метод установки времени и даты в модуль вручную
      // clock.set(10,25,45,27,07,2005,THURSDAY);
      // метод установки времени и даты автоматически при компиляции
        clock.set(__TIMESTAMP__);
      barometer.begin();
      pinMode(2, OUTPUT);
      wdt_enable(WDTO_4S);
      pinMode(A0, INPUT);
    }

    void loop(void)
    {
     
      boolean isButtonUp = digitalRead(12); //нажата ли кнопка сейчас?
    if (isTurnOn == true && isButtonUp == false)
    {  
        delay(10);  
        if (isButtonUp == false)
        {
          state = !state;    
        }
    }
      // запоминаем последнее состояние кнопки
      isTurnOn = isButtonUp;
     
     
      int x;
      char time[LEN_TIME]={0};
      // массив для хранения текущей даты
      char date[LEN_DATE]={0};
      // массив для хранения текущего дня недели
      char dow[LEN_DOW]={0};
      clock.read();
      clock.getTimeStr(time, LEN_TIME);
      // сохраняем текущую дату в массив date
      clock.getDateStr(date, LEN_DATE);
      // сохраняем текущий день недели в массив dow
      clock.getDOWStr(dow, LEN_DOW);
     
      dht.read();
      float pressure = barometer.readPressureMillibars();
      float mmhg = pressure * 0.75006 + 22;
      int press = mmhg;
      int t = dht.getTemperatureC();
      char buf1[9]; char buf2[9];char buf3[9];char buf4[9];char buf9[9];
      sprintf (buf1, "%d", dht.getTemperatureC());sprintf (buf2, "%d", dht.getHumidity());sprintf (buf9, "%d", temp);
      sprintf (buf3, "%d", press);sprintf (buf4, "%d", run);
     
      if (state == true)
      {
       temp = analogRead(A0) / 50 + 15;
      }

      if (t >= (temp + 1))  //условие включения, гистерезис 2 градуса
      {
        digitalWrite(2, LOW);
        run = 0;
      }
      if (t <= (temp - 1))   //условие выключения
      {
        digitalWrite(2, HIGH);
        run = 1;
      }
     
    u8g.firstPage();
    do {
    if (state == true )
    {
      u8g.setFont(u8g_font_unifont);
      u8g.drawStr(1, 10, "set temp:");
      u8g.drawStr(60, 40, buf9);u8g.drawStr(80, 40, "C");
    }
    else
    {  
    u8g.setFont(u8g_font_6x10);
    u8g.drawStr(1, 10, time);u8g.drawStr(58, 10, date);
    u8g.drawStr(1, 28, "heater state:");u8g.drawStr(90, 28, buf4);
    u8g.drawStr(1, 39, "Pressure:");u8g.drawStr(80, 39, buf3);u8g.drawStr(105, 39, "mm");
    u8g.drawStr(1, 50, "Temp: "); u8g.drawStr(80, 50, buf1); u8g.drawStr(105, 50, "C");
    u8g.drawStr(1, 60, "Humidity: "); u8g.drawStr(80, 60, buf2);u8g.drawStr(105, 60, "%");
    }
    } while( u8g.nextPage() );
     
    wdt_reset();

    delay(400);
     
    }
     
     

    Вложения:

  11. Alex_dv

    Alex_dv Нерд

    Всем привет! Прошло больше года, твердотельное реле залипло в полуоткрытом положении(пропускает около 3 А), хотя установлено на радиатор через термопасту и нагрев не превышал 60 градусов, и oled дисплей начал деградировать, синяя область(на фото пока не заметно). Т.е. наверное для мощных нагрузок SSR лучше не применять.
     

    Вложения:

    • IMG_0574.jpg
      IMG_0574.jpg
      Размер файла:
      1,8 МБ
      Просмотров:
      351
  12. timofeevvas

    timofeevvas Нерд

    Библиотека кушает много места, а спринтф - будет активно хомячить память при работе.
     
  13. Sencis

    Sencis Гик

    При работе с нагревательными приборами часто, даже достаточно сильные реле выходят из строя не знаю почему возможно потому что у нас всегда низкое напряжение и через реле идёт большой ток.
     
  14. timofeevvas

    timofeevvas Нерд

    По поводу твердотелок не скажу - не разбирал. Но горелые механические разбирал. Там часто контактные площадки не ровные, а похожи на вафли - соответственно большая часть контактной площадки не используется. Ну а нагревательные приборы потребители весьма мощные и с большими токами, так что может быть получается огромная плотность тока в контакте - и они радостно горят. =(
    Р.S. Рекламу\антирекламу фирм делать не буду, но такие вафли я видел в том числе и на именитых производителях. Это для тех кто будет кричать "купи себе нормальные реле, а не хлам с АлиЭкспресса"
     
  15. Alex_dv

    Alex_dv Нерд

    не реклама(хотя скорее антиреклама), но скажу что у меня это случилось с реле Crydom d2425(280 в 25 а) из чипидипа и нагреватель имеет мощность 1700 вт(т.е. ток 8 ампер)
     
  16. b707

    b707 Гуру

    Закон Ома отменили? :) Чем ниже напряжение - тем НИЖЕ ток при той же нагрузке.
    Вы путаете причину и следствие. Контакты превратились в "вафли" именно потому, что реле уже горелые. Это называется электроэрозия контактов. Разберите новое реле - увидите, что контакты ровные.
     
  17. Sencis

    Sencis Гик

    Ваши идеи почему импульсные БП работают от твердотельных реле долго хотя они могут увеличивать и уменьшать потребление тока из сети а нагревательные приборы обязательно что-нибудь сожгут? Ведь там нет реактивных токов которые они не любят это спираль но я когда мерил мультиплетом замечал что при скачках напряжения ток растёт!
     
  18. b707

    b707 Гуру

    ну хотя бы тот очевидный факт, что импульсники обычно имеют мощность 100-200 Вт, редко 500, а нагреватели - 1.5- 2 КВт :)
    В строгом соответсвии с законом Ома :) Вот если б вы сказали, что ток растет при просадках напряжения- я б вам не поверил.
     
  19. timofeevvas

    timofeevvas Нерд

    Слишком регулярная решетка для электроэррозии на мой взгляд. Слишком уж прямые углы и постоянное расстояние. Хотя и не отрицаю что это м.б. следствием
     
  20. timofeevvas

    timofeevvas Нерд

    А по поводу "Ниже напряжение - ниже ток", а полагаю автор исходного заявления имел ввиду что нагреватели чаще бывают с низким напряжением и высокими токами. В смысле что нагреватель например на 48 Вт чаще будет в виде устройства на 12 В 4 А, нежели 48 В 1 А.