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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2013, 18:59   #1
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Попробуйте измерять температуру по таймеру (750 ms - 12 разрядов, зависит от точности измерения). Можно задать и реже 1..n сек. Зависит насколько у вас быстро изменяется температура, которую нужно контролировать (но быстрее 750 мс не получится при точности 12 бит)
http://www.cyber-place.ru/showpost.p...&postcount=114
отключив ожидание
Код:
sensors.setWaitForConversion(false);
т.к. во время опроса происходит "тупой" delay(), что мешает основной программе.

В выше приведенном алгоритме ни какого ожидания нет, а измерение происходит в фоновом режиме заданное таймером.

Последний раз редактировалось andr128; 28.05.2013 в 22:29.
andr128 вне форума   Ответить с цитированием
Старый 29.05.2013, 02:36   #2
zsm
Member
 
Регистрация: 28.05.2013
Сообщений: 71
Вес репутации: 0
zsm is an unknown quantity at this point
По умолчанию

Большое спасибо , обязательно попробую.
zsm вне форума   Ответить с цитированием
Старый 29.05.2013, 03:26   #3
zsm
Member
 
Регистрация: 28.05.2013
Сообщений: 71
Вес репутации: 0
zsm is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от andr128 Посмотреть сообщение
Попробуйте измерять температуру по таймеру (750 ms - 12 разрядов, зависит от точности измерения). Можно задать и реже 1..n сек. Зависит насколько у вас быстро изменяется температура, которую нужно контролировать (но быстрее 750 мс не получится при точности 12 бит)
http://www.cyber-place.ru/showpost.p...&postcount=114
отключив ожидание
Код:
sensors.setWaitForConversion(false);
т.к. во время опроса происходит "тупой" delay(), что мешает основной программе.

В выше приведенном алгоритме ни какого ожидания нет, а измерение происходит в фоновом режиме заданное таймером.
Попробовал пример по Вашей ссылке.
Извините за тупой вопрос. Какую переменную брать чтобы температуру узнать? Пытаюсь sensors.getTempC(Thermometer) послать в серийный порт он абрукадабру печатает...

Последний раз редактировалось zsm; 29.05.2013 в 03:28.
zsm вне форума   Ответить с цитированием
Старый 29.05.2013, 09:31   #4
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1604
andr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond reputeandr128 has a reputation beyond repute
По умолчанию

Цитата:
Сообщение от zsm Посмотреть сообщение
Попробовал пример по Вашей ссылке.
Извините за тупой вопрос. Какую переменную брать чтобы температуру узнать? Пытаюсь sensors.getTempC(Thermometer) послать в серийный порт он абрукадабру печатает...
Не нужно sensors.getTempC(Thermometer) посылать в порт
Перед считыванием значения датчика должно пройти время. За это отвечает таймер.

Вот вам пример:
PHP код:
#include <MsTimer2.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS  10    // датчик DS1820 DATA подкл. на pin 10
#define RES_TEMP      12    // разрешение (точность) темп. датчика в битах


OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer// адрес устройства

int TempC=0;

void setup() 
{
    
Serial.begin(9600);

    
sensors.begin();                                 // Start up the library
    
sensors.getAddress(Thermometer0);                 // получить адрес DS18B20 (0 - 1 датчик)
    
sensors.setResolution(ThermometerRES_TEMP);     // установить разрешение (точность)
    
sensors.setWaitForConversion(false);             // отключить ожидание при изм.темп.
                                                     // время на изм. должно быть > 750ms
    
sensors.requestTemperatures();                   // Команда на измерение температуры, 
                                                     // выборка произойдет по прерыванию таймера через 2 сек (первый раз)

    
MsTimer2::set(2000Tizm);        // установка таймера на 2 сек. для изм. температуры 
    
MsTimer2::start();                // запустить таймер
}


void Tizm() //обработка прерывания таймера - изм температуры
{
      
TempC sensors.getTempC(Thermometer);    // Получить температуру в градусах
    
sensors.requestTemperatures();          // Команда на измерение температуры для следующего раза
}


void loop()
{
   
Serial.print("Temperature ="); //вывод температуры
   
Serial.println(TempCDEC);
   
delay(10);


Последний раз редактировалось andr128; 29.05.2013 в 09:51.
andr128 вне форума   Ответить с цитированием
Старый 29.05.2013, 15:43   #5
zsm
Member
 
Регистрация: 28.05.2013
Сообщений: 71
Вес репутации: 0
zsm is an unknown quantity at this point
По умолчанию

andr128,огромное спасибо, с Вашим примером все заработало))
Только переменную TempC на float пришлось изменить для большей плавности. Теперь значения буду подбирать для реальных условий, да и код надо в порядок привести.

И конечно отдельное спасибо Admin'у этого форума за помощь, и замечательный многоканальный димер .

вот такой код получился, он конечно требует доработки(хотелось бы больше плавности при изменении скорости вентилятора),но основную задачу выполняет и это очень радует ))

PHP код:
#include <MsTimer2.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include "nanopins.h" //быстрое управление пинами
#include <TimerOne.h> //использует Timer1

#define VAR_REZ A0
#define VAR_REZ2 A1
#define LM_35  A5
#define ONE_WIRE_BUS  10    // датчик DS1820 DATA подкл. на pin 10
#define RES_TEMP      12    // разрешение (точность) темп. датчика в битах

volatile uint8_t ticDimmer1Dimmer2Dimmer3;
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
DeviceAddress Thermometer// адрес устройства

float TempC=0;
int led 13;

void setup() 


    
Serial.begin(9600);
    
sensors.begin();                                 // Start up the library
    
sensors.getAddress(Thermometer0);                 // получить адрес DS18B20 (0 - 1 датчик)
    
sensors.setResolution(ThermometerRES_TEMP);     // установить разрешение (точность)
    
sensors.setWaitForConversion(false);             // отключить ожидание при изм.темп.
                                                     // время на изм. должно быть > 750ms
    
sensors.requestTemperatures();                   // Команда на измерение температуры, 
                                                     // выборка произойдет по прерыванию таймера через 2 сек (первый раз)

    
MsTimer2::set(2000Tizm);        // установка таймера на 2 сек. для изм. температуры 
    
MsTimer2::start();                // запустить таймер
  
D4_Out//Настраиваем порт на выход Dimmer1
  
D5_Out//Настраиваем порт на выход Dimmer2
  
D6_Out//Настраиваем порт на выход Dimmer3
  
D4_LowD5_LowD6_Low//установить на выходах низкий уровень сигнала
  
D2_In//настраиваем порт на вход для отслеживания прохождения сигнала через ноль
  
pinMode(ledOUTPUT);
  
Serial.begin(9600);
  
Serial.println("Start");
  
   
  
attachInterrupt(0detect_upFALLING);  // настроить срабатывание прерывания int0 на pin 2 

  
Timer1.initialize(40);              // Интервал срабатывания таймера в мкс 
  
Timer1.attachInterrupt(halfcycle);   //будет вызыватся каждый раз при отсчете заданого времени
  
Timer1.stop();
}
//********************обработчики прерываний*******************************
void halfcycle()  //прерывания таймера

  
tic++;  //счетчик  
  
if(Dimmer1 tic D4_High//управляем выходом
  
if(Dimmer2 tic D5_High;  //управляем выходом
  
if(Dimmer3 tic D6_High;  //управляем выходом 
}

void  detect_up()  // обработка внешнего прерывания. Сработает по переднему фронту синусоиды
{  
 
tic=0;             //обнулить счетчик
 
Timer1.resume();   //запустить таймер
 
attachInterrupt(0detect_downRISING);  //перепрограммировать прерывание на другой обработчик
}  

void  detect_down()  // обработка внешнего прерывания. Сработает по заднему фронту синусоиды
{   
 
Timer1.stop(); //остановить таймер
 
D4_LowD5_LowD6_Low//логический ноль на выходы
 
tic=0;       //обнулить счетчик
 
attachInterrupt(0detect_upFALLING); //перепрограммировать прерывание на другой обработчик


void Tizm() //обработка прерывания таймера - изм температуры
{
      
TempC sensors.getTempC(Thermometer);    // Получить температуру в градусах
    
sensors.requestTemperatures();          // Команда на измерение температуры для следующего раза
}


//*************************************************************************
void loop() 

{
  
  
  
  
  
int valrez analogRead(VAR_REZ);
  
int valrez2 analogRead(VAR_REZ2);
  
int tempmin map(valrez,147,1023,2000,5000) ;
  
int tempmax map(valrez2,135,1023,2000,5000) ;
  
Serial.print("   Requesting temperatures...");
  
Serial.println("DONE");
  
Serial.print("min temp-");
  
Serial.println(tempmin);
  
Serial.print("max temp-");
  
Serial.println(tempmax);
  
Serial.println(valrez);
  
Serial.println(valrez2); 
  
  
int pwmval map(TempC*100,tempmin,tempmax,110,60);
  
Serial.print("pwm-");
  
Serial.println(pwmval);
  
  
  if (
TempC*100<tempmin
    {
Dimmer1=255;}
  
  else if (
TempC*100>tempmax
    {
Dimmer1=0;}
  
  else if  (
TempC*100>tempmin)
    {
Dimmer1=pwmval;}
 
 
  
Serial.print("Temperature: ");
  
Serial.print(TempC);
   if  (
TempC*100>tempmindigitalWrite(ledHIGH);
   if  (
TempC*100<tempmindigitalWrite(ledLOW);
   
   
delay(200);
      
  
  } 

Последний раз редактировалось zsm; 29.05.2013 в 16:41.
zsm вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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