![]() |
|
![]() |
#1 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Если работает, то замечательно, следующий этап - обработка значений датчика температуры. Сначала просто вставь чтение датчика и вывод температуры на LCD. Если работает нормально - тогда добавить переключение реле в зависимости от показаний датчика.
|
![]() |
![]() |
![]() |
#2 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Замечания по предыдущему скетчу :
описательную часть PHP код:
вот эту часть тоже можно удалить я думаю, вряд ли когда вернешься к старым версиям шилда PHP код:
|
![]() |
![]() |
![]() |
#3 |
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; } } } |
![]() |
![]() |
![]() |
#4 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Все правильно, пока кнопка нажата -работает, как только отпускаешь выполняется программа обработки по датчику температуры. Заключи выполнение этой программы только при вополнении усовия регилирования по автомату т.е когда флаг = 0
PHP код:
|
![]() |
![]() |
![]() |
#5 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
Куда дальше будем двигаться?
1. Можно прикручивать часы реального времени и управление светом. 2. Пока мы на стадии кнопок я бы предложил изменить твою логику управления сразу. Потому как привязывать к кнопкам по одному действию ущербно. Лучше сразу селектом выбирать режим и в соответствии с ним назначать действия кнопок и отображения на LCD- так сказать система подменю - будет гораздо больше возможностей управления. |
![]() |
![]() |
![]() |
#7 | |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() Цитата:
Теперь надо управление светом в ручном режиме. 2. Да мне надо то кнопками включать и выключать обогрев и основной свет, поэтому сильно не заморачиваюсь. |
|
![]() |
![]() |
![]() |
#8 |
Senior Member
Регистрация: 20.01.2013
Адрес: Уфа
Сообщений: 444
Вес репутации: 800 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
![]()
свет аналогично - кнопка пишет значение PWM в порт, а обработку по времени так же в условие по reg==0
|
![]() |
![]() |
![]() |
#9 |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]() |
![]() |
![]() |
![]() |
#10 |
Member
Регистрация: 24.03.2014
Сообщений: 38
Вес репутации: 0 ![]() |
![]()
Вот так просто выключается и включается без плавности.
Код HTML:
case btnUP: { analogWrite(PWM_LW_PIN, pwm_LW); analogWrite(PWM_LR_PIN, pwm_LR); break; } case btnDOWN: { analogWrite(PWM_LW_PIN, 0); analogWrite(PWM_LR_PIN, 0); break; } |
![]() |
![]() |
![]() |
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1) | |
Опции темы | Поиск в этой теме |
Опции просмотра | |
|
|