![]() |
![]() |
#21 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#22 |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]()
Смысл вот в чём:
Допустим в автомате свет включается в 17.00 и выключается в 22.00. Иногда, особенно когда на улице пассмурно, необходимо включить свет например на час, для того чтобы поменять воду или покормить рыб. А потом опять в автомат. Тоже самое с обогревом Н2. Когда меняю воду мне его надо выключить, а потом например через пол часа или через час опять включить в автомат. |
![]() |
![]() |
![]() |
#23 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
теперь в этом примере добавь, кроме вывода на экран, управление реле -пока только кнопками без температурного датчика -сам сможешь? Так дополняя и проверяя скетч и составим программу.
С портом умеешь работать(Serial.print)? -для отладки очень помогает вывод отладочных сообщений У меня просто нет такого железа, поэтому будем так потихонбку составлять программу -заодно и в програмировании разберешься Последний раз редактировалось Bulatovor; 29.03.2014 в 12:25. |
![]() |
![]() |
![]() |
#24 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
Код 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;
}
}
}
|
|
![]() |
![]() |
![]() |
#25 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Замечательно, теперь на кнопку Select добавь изменение флага(типа как в моем примере - изменение значения переменной по вкусу)с ручного режима на автоматический, следующим этапом будет добавление датчика температуры
|
![]() |
![]() |
![]() |
#26 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
Попробую сделать, только ближе к вечеру. Сейчас нужно уехать, обещал детям в парк. До вечера. |
|
![]() |
![]() |
![]() |
#27 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
Код 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;
}
}
}
|
|
![]() |
![]() |
![]() |
#28 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Если работает, то замечательно, следующий этап - обработка значений датчика температуры. Сначала просто вставь чтение датчика и вывод температуры на LCD. Если работает нормально - тогда добавить переключение реле в зависимости от показаний датчика.
|
![]() |
![]() |
![]() |
#29 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Замечания по предыдущему скетчу :
описательную часть PHP код:
вот эту часть тоже можно удалить я думаю, вряд ли когда вернешься к старым версиям шилда PHP код:
|
![]() |
![]() |
![]() |
#30 |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]()
Вот что получилсь:
Код 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; } } } |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
|
|