Система мониторинга и управления на базе 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
Делаи в прерываниях, передергивание самих прерываний. Зачем весь этот говнокод?
Прерывание должно быть коротким и быстрым. Пришел сигнал, выставился флаг, при очередном проходе лупа флаг обработался.