Форум обсуждения систем  

Вернуться   Форум обсуждения систем "Умный дом", проектов Ардуино, OpenWRT и других DIY устройств > Форум умного дома > Сделай сам > Открытый проект умного дома

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.11.2012, 16:21   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,616
Вес репутации: 9821
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Тестовый код для управления по шине RS485

По просьбе 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(19INPUT);
   
digitalWrite(19HIGH);
  
pinMode(DEOUTPUT);
  
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=0i<65535i++)//ловим остальные данные
            
{     
              if(
Serial1.available()>7//если данные в буфере
               

                
inByte=Serial1.read();
                 if (
inByte==170//данные ликвидны
                  
{   
                    for(
uint8_t y=2y<9y++) outdata[y] = Serial1.read(); 
                    break; 
//если данные приняты то прервать цикл
                  
}
               }
            }   
       
digitalWrite(13,outdata[5]); //индикатор приема данных     }
     
}      
}

void driver_recive() 
{
  
_delay_us(350); 
digitalWrite(DELOW); //переводим драйвер в режим приемника
}

void driver_send() 

digitalWrite(DEHIGH); //переводим драйвер в режим передатчика
_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(DEOUTPUT);   //выход для переключения драйвера в режим прием/передача
  
digitalWrite(DELOW);  //переводим драйвер в режим приемника
  
pinMode(13OUTPUT);    //выход для нагрузки
  
  
Serial.begin(57600);     //скорость обмена шины
  
digitalWrite(0,HIGH);    //подключить внутренний подтягивающий резистор
  
  
pinMode(2INPUT);      //кнопка выключателя 1
  
pinMode(3INPUT);      //кнопка выключателя 2 
  
digitalWrite(2HIGH);  //подключить внутренний подтягивающий резистор на выключатель 1
  
digitalWrite(3HIGH);  //подключить внутренний подтягивающий резистор на выключатель 2  
  
attachInterrupt(0Switch1FALLING);  //настроить прерывание по изменению уровня с низкого на высокий    
  
attachInterrupt(1Switch2FALLING);  //настроить прерывание по изменению уровня с низкого на высокий    
}
 
void loop() 
{   
      
Recive_Data();  //прочитать данные из шины если они пришли                
      
digitalWrite(13indata[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=0y<6y++) indata[y] = Serial.read(); //принимаем весь пакет
          
}         
      }    
}

void Send_Data() 
{
  
//_delay_us(350); //время  на то чтобы устаканился
  
digitalWrite(DEHIGH); //переводим драйвер в режим передатчика
  
_delay_us(2);      //время на то чтобы устаканился
  
Serial.write(outdata,9);  //передаем  данные
  
digitalWrite(DELOW); //переводим драйвер в режим приемника
  
_delay_us(350);       //формируем старт бит и время для отправки данных
 // Serial.flush();   //чистим входящий буфер

Admin вне форума   Ответить с цитированием
 


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 18:12. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика