Система мониторинга и управления на базе Arduino

kir
Offline
Зарегистрирован: 06.11.2015

Подскажите кто нибудь 
Нужно сделать по 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() {
//программа
}

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Бред какой-то читаю я в #0

Делаи в прерываниях, передергивание самих прерываний. Зачем весь этот говнокод?

Прерывание должно быть коротким и быстрым. Пришел сигнал, выставился флаг, при очередном проходе лупа флаг обработался.