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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 29.03.2014, 11:14   #21
kirex
Member
 
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0
kirex is an unknown quantity at this point
По умолчанию Re: Акваконтроллер

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
А примеры работают? чтоб проверить аппаратную часть
например вот такой
PHP код:
//Sample using LiquidCrystal library
#include <LiquidCrystal.h>

/*******************************************************

This program will test the LCD panel and the buttons
Mark Bramwell, July 2010

********************************************************/

// select the pins used on the LCD panel
LiquidCrystal lcd(894567);

// define some values used by the panel and buttons
int lcd_key     0;
int adc_key_in  0;
#define btnRIGHT  0
#define btnUP     1
#define btnDOWN   2
#define btnLEFT   3
#define btnSELECT 4
#define btnNONE   5

// read the buttons
int read_LCD_buttons()
{
 
adc_key_in analogRead(0);      // read the value from the sensor 
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741
 // we add approx 50 to those values and check to see if we are close
 
if (adc_key_in 1000) return btnNONE// We make this the 1st option for speed reasons since it will be the most likely result
 // For V1.1 us this threshold
 
if (adc_key_in 50)   return btnRIGHT;  
 if (
adc_key_in 250)  return btnUP
 if (
adc_key_in 450)  return btnDOWN
 if (
adc_key_in 650)  return btnLEFT
 if (
adc_key_in 850)  return btnSELECT;  

 
// For V1.0 comment the other threshold and use the one below:
/*
 if (adc_key_in < 50)   return btnRIGHT;  
 if (adc_key_in < 195)  return btnUP; 
 if (adc_key_in < 380)  return btnDOWN; 
 if (adc_key_in < 555)  return btnLEFT; 
 if (adc_key_in < 790)  return btnSELECT;   
*/


 
return btnNONE;  // when all others fail, return this...
}

void setup()
{
 
lcd.begin(162);              // start the library
 
lcd.setCursor(0,0);
 
lcd.print("Push the buttons"); // print a simple message
}
 
void loop()
{
 
lcd.setCursor(9,1);            // move cursor to second line "1" and 9 spaces over
 
lcd.print(millis()/1000);      // display seconds elapsed since power-up


 
lcd.setCursor(0,1);            // move to the begining of the second line
 
lcd_key read_LCD_buttons();  // read the buttons

 
switch (lcd_key)               // depending on which button was pushed, we perform an action
 
{
   case 
btnRIGHT:
     {
     
lcd.print("RIGHT ");
     break;
     }
   case 
btnLEFT:
     {
     
lcd.print("LEFT   ");
     break;
     }
   case 
btnUP:
     {
     
lcd.print("UP    ");
     break;
     }
   case 
btnDOWN:
     {
     
lcd.print("DOWN  ");
     break;
     }
   case 
btnSELECT:
     {
     
lcd.print("SELECT");
     break;
     }
     case 
btnNONE:
     {
     
lcd.print("NONE  ");
     break;
     }
 }


Да этот пример работает без проблем.
kirex вне форума   Ответить с цитированием
Старый 29.03.2014, 11:17   #22
kirex
Member
 
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0
kirex is an unknown quantity at this point
По умолчанию Re: Акваконтроллер

Цитата:
Сообщение от mebitek Посмотреть сообщение
а как надо?
Смысл вот в чём:
Допустим в автомате свет включается в 17.00 и выключается в 22.00. Иногда, особенно когда на улице пассмурно, необходимо включить свет например на час, для того чтобы поменять воду или покормить рыб. А потом опять в автомат.
Тоже самое с обогревом Н2. Когда меняю воду мне его надо выключить, а потом например через пол часа или через час опять включить в автомат.
kirex вне форума   Ответить с цитированием
Старый 29.03.2014, 12:21   #23
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию Re: Акваконтроллер

теперь в этом примере добавь, кроме вывода на экран, управление реле -пока только кнопками без температурного датчика -сам сможешь? Так дополняя и проверяя скетч и составим программу.
С портом умеешь работать(Serial.print)? -для отладки очень помогает вывод отладочных сообщений
У меня просто нет такого железа, поэтому будем так потихонбку составлять программу -заодно и в програмировании разберешься

Последний раз редактировалось Bulatovor; 29.03.2014 в 12:25.
Bulatovor вне форума   Ответить с цитированием
Старый 29.03.2014, 13:05   #24
kirex
Member
 
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0
kirex is an unknown quantity at this point
По умолчанию Re: Акваконтроллер

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
теперь в этом примере добавь, кроме вывода на экран, управление реле -пока только кнопками без температурного датчика -сам сможешь? Так дополняя и проверяя скетч и составим программу.
С портом умеешь работать(Serial.print)? -для отладки очень помогает вывод отладочных сообщений
У меня просто нет такого железа, поэтому будем так потихонбку составлять программу -заодно и в програмировании разберешься
Вот так кнопкой RIGHT выключается, а кнопкой LEFT включается.

Код HTML:
#include <LiquidCrystal.h> 

/******************************************************* 

This program will test the LCD panel and the buttons 
Mark Bramwell, July 2010 

********************************************************/ 

// select the pins used on the LCD panel 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

int Relay_Off = HIGH;
int Relay_On = LOW;

// define some values used by the panel and buttons 
int lcd_key     = 0; 
int adc_key_in  = 0; 
#define btnRIGHT  0 
#define btnUP     1 
#define btnDOWN   2 
#define btnLEFT   3 
#define btnSELECT 4 
#define btnNONE   5 

// read the buttons 
int read_LCD_buttons() 
{ 
 adc_key_in = analogRead(0);      // read the value from the sensor  
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 
 // we add approx 50 to those values and check to see if we are close 
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result 
 // For V1.1 us this threshold 
 if (adc_key_in < 50)   return btnRIGHT;   
 if (adc_key_in < 250)  return btnUP;  
 if (adc_key_in < 450)  return btnDOWN;  
 if (adc_key_in < 650)  return btnLEFT;  
 if (adc_key_in < 850)  return btnSELECT;   

 // For V1.0 comment the other threshold and use the one below: 
/* 
 if (adc_key_in < 50)   return btnRIGHT;   
 if (adc_key_in < 195)  return btnUP;  
 if (adc_key_in < 380)  return btnDOWN;  
 if (adc_key_in < 555)  return btnLEFT;  
 if (adc_key_in < 790)  return btnSELECT;    
*/ 


 return btnNONE;  // when all others fail, return this... 
} 

void setup() 
{ 
  pinMode(41, OUTPUT);
  lcd.begin(16, 2);              // start the library 
 lcd.setCursor(0,0); 
 lcd.print("Push the buttons"); // print a simple message 
} 
  
void loop() 
{ 
 lcd.setCursor(13,1);            // move cursor to second line "1" and 9 spaces over 
 lcd.print(millis()/1000);      // display seconds elapsed since power-up 


 lcd.setCursor(0,1);            // move to the begining of the second line 
 lcd_key = read_LCD_buttons();  // read the buttons 

 switch (lcd_key)               // depending on which button was pushed, we perform an action 
 { 
   case btnRIGHT: 
     { 
     digitalWrite(41, Relay_Off); 
  lcd.setCursor(7, 1);
  lcd.print("H2-Off");   
     break; 
     } 
   case btnLEFT: 
     { 
     digitalWrite(41, Relay_On); 
  lcd.setCursor(7, 1);
  lcd.print("H2-On ");
     break; 
     } 
   case btnUP: 
     { 
     lcd.print("UP    "); 
     break; 
     } 
   case btnDOWN: 
     { 
     lcd.print("DOWN  "); 
     break; 
     } 
   case btnSELECT: 
     { 
     lcd.print("SELECT"); 
     break; 
     } 
     case btnNONE: 
     { 
     lcd.print("NONE  "); 
     break; 
     } 
 } 

}
kirex вне форума   Ответить с цитированием
Старый 29.03.2014, 14:02   #25
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию Re: Акваконтроллер

Замечательно, теперь на кнопку Select добавь изменение флага(типа как в моем примере - изменение значения переменной по вкусу)с ручного режима на автоматический, следующим этапом будет добавление датчика температуры
Bulatovor вне форума   Ответить с цитированием
Старый 29.03.2014, 14:30   #26
kirex
Member
 
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0
kirex is an unknown quantity at this point
По умолчанию Re: Акваконтроллер

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
Замечательно, теперь на кнопку Select добавь изменение флага(типа как в моем примере - изменение значения переменной по вкусу)с ручного режима на автоматический, следующим этапом будет добавление датчика температуры
Спасибо за помощь.
Попробую сделать, только ближе к вечеру.
Сейчас нужно уехать, обещал детям в парк.
До вечера.
kirex вне форума   Ответить с цитированием
Старый 30.03.2014, 02:18   #27
kirex
Member
 
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0
kirex is an unknown quantity at this point
По умолчанию Re: Акваконтроллер

Цитата:
Сообщение от Bulatovor Посмотреть сообщение
Замечательно, теперь на кнопку Select добавь изменение флага(типа как в моем примере - изменение значения переменной по вкусу)с ручного режима на автоматический, следующим этапом будет добавление датчика температуры
Сделал вот так:
Код HTML:
#include <LiquidCrystal.h> 

/******************************************************* 

This program will test the LCD panel and the buttons 
Mark Bramwell, July 2010 

********************************************************/ 

// select the pins used on the LCD panel 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

int Relay_Off = HIGH;
int Relay_On = LOW;
int reg=0;// вводим флаг для автоматического (при значении-0) или ручного регулирования -1

// define some values used by the panel and buttons 
int lcd_key     = 0; 
int adc_key_in  = 0; 
#define btnRIGHT  0 
#define btnUP     1 
#define btnDOWN   2 
#define btnLEFT   3 
#define btnSELECT 4 
#define btnNONE   5 

// read the buttons 
int read_LCD_buttons() 
{ 
 adc_key_in = analogRead(0);      // read the value from the sensor  
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 
 // we add approx 50 to those values and check to see if we are close 
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result 
 // For V1.1 us this threshold 
 if (adc_key_in < 50)   return btnRIGHT;   
 if (adc_key_in < 250)  return btnUP;  
 if (adc_key_in < 450)  return btnDOWN;  
 if (adc_key_in < 650)  return btnLEFT;  
 if (adc_key_in < 850)  return btnSELECT;   

 // For V1.0 comment the other threshold and use the one below: 
/* 
 if (adc_key_in < 50)   return btnRIGHT;   
 if (adc_key_in < 195)  return btnUP;  
 if (adc_key_in < 380)  return btnDOWN;  
 if (adc_key_in < 555)  return btnLEFT;  
 if (adc_key_in < 790)  return btnSELECT;    
*/ 


 return btnNONE;  // when all others fail, return this... 
} 

void setup() 
{ 
  pinMode(41, OUTPUT);
  lcd.begin(16, 2);              // start the library 
 lcd.setCursor(0,0); 
 lcd.print("Push the buttons"); // print a simple message 
} 
  
void loop() 
{ 
 lcd.setCursor(0,1);            // move to the begining of the second line 
 lcd_key = read_LCD_buttons();  // read the buttons 

 switch (lcd_key)               // depending on which button was pushed, we perform an action 
 { 
   case btnRIGHT: 
     { 
     digitalWrite(41, Relay_Off); 
  lcd.setCursor(7, 1);
  lcd.print("H2-Off");   
     break; 
     } 
   case btnLEFT: 
     { 
     digitalWrite(41, Relay_On); 
  lcd.setCursor(7, 1);
  lcd.print("H2-On ");
     break; 
     } 
   case btnUP: 
     { 
     lcd.print("UP    "); 
     break; 
     } 
   case btnDOWN: 
     { 
     lcd.print("DOWN  "); 
     break; 
     } 
   case btnSELECT: 
     { 
     if(reg==1)
   {reg=0;
  lcd.setCursor(13, 1);
  lcd.print("Aut");}
  else 
   {reg=1;
  lcd.setCursor(13, 1);
  lcd.print("Man");}
     break; 
     } 
     case btnNONE: 
     { 
     lcd.print("NONE  "); 
     break; 
     } 
 } 

}
kirex вне форума   Ответить с цитированием
Старый 30.03.2014, 10:40   #28
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию Re: Акваконтроллер

Если работает, то замечательно, следующий этап - обработка значений датчика температуры. Сначала просто вставь чтение датчика и вывод температуры на LCD. Если работает нормально - тогда добавить переключение реле в зависимости от показаний датчика.
Bulatovor вне форума   Ответить с цитированием
Старый 30.03.2014, 12:02   #29
Bulatovor
Senior Member
 
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 799
Bulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond reputeBulatovor has a reputation beyond repute
По умолчанию Re: Акваконтроллер

Замечания по предыдущему скетчу :
описательную часть
PHP код:
/******************************************************* 

This program will test the LCD panel and the buttons 
Mark Bramwell, July 2010 

********************************************************/ 
уже с полным правом можешь заменить на свое описание программы или просто удалить, чтоб мусора небыло

вот эту часть тоже можно удалить я думаю, вряд ли когда вернешься к старым версиям шилда
PHP код:
// For V1.0 comment the other threshold and use the one below: 
/* 
 if (adc_key_in < 50)   return btnRIGHT;   
 if (adc_key_in < 195)  return btnUP;  
 if (adc_key_in < 380)  return btnDOWN;  
 if (adc_key_in < 555)  return btnLEFT;  
 if (adc_key_in < 790)  return btnSELECT;    
*/ 
Bulatovor вне форума   Ответить с цитированием
Старый 30.03.2014, 17:07   #30
kirex
Member
 
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0
kirex is an unknown quantity at this point
По умолчанию Re: Акваконтроллер

Вот что получилсь:

Код HTML:
#include <LiquidCrystal.h> 
#include <OneWire.h>
#include <DallasTemperature.h>

// select the pins used on the LCD panel 
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); 

OneWire  ds(53);  // Подключаем датчик температуры к 53 цифровому пину

int Relay_Off = HIGH;
int Relay_On = LOW;
int reg=0;// вводим флаг для автоматического (при значении-0) или ручного регулирования -1

// define some values used by the panel and buttons 
int lcd_key     = 0; 
int adc_key_in  = 0; 
#define btnRIGHT  0 
#define btnUP     1 
#define btnDOWN   2 
#define btnLEFT   3 
#define btnSELECT 4 
#define btnNONE   5 

// read the buttons 
int read_LCD_buttons() 
{ 
 adc_key_in = analogRead(0);      // read the value from the sensor  
 // my buttons when read are centered at these valies: 0, 144, 329, 504, 741 
 // we add approx 50 to those values and check to see if we are close 
 if (adc_key_in > 1000) return btnNONE; // We make this the 1st option for speed reasons since it will be the most likely result 
 // For V1.1 us this threshold 
 if (adc_key_in < 50)   return btnRIGHT;   
 if (adc_key_in < 250)  return btnUP;  
 if (adc_key_in < 450)  return btnDOWN;  
 if (adc_key_in < 650)  return btnLEFT;  
 if (adc_key_in < 850)  return btnSELECT;   

 return btnNONE;  // when all others fail, return this... 
} 

void setup() 
{ 
  pinMode(40, OUTPUT);
  pinMode(41, OUTPUT);
  digitalWrite(40, Relay_On);
  digitalWrite(41, Relay_On);
  lcd.begin(16, 2);              // start the library 
} 
  
void loop() 
{ 
 analogWrite(10, 100);
  lcd.setCursor(0,1);            // move to the begining of the second line 
 
 byte i;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  // Ищем алрес датчика
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }

  // Проверяем не было ли помех при передаче
  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // Определяем серию датчика
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();            
  ds.select(addr);       // Выбираем адрес
  ds.write(0x44, 1);     // Производим замер, в режиме паразитного питания
  delay(750);    
  
  ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Считываем оперативную память датчика

  for ( i = 0; i < 9; i++) {           
    data[i] = ds.read();  // Заполняем массив считанными данными
  }

  // Данные о температуре содержатся в первых двух байтах, переведем их в одно значение и преобразуем в шестнадцатиразрядное число
  unsigned int raw = (data[1] << 8) | data[0];
  // Переводим температуру в шкалы по Цельсию и Фаренгейту  
  if (type_s) 
  {
    raw = raw << 3; 
  }
  if (data[7] == 0x10) 
  {
    raw = (raw & 0xFFF0) + 12 - data[6];
  } else {
    byte cfg =  (data[4] & 0x60);
    if (cfg == 0x00) 
      raw = raw << 3; 
    else if  (cfg == 0x20) 
      raw = raw << 2; 
    else if  (cfg == 0x40) \
      raw = raw << 1;
  }  
  
  // Вывод текущего значения температуры на дисплей
  celsius = (float)raw / 16.0;
  lcd.setCursor(0, 0);
  lcd.print("T=");
  lcd.setCursor(2, 0);
  lcd.print(celsius);
  
  delay (10);
  
  celsius =  (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("Temp = ");
  Serial.print(celsius);
  Serial.print(" C, ");
  Serial.print(fahrenheit);
  Serial.println(" F");
  
  // Если температура достигает 28,3 (с погрешностью), отключаем кипятильник 
  if (celsius > 28.3)
  {
     digitalWrite(40, Relay_Off); 
  lcd.setCursor(0, 1);
  lcd.print("H1-Off");   
  }
  if (celsius < 28.0)
  {
     digitalWrite(40, Relay_On); 
  lcd.setCursor(0, 1);
  lcd.print("H1-On ");
  }

// Если температура достигает 28,5 (с погрешностью), отключаем кипятильник 
  if (celsius > 28.5)
  {
     digitalWrite(41, Relay_Off); 
  lcd.setCursor(7, 1);
  lcd.print("H2-Off");
  }
  if (celsius < 28.0)
  {
     digitalWrite(41, Relay_On); 
  lcd.setCursor(7, 1);
  lcd.print("H2-On ");
  }
 
 lcd_key = read_LCD_buttons();  // read the buttons 

 switch (lcd_key)               // depending on which button was pushed, we perform an action 
 { 
   case btnRIGHT: 
     { 
     digitalWrite(41, Relay_Off); 
  lcd.setCursor(7, 1);
  lcd.print("H2-Off");   
     break; 
     } 
   case btnLEFT: 
     { 
     digitalWrite(41, Relay_On); 
  lcd.setCursor(7, 1);
  lcd.print("H2-On ");
     break; 
     } 
   case btnUP: 
     { 
     lcd.print("UP    "); 
     break; 
     } 
   case btnDOWN: 
     { 
     lcd.print("DOWN  "); 
     break; 
     } 
   case btnSELECT: 
     { 
     if(reg==1)
   {reg=0;
  lcd.setCursor(13, 1);
  lcd.print("Aut");}
  else 
   {reg=1;
  lcd.setCursor(13, 1);
  lcd.print("Man");}
     break; 
     } 
     case btnNONE: 
     {  
     break; 
     } 
 } 
}
Пока держишь кнопку реле срабатывает, отпускаешь - возвращается в первоначальное положение.
kirex вне форума   Ответить с цитированием
Ответ


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

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

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

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

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


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


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