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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.05.2013, 18:43   #11
zsm
Member
 
Регистрация: 28.05.2013
Сообщений: 71
Вес репутации: 0
zsm is an unknown quantity at this point
По умолчанию

попробовал при любом значении dimmer крутится медленно и не стабильно.
с Вашим многоканальным диммером всё отлично регулируется.

видимо придется аналоговые датчики температуры использовать, но смущает длинна провода , мне метра 3 как минимум надо..
zsm вне форума   Ответить с цитированием
Старый 28.05.2013, 18:59   #12
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605
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   #13
zsm
Member
 
Регистрация: 28.05.2013
Сообщений: 71
Вес репутации: 0
zsm is an unknown quantity at this point
По умолчанию

Большое спасибо , обязательно попробую.
zsm вне форума   Ответить с цитированием
Старый 29.05.2013, 03:26   #14
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   #15
andr128
Senior Member
 
Аватар для andr128
 
Регистрация: 16.09.2012
Адрес: Irkutsk
Сообщений: 555
Вес репутации: 1605
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   #16
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 вне форума   Ответить с цитированием
Старый 03.10.2013, 11:14   #17
wowa
Junior Member
 
Регистрация: 23.09.2013
Сообщений: 14
Вес репутации: 0
wowa is an unknown quantity at this point
По умолчанию

Я не совсем понял зачем три димирущих выхода на один вентилятор. И как то не ясно всё ли получилось, т.э. достиг цели? А то с мая нет в этой теме вестей.
wowa вне форума   Ответить с цитированием
Старый 09.10.2013, 19:52   #18
kentik
Junior Member
 
Регистрация: 09.10.2013
Сообщений: 27
Вес репутации: 0
kentik is an unknown quantity at this point
По умолчанию

Цитата:
Сообщение от wowa Посмотреть сообщение
Я не совсем понял зачем три димирущих выхода на один вентилятор. И как то не ясно всё ли получилось, т.э. достиг цели? А то с мая нет в этой теме вестей.
да это просто так. показать на примере 3-х. а так их можно и больше "впендюрить"
kentik вне форума   Ответить с цитированием
Старый 28.11.2013, 18:16   #19
wowa
Junior Member
 
Регистрация: 23.09.2013
Сообщений: 14
Вес репутации: 0
wowa is an unknown quantity at this point
По умолчанию Re: Плавное изменение оборотов асинхронного вентилятора переменного тока с помощью Arduino.

Мне нужен ШИМ с 16кГц управляемый кнопками через меню. Кнопкой селект доходим до пункта Ventiliator а там уже с up/down повышаем или понижаем амплитуду. Понижается не до нуля а где то 70% чтобы не спалить движок. Набрал вот такой скеч, но как его проверить.Оставил и мусора в скече, это от часов, они мне нужны в этом проекте меню, только в тех местах где компилятор ругается вставил // (тормоза).
Покритикуйте пожалуйста, а то не как проверить. Компилятор не ругается но это ещё не чего не значит. Как детльки подойдут- проведу и стендовые испытание.
Схема на IGBT для управления однофазным движком.


Цитата:
#include*<avr/interrupt.h>
#include*<LiquidCrystal_I2C.h>
#include*<Wire.h>

//*Variables
int pwm_val = 0;

int Motor_speed = 0; //Motor speed to achieve balancing
int pwm_value;
int lcd_key = 0;
int adc_key_in = 0;
int menuOptions = 4;
int menuOption = 0;

//*define*constants
#define*pwm 2

#define*btnSTOP******0
#define*btnRIGHT*****1
#define*btnDOWN******2
#define*btnUP********3
#define*btnLEFT******4
#define*btnSELECT****5
#define*btnSTART*****6
#define*btnNONE******7

#define*beeper******A3
#define*shortBeep*100
#define*longBeep**500

LiquidCrystal_I2C lcd(0x20,16,2);
byte count = 0;
///////////////////////////////////////////////////////
void setup()
{
**pinMode(beeper, OUTPUT);
**Wire.begin();
**lcd.init();
**lcd.clear();

**TCCR1A*=*B11110010;
**TCCR1B*=*B00011001;

**TCCR1B*=*25;// 00011001
**ICR1*=*1023*;*// 10 bit resolution
**OCR1A*=*511;*// vary this value between 0 and 1024 for 10-bit precision
**OCR1B*=*511;*// vary this value between 0 and 1024 for 10-bit precision

**pinMode (pwm_val, OUTPUT); //PWM Analog
**pinMode(pwm,OUTPUT);
}

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

{
**//Control motor with push button
**int pwm_value;
**digitalWrite(pwm,HIGH); // always set PWM to HIGH

**while(1)
**{
**if(pwm_value>255) //ensure speed limit as PWM value ranges from 0 to 255
***pwm_value=*255;*
****else if(pwm_value<170) //indicate the lower speed limit
**pwm_value=*0;

****//analogWrite(pwm_value);

****lcd.setCursor(0,0); //LCD display
****lcd.print("PWM:");
****lcd.print(digitalRead(pwm));
****lcd.setCursor(0,1);
****lcd.print(pwm_value);
**}
**analogWrite(pwm_val,(1023-abs(Motor_speed)));//the "1023-" is there to correct the actual PWM percentage
}
////////////////////////////////////////////////////////////
void button_loop()
{
**int button = read_LCD_buttons();
**if (button == btnSELECT)
**{
****timedBeep(shortBeep,1);*
****selectMenu();
**}
}

//////////////////////////////////////////////////////////////
void selectMenu()
{
**int button = 0;
**menuOption*=*1;
**lcdClear();
**lcd.print("Minute Timer");
**while (menuOption <= menuOptions)
**{
****button*=*read_LCD_buttons();
**if (button == btnSELECT)
**{
*timedBeep(shortBeep,1);***
*menuOption++;
*if (menuOption == 2)
*{
*lcdClear();********// clearAlarm feature
*lcd.print("Set/Clear Alarm");
*}
*if (menuOption == 3)
*{
*lcdClear();
*lcd.print("Set Time");
*}
*}*
*if (button == btnLEFT)
*{
*if (menuOption == 1)
*{
*timedBeep(shortBeep,1);
*//CLOCK// minuteTimer();
*return;
*}
*if (menuOption == 2)
*{
*timedBeep(shortBeep,1);
*// clearAlarm feature
*//check for existing alarm
*//CLOCK// if (alarmSet)
*{
*//CLOCK// clearAlarm();
*}
*//CLOCK//else
*{
*//CLOCK// setAlarm();
*}
*return;
*}
if (menuOption == 3)
*{
timedBeep(shortBeep,1);
*//CLOCK/// setTime feature
*//CLOCK// setDateTime();
*return;
*}
*////////////////////////Ventiliator meniu/////////////////////
*if (menuOption == 4)
*{
*lcdClear();
*lcd.print("Ventiliator");
*}
*}*
*if (button == btnUP)
*{
*pwm_value++;//increase PWM if UP button pressed
*delay(200);
*lcd.clear();
*}
*else if (button == btnDOWN)
*{*
*pwm_value--;*//decrease PWM if DOWN button pressed
*delay(200);
*lcd.clear();
*return;
*}
*///end ventiliator meniu///////////////////////////////////
*if (menuOption == 1)
*{
*timedBeep(shortBeep,1);
*//CLOCK// minuteTimer();
*return;
*}
*}
}**
//////////////////////////////////////////////

//*read*the*buttons
int read_LCD_buttons()
{
**adc_key_in*=*analogRead(0); //
**if (adc_key_in < 50) return btnSTOP;
**if (adc_key_in < 125) return btnRIGHT;
**if (adc_key_in < 375) return btnUP;
**if (adc_key_in < 500) return btnDOWN;
**if (adc_key_in < 625) return btnLEFT;
**if (adc_key_in < 750) return btnSELECT;
**if (adc_key_in < 875) return btnSTART;
**if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result
**return btnNONE; // when all others fail, return this...
}
/////////////////////////////////////////////////
void lcdClear()
{*
**lcd.clear();
**lcd.begin(16,2);
**lcd.setCursor(0,0);
}
////////////////////////////////////////////////
void timedBeep(int beepTime, int beepCount)
{
**for (int i = 0; i < beepCount; i ++)
**{
****digitalWrite(beeper, HIGH);
****delay(beepTime);
****digitalWrite(beeper, LOW);
****delay(beepTime);
**}
}

Последний раз редактировалось wowa; 28.11.2013 в 18:36.
wowa вне форума   Ответить с цитированием
Старый 28.11.2013, 18:33   #20
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
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
По умолчанию Re: Плавное изменение оборотов асинхронного вентилятора переменного тока с помощью Arduino.

PHP код:
void loop()

 {
//Control motor with push button
int localKey//initialize
int pwm_value;
digitalWrite(pwm,HIGH); // always set PWM to HIGH

while(1)
 {
if(
pwm_value>255//ensure speed limit as PWM value ranges from 0 to 255
 
pwm_value=*255;*
else if(
pwm_value<170//indicate the lower speed limit
 
pwm_value=*0;

//analogWrite(pwm_value); 
Софтовый ШИМ, бальще чем 500Гц не потянет и то под вопросом, нужно считать или пробовать а практике
Admin вне форума   Ответить с цитированием
Ответ


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

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

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

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


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


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