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

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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 23.11.2012, 16:21   #1
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9825
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(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();   //чистим входящий буфер
} 
Admin вне форума   Ответить с цитированием
 


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

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

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


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


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