Официальный сайт компании Arduino по адресу arduino.cc
Система мониторинга и управления на базе Arduino
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Подскажите кто нибудь
Нужно сделать по UART интерфейсу управление удаленными объектами. Делается это пока что в тестовом режиме. Поэтому используется ардуино.
Тема такая нужно придумать схему и запрограммировать микроконтроллер для того чтоб он могу управлять удаленными объектами. Суть в следующем, когда генератор работает на пульт диспетчера передается сигнал и горит лампочка норма сети, если сеть падает тогда автоматически должно переключиться на работу от генератора, а на пульте диспетчера загореться лампочка генератор. Если генератор не работает тогда на пульт выводиться сигнал авария. также с пульта должна быть возможность включать объект в эти режимы.
сейчас я нашел способ как по UART можно связать два ардуино Uno R3 и Pro Mini.
Но осталась проблема.
1) Не могу понять как кнаписать программу которая бы снимала сигналы с лампочек которые сигнализируют о норме сети, работе генератора и аварии генератора?
2) Как написать программу которая бы работала следующим образом у диспетчера два тумблера, 1 - запуск генератора, а второй для запрет запуска генератора.
Код для связи двух ардуин по UART
UNO int d, d2;//задержки String Var; String A1T1="0", A1T2="0", A2T1="0"; int pin_inter=9;//not use 13,12,11,10 for ithernet shield void setup() { Serial.begin(9600); d=500; d2=250; attachInterrupt(0, serialwait, RISING);//функция прерывания pinMode(pin_inter, OUTPUT); } void loop() { //T1 - начало команды 1, 1T - конец команды 1 //T2 - начало команды 2, 2T - конец команды 2 //A1 - Адрес контроллера, которому адресованы команды send_serial("A1T1B1TT2С2T"); send_serial("A2T1D1TT2С2T"); send_serial("A3T1C1TT2С2T"); send_serial("A4T1E1TT2С2T"); send_serial("A5T1E1TT2С2T"); } void send_serial(String A)//отправляем сообщения контроллерам { digitalWrite(pin_inter, HIGH);//сигнал о начале передачи delay(d2);//задержка для срабатывания прерывания на контроллерах приема Serial.print(A); delay(d);//задержка для приема сообщения digitalWrite(pin_inter, LOW); delay(d2); } void parseParams(String inputString){ String bb=inputString; if (bb.substring(0,2)=="A1"){//ответ 1 контроллера A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2)); A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2)); } if (bb.substring(0,2)=="A2"){//ответ 2 контроллера A2T1=bb.substring(bb.indexOf("T1")+2,bb.indexOf("1T")); } } void serialwait() { detachInterrupt(0);//отключаем прерывание interrupts(); Var=""; time = millis(); while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим delay(20); delay(200);//ожидаем получения всего сообщения while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку Var = Var + (char)(Serial.read()); if (Var!=0){//если пришло сообщение parseParams(Var); } attachInterrupt(0, serialwait, RISING);//активируем прерывание }
ДЛЯ PRO MINI
String Var; String A1T1;//команда 1 для 1 контроллера String A1T2;//команда 2 для 1 контроллера //String A2T1;//команда 1 для 2 контроллера //String A2T2;//команда 2 для 2 контроллера int pin_inter=13; int d2=20; int d=500; void setup() { attachInterrupt(0, serialwait, RISING);//определяем функцию по прерыванию } void serialwait() { detachInterrupt(0);//отключаем прерывание interrupts(); Serial.begin(9600);//активируем прием сообщения Var=""; int time =0; time = millis(); while (!Serial.available() and (millis()-time<2000))//пока нет данных для приема стоим на месте 2 секунды и выходим delay(20); delay(200);//ожидаем получения всего сообщения while (Serial.available()) //пока не конец сообщения, читаем данные и формируем строку Var = Var + (char)(Serial.read()); Serial.end();//закрываем сериал соединение if (Var!=0){//если пришло сообщение parseParams(Var); } attachInterrupt(0, serialwait, RISING);//активируем прерывание } void parseParams(String inputString){ String bb=inputString; if (bb.substring(0,2)=="A1"){//сообщение для контроллера №1 A1T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1 A1T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2 send_serial(bb.substring(0,2)); } // if (bb.substring(0,2)=="A2"){//сообщение для контроллера №2 // A2T1=bb.substring(bb.indexOf("T1",2)+2,bb.indexOf("1T",2));//команда 1 // A2T2=bb.substring(bb.indexOf("T2",2)+2,bb.indexOf("2T",2));//команда 2 // send_serial(bb.substring(0,2)); // } } void send_serial(String A) { Serial.begin(9600);//активируем передачу сообщения digitalWrite(pin_inter, HIGH);//сигнал о начале передачи delay(d2);//задержка для срабатывания прерывания на контроллерах приема Serial.print(Var+"T1");//далее передаем сообщение Serial.print("22");//значение параметра T1 Serial.print("1TT2"); Serial.print("23");//Значение параметра T2 Serial.print("2T"); delay(d); digitalWrite(pin_inter, LOW); delay(d2); Serial.end();//закрываем сериал соединение } void loop() { //программа }
Бред какой-то читаю я в #0
Делаи в прерываниях, передергивание самих прерываний. Зачем весь этот говнокод?
Прерывание должно быть коротким и быстрым. Пришел сигнал, выставился флаг, при очередном проходе лупа флаг обработался.