Схематически: MajorDoMo хранит строку байт в которую сохраняется состояние пинов (вкл/выкл) и пересылает её скажем каждые 10 секунд в дуню (на случай рестарта контроллера) или моментально в случае записи новых данных в строку. Т.е. в сериал может уходить нечто вроде SET_R_11110100,11110100,11110100,11110100,11110100,11110100; или SET_R_5,220,12,255,0,11;
блок Обработчик команд Serial порта написан только для проверки правильности соединения электронных компонентов.
Хотелось бы получить помощь в написании блока обработки команд с Serial порта...
Код: Выделить всё
/*
Исполнительный контроллер умного дома. 0.0001a
by DAP
*/
//обозначим пины релейных регистров
//Пин подключен к ST_CP входу 74HC595
int latchPin = 8;
//Пин подключен к SH_CP входу 74HC595
int clockPin = 13;
//Пин подключен к DS входу 74HC595
int dataPin = 11;
//Создадим массив содержащий значения состояний выводов реле (текущее реле в 6м регистре )
byte r_state[6] = {B11110100, 24, 22, 4, B00010110, 0};
byte r_state_last[6];
byte tst ;
void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
//инициализируем serial
Serial.begin(9600);
Serial.println("Start");
/*************переводим реле в выключенное состояние.*************/
//устанавливаем LOW на latchPin пока не окончена передача байта
digitalWrite(latchPin, LOW);
for(int i = 0; i < 6; i++)
{
shiftOut(dataPin, clockPin, MSBFIRST, B00000000);
}
//устанавливаем HIGH на latchPin, чтобы проинформировать регистр, что передача окончена.
digitalWrite(latchPin, HIGH);
Serial.println (r_state[5]);
}
/**************цикл петли, основной цикл***************/
void loop() {
/******* Обработчик команд Serial порта*********/
if (Serial.available() > 0) { // Если в буфере есть данные
int n = {Serial.read()-'0'}; // читаем байт адреса реле
Serial.flush();
bitSet(r_state[5], n);
}
/*******работа с сдвиговым регистром релейного блока**********************/
//если массив изменился передадим данные в регистр к исполнению
for(int f = 0; f < 6; f++){
if (r_state[f] != r_state_last[f])
{
//устанавливаем LOW на latchPin пока не окончена передача байта
digitalWrite(latchPin, LOW);
for(int i = 0; i < 6; i++){
shiftOut(dataPin, clockPin, LSBFIRST, r_state[i]);
//запомним последнее значение буфера
r_state_last[i] = r_state[i];
}
//устанавливаем HIGH на latchPin, чтобы проинформировать регистр, что передача окончена.
digitalWrite(latchPin, HIGH);
}
//запомним последнее значение буфера
}
}