Проверка реле.

Тема в разделе "Глядите, что я сделал", создана пользователем Mestniy, 30 дек 2015.

  1. Mestniy

    Mestniy Гуру

    Всем привет. Предлагаю скетч и программу проверки 42 реле. Причем, в этой программе присутствует управление паузой. Давно хотел такую сделать, только руки не доходили.
    Вот ссылка: https://drive.google.com/file/d/0B8VpMjGA5UYQYjJlcXFuWUkta00/view?pref=2&pli=1
     
    Viquis и Alex19 нравится это.
  2. Mestniy

    Mestniy Гуру

    Заранее прошу извинить за мой ломаный язык программирования. Нравиться расписывать. Да и компактно писать пока не умею. Готов выслушать претензии и предложения.:cool:
     
    Viquis нравится это.
  3. MESS

    MESS Гик

    В чем практическая польза такой задачи? Что именно проверяется? и 42 - это типы реле?
     
  4. Mestniy

    Mestniy Гуру

    Подключаете к меге 43(в первом сообщении опечатка) реле. И включаете и выключаете их через программу.
    Может кому полезно будет?
    Кто знает, когда такая мелочь может пригодиться
     
    Viquis нравится это.
  5. Alex19

    Alex19 Гуру

    Можно улучшить код, чтобы можно было назначать кол-во реле. Сделать код более удобным для поддержки расширения.
    1. Завести массив с пинами реле.
    2. В setup перебирать массив с пинами реле в цикле for.
    3. В цикле loop, добавить тот же цикл for и там непосредственно проверять пин реле.
    4. Можно уйти от delay

    Что это дает, возможность динамически назначать кол-во реле. Поддержка становится более легкой, Вам нужно изменить лишь в 1 месте код, а не в 43.
     
    Mestniy нравится это.
  6. Mestniy

    Mestniy Гуру

    Спасибо попробую.
     
    Viquis нравится это.
  7. Alex19

    Alex19 Гуру

    Вот примерно как, это выглядит

    Код (C++):
    #define RELAY_COUNT 6
    byte relayPins[RELAY_COUNT] = {2, 3, 4, 5, 6, 13};

    void setup()
    {
      for (byte i = 0; i < RELAY_COUNT; i++)
      {
        pinMode(relayPins[i], OUTPUT);
        digitalWrite(relayPins[i], HIGH);
      }
    }

    void loop()
    {
      for (byte i = 0; i < RELAY_COUNT; i++)
      {
        byte relayRead = digitalRead(relayPins[i]);
        if (relayRead == LOW)
        {
          digitalWrite(relayPins[i], HIGH);  
        }
        else if (relayRead == HIGH)
        {
          digitalWrite(relayPins[i], LOW);
        }
      }
    }
     
    Отрывают, через час скину вместе с Serial портом.
     
    Mestniy нравится это.
  8. MESS

    MESS Гик

    К сожалению это проверка работоспособности скетча, а не реле. Чтобы проверить реле нужно просто пропустить через его катушку ток. Желательно ток регулировать и измерять его мультиметром, тогда вы получите нужную информацию для узла подключения к пинам ардуино.
     
    Последнее редактирование: 30 дек 2015
  9. MESS

    MESS Гик

    Полезный была бы следующая конструкция на ардуино: подключашь реле (через интерфейс), а ардуино плавно "наращивает" ток в цепи до момента срабатывания реле, затем плвно снижает ток до момента отпусания. А на LCD показывает результаты теста. Возможны и другие варианты.
     
  10. Alex19

    Alex19 Гуру

    Собираем все вместе.

    Код (C++):
    #define RELAY_COUNT 6
    byte relayPins[RELAY_COUNT] = {2, 3, 4, 5, 6, 13};

    String brightness = "";
    boolean endDataPacket = false;

    int selectRelay = -1;

    void setup()
    {
      Serial.begin(9600);

      for (byte i = 0; i < RELAY_COUNT; i++)
      {
        pinMode(relayPins[i], OUTPUT);
        digitalWrite(relayPins[i], HIGH);
      }
    }

    void loop()
    {
      while (Serial.available() > 0) {  //если есть доступные данные
        char inChar = Serial.read();    //считываем байт
        if (inChar != ';')
        {
          brightness += inChar;         //собираем информацию в строку
        }
        else
        {
          endDataPacket = 1;            //если приходит ;, данные получены
        }
      }

      // Данные получены
      if (endDataPacket)
      {
        int dataInt = brightness.toInt();
        Serial.println(dataInt);
        // Ищем пин в массиве
        for (byte i = 0; i < RELAY_COUNT; i++)
        {
          if (dataInt == relayPins[i])
          {
             // Пин найден
             selectRelay = i;
             break;
          }
        }
     
        // Если пин найден
        if (selectRelay > -1)
        {
          byte relayRead = digitalRead(relayPins[selectRelay]);
          if (relayRead == LOW)
          {
            digitalWrite(relayPins[selectRelay], HIGH);  
          }
          else if (relayRead == HIGH)
          {
            digitalWrite(relayPins[selectRelay], LOW);
          }
          Serial.println("Relay Find");
        }
        else
        {
          Serial.println("Relay Not Find");
        }
     
        // Обнуляем данные
        endDataPacket = 0;
     
        brightness = "";
     
        selectRelay = -1;
      }
    }
     
    Отправляем к примеру "13;" программа инвертирует пин. С Вашей программой не заработало, кода не вижу, поэтому не знаю в чем причина
     
    Mestniy нравится это.
  11. Mestniy

    Mestniy Гуру

    Она и не заработает, потомучто у меня на паузе стоит символ ";", а на Выборе репе стоит ".".
     
    Viquis нравится это.
  12. Mestniy

    Mestniy Гуру

    Но спасибо за код. Буду обрабатывать и пробовать...
     
    Viquis нравится это.
  13. Alex19

    Alex19 Гуру

    Не за что, привел код, чтобы Вы увидели как это можно сделать более компактно и потихоньку переходили к более простому коду с точки зрения расширения.

    Удачи и всех благ в Новом году!