По просьбе mebitek, выкладываю тестовые скетчи
УУ - Удаленный узел
ЦУ - Центральный узел
Для тестирования светодиода D13 на УУ, ЦУ должен быть подключен к ПК или любому роутеру с
OpenWrt
По UART из терминалки или из сериал монитора, в ЦУ отправляем цифру 1 и светодиод на УУ засветится, что бы его потушить отправьте 0 и т.д.
Код для ЦУ, в роли ЦУ
Arduino Mega
PHP код:
#include <avr/delay.h>
byte inByte;
#define DE 3
byte outdata[9]={255,35,83,87,11,0,1,1,255};
byte indata[4];
void setup()
{
pinMode(19, INPUT);
digitalWrite(19, HIGH);
pinMode(DE, OUTPUT);
driver_recive(); //переводим драйвер в режим приемника
Serial.begin(115200);
Serial1.begin(57600);
digitalWrite(19,HIGH); //подключить внутренний подтягивающий резистор UART1
}
void loop()
{
if(Serial.available())//ждем команды с компьютера
{
outdata[5] = Serial.read()-48;
driver_send();
Serial1.write(outdata,9);
driver_recive(); //переводим драйвер в режим приемника
}
if(Serial1.available()>0) //ждем данные из шины
{
inByte=Serial1.read();
if (inByte==255)
{
inByte = 0;
for(uint16_t i=0; i<65535; i++)//ловим остальные данные
{
if(Serial1.available()>7) //если данные в буфере
{
inByte=Serial1.read();
if (inByte==170) //данные ликвидны
{
for(uint8_t y=2; y<9; y++) outdata[y] = Serial1.read();
break; //если данные приняты то прервать цикл
}
}
}
digitalWrite(13,outdata[5]); //индикатор приема данных }
}
}
void driver_recive()
{
_delay_us(350);
digitalWrite(DE, LOW); //переводим драйвер в режим приемника
}
void driver_send()
{
digitalWrite(DE, HIGH); //переводим драйвер в режим передатчика
_delay_us(350); //формируем старт бит
Serial1.flush(); //чистим входящий буфер
}
Код для УУ, в роли УУ
Arduino Nano
PHP код:
#include <avr/delay.h>
byte outdata[9]={255,170,83,87,11,0,0,0,254};//исходящий буфер
byte indata[6]; //входящий буфер
#define DE 8 //выход для переключения драйвера в режим прием/передача
void setup()
{
pinMode(DE, OUTPUT); //выход для переключения драйвера в режим прием/передача
digitalWrite(DE, LOW); //переводим драйвер в режим приемника
pinMode(13, OUTPUT); //выход для нагрузки
Serial.begin(57600); //скорость обмена шины
digitalWrite(0,HIGH); //подключить внутренний подтягивающий резистор
pinMode(2, INPUT); //кнопка выключателя 1
pinMode(3, INPUT); //кнопка выключателя 2
digitalWrite(2, HIGH); //подключить внутренний подтягивающий резистор на выключатель 1
digitalWrite(3, HIGH); //подключить внутренний подтягивающий резистор на выключатель 2
attachInterrupt(0, Switch1, FALLING); //настроить прерывание по изменению уровня с низкого на высокий
attachInterrupt(1, Switch2, FALLING); //настроить прерывание по изменению уровня с низкого на высокий
}
void loop()
{
Recive_Data(); //прочитать данные из шины если они пришли
digitalWrite(13, indata[3]); //изменить состояние назрузки
}
void Switch1()
{
if(indata[3]>0)indata[3]=255;
indata[3]=~indata[3];
while(digitalRead(2) == HIGH){} //ждем отпускания кнопки
}
void Switch2()
{
if(indata[4]>0)indata[4]=255;
indata[4]=~indata[4];
while (digitalRead(3)==HIGH){} //ждем отпускания кнопки
}
boolean Recive_Data()
{
if(Serial.available()>6)
{
byte pct=Serial.read(); //прочитать первое принятое знгачение
if (pct==35) //если это индетефикатор пакета то принимаем весь пакет
{
for(uint8_t y=0; y<6; y++) indata[y] = Serial.read(); //принимаем весь пакет
}
}
}
void Send_Data()
{
//_delay_us(350); //время на то чтобы устаканился
digitalWrite(DE, HIGH); //переводим драйвер в режим передатчика
_delay_us(2); //время на то чтобы устаканился
Serial.write(outdata,9); //передаем данные
digitalWrite(DE, LOW); //переводим драйвер в режим приемника
_delay_us(350); //формируем старт бит и время для отправки данных
// Serial.flush(); //чистим входящий буфер
}