блок 48 реле arduino Serial

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Ответить
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

блок 48 реле arduino Serial

Сообщение DAP » Пн апр 27, 2015 4:03 pm

Посоветуйте как лучше реализовать прием массива с состояниями переключателей на присоединенную ардуину?

Схематически: 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);
  }
  //запомним последнее значение буфера
  
}
} 
DAP
Сообщения: 118
Зарегистрирован: Пн апр 06, 2015 10:25 pm
Благодарил (а): 6 раз
Поблагодарили: 16 раз

Re: блок 48 реле arduino Serial

Сообщение DAP » Чт апр 30, 2015 4:39 pm

Код arduino с блоком чтения пакета:

Код: Выделить всё

/*
/*
Исполнительный контроллер умного дома. 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) { //Если в буфер serial прилетели данные

    if (Serial.find("R_STATE:"))//ищем кусок строки R_STATE: выполним
    {
      
      Serial.readBytes( r_state, 6 ); // считывание 6ти байт в массив состояний r_state
       
  
      Serial.println ('S');
      Serial.println (r_state[0]);
      Serial.println (r_state[1]);
      Serial.println (r_state[2]);
      Serial.println (r_state[3]);
      Serial.println (r_state[4]);
      Serial.println (r_state[5]);
     
    }
    Serial.flush(); //остальное сотрем
  }

  /*******работа с сдвиговым регистром релейного блока**********************/
  
  //если массив изменился передадим данные в регистр к исполнению
  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);
  }
  //запомним последнее значение буфера
  
}
}
Если послать в serial строку R_STATE:XXXXXX, где XXXXXX состояние регистров управляющих релеями получим соответствующее стостояние релеев.
Ответить