Всем привет. Предлагаю скетч и программу проверки 42 реле. Причем, в этой программе присутствует управление паузой. Давно хотел такую сделать, только руки не доходили. Вот ссылка: https://drive.google.com/file/d/0B8VpMjGA5UYQYjJlcXFuWUkta00/view?pref=2&pli=1
Заранее прошу извинить за мой ломаный язык программирования. Нравиться расписывать. Да и компактно писать пока не умею. Готов выслушать претензии и предложения.
Подключаете к меге 43(в первом сообщении опечатка) реле. И включаете и выключаете их через программу. Может кому полезно будет? Кто знает, когда такая мелочь может пригодиться
Можно улучшить код, чтобы можно было назначать кол-во реле. Сделать код более удобным для поддержки расширения. 1. Завести массив с пинами реле. 2. В setup перебирать массив с пинами реле в цикле for. 3. В цикле loop, добавить тот же цикл for и там непосредственно проверять пин реле. 4. Можно уйти от delay Что это дает, возможность динамически назначать кол-во реле. Поддержка становится более легкой, Вам нужно изменить лишь в 1 месте код, а не в 43.
Вот примерно как, это выглядит Код (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 портом.
К сожалению это проверка работоспособности скетча, а не реле. Чтобы проверить реле нужно просто пропустить через его катушку ток. Желательно ток регулировать и измерять его мультиметром, тогда вы получите нужную информацию для узла подключения к пинам ардуино.
Полезный была бы следующая конструкция на ардуино: подключашь реле (через интерфейс), а ардуино плавно "наращивает" ток в цепи до момента срабатывания реле, затем плвно снижает ток до момента отпусания. А на LCD показывает результаты теста. Возможны и другие варианты.
Собираем все вместе. Код (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;" программа инвертирует пин. С Вашей программой не заработало, кода не вижу, поэтому не знаю в чем причина
Не за что, привел код, чтобы Вы увидели как это можно сделать более компактно и потихоньку переходили к более простому коду с точки зрения расширения. Удачи и всех благ в Новом году!