Помогите новичку с данной переменной "int setTmp=0"
- Войдите на сайт для отправки комментариев
Ср, 21/01/2015 - 20:09
Дорогие форумчане! Помогите с данным кодом пж, не могу сообразить :( не хватает опыта.
За ранее Спасибо всем откликнувшимся.
Задача заключается в том, что надо указать переменную заданного значения темпиратуры "int setTmp=0" уже в самом коде программы. Думаю по самому коду программы Вы поймете что иммею в виду. Код нашел в интернете и он мне подошел, решил немного упрастить. Так как изначально данную переменную управляли с клавиатуры lcd шилда, а у меня её нет да и ненужна, я решил вбить её сразу в код.
OneWire oneWire(10); // Термометр будет подключен на Pin 10
DallasTemperature sensors(&oneWire); // Создаем объект sensors, подключенный по OneWire
// Создаем переменные для работы с термометром
DeviceAddress tempDeviceAddress; // переменная для хранения адреса датчика
float temp1=0; // переменная для текущего значения температуры
int setTmp=0; // переменная для заданного значения температуры
// Реле подключено к пину D11
#define RELAY_PIN 11
// Объявим переменную для хранения состояния реле
boolean relayStatus1=LOW;
// Объявим переменные для задания задержки
long previousMillis1 = 0;
long interval1 = 1000; // интервал опроса датчиков температуры
void setup() {
//Настроим пин для управления реле
pinMode(RELAY_PIN,OUTPUT);
digitalWrite(RELAY_PIN,LOW);
//Считаем из постоянной памяти заданную температуру
setTmp=EEPROM_read_byte(0);
// Инициализируем термодатчик и установим разрешающую способность 12 бит
sensors.begin();
sensors.getAddress(tempDeviceAddress, 0);
sensors.setResolution(12);
}
void loop(){
// Модуль опроса датчиков и получения сведений о температуре
// Вызывается 1 раз в секунду
unsigned long currentMillis1 = millis();
if(currentMillis1 - previousMillis1 > interval1)
{
previousMillis1 = currentMillis1;
// Запуск процедуры измерения температуры
sensors.setWaitForConversion(false);
sensors.requestTemperatures();
sensors.setWaitForConversion(true);
// Считывание значения температуры
sensors.getAddress(tempDeviceAddress, 0);
temp1=sensors.getTempC(tempDeviceAddress);
// Вывод текущего значения температуры на дисплей
lcd.setCursor(0, 0);
lcd.print("T1:");
lcd.setCursor(3, 0);
lcd.print(temp1);
}
//Проверка условия включения/выключения нагревателя
if (temp1<setTmp&&relayStatus1==LOW)
{
relayStatus1=HIGH;
digitalWrite(RELAY_PIN,HIGH);
}
if (temp1>setTmp&&relayStatus1==HIGH)
{
relayStatus1=LOW;
digitalWrite(RELAY_PIN,LOW);
}
}
24 строку комментируете, в 7 строке вместо 0 указываете температуру при которой должно выполниться условие включения реле
Спасибо Penni.
Что бы не флудить на форуме создавая новые темы решил запилить сюда еще один вопрос.
Это проверка уровня раствора в ёмкости.
Как правильно будет описать данную функцию рамера воды? Нужно если уровень раствора больше то включаем индекатор, но если раствора меньше тоже ключаем индекатор притом что если уровень раствора не больне и не меньше индекатор выключен. Правильно ли я описал ниже и что можно именить что бы было правильнее, вроде так.
За ранее спасибо.
// Уровень раствора int WaterUP = 2; // Индикатор работы питания акб int WaterLOW = 3; // Индикатор работы питания сети int LedWater = 8; // Индекатор уровня раствора void setup() { pinMode(WaterUP, INPUT); // Вход датчика уровня раствора pinMode(WaterLOW, INPUT); // Вход датчика уровня раствора pinMode(LedWater, OUTPUT); // Выход датчика уровня раствора digitalWrite(WaterUP, LOW); digitalWrite(WaterLOW, LOW); } void loop() { // Проверяем уровень раствора if (digitalRead(WaterUP) == HIGH); // Если контакт включен отключаем сигнал на порту 8 { digitalWrite(LedWater, LOW); // отключение индекатора LedWater } if (digitalRead(WaterLOW) == LOW); // Если порт включен подаем сигнал на порт 8 { digitalWrite(LedWater, HIGH); // включение индекатора LedWater } }Если раствора больше или раствора меньше включаем индикатор, иначе индикатор отключаем.
Правильно ли будет выдать сообщения об о значении переменной реле Cooler_2 на lcd 1602 в таком плане кода?
if (temp1>setTmp&&Cooler_2p==LOW) { Cooler_2p=HIGH; digitalWrite(Cooler_2,HIGH); } if (temp1<setTmp&&Cooler_2p==HIGH) { Cooler_2p=LOW; digitalWrite(Cooler_2,LOW); } //Выдаем значение реле Cooler_2 на LCD int Val = !digitalRead(Cooler_2); digitalWrite(int Val = !digitalRead(Cooler_2); digitalWrite(Cooler_2, Val); lcd.setCursor( 4, 1 ); lcd.print( Val ? "R1--" : "R1++" ); , Val); lcd.setCursor( 4, 1 ); lcd.print( Val ? "R1--" : "R1++" );OneWire oneWire(10); // Термометр будет подключен на Pin 10 DallasTemperature sensors(&oneWire); // Создаем объект sensors, подключенный по OneWire // Создаем переменные для работы с термометром DeviceAddress tempDeviceAddress; // переменная для хранения адреса датчика float temp1=0; // переменная для текущего значения температуры int setTmp=24; // переменная для заданного значения температуры boolean Cooler_2p=LOW; //Переменна для хранения состояния реле вентиляции long previousMillis1 = 0; // Объявим переменные для задания задержки long interval1 = 1000; // интервал опроса датчиков температуры int Cooler_2 = 5; // Реле для вентиляции void setup(){ pinMode(Cooler_2, OUTPUT); // вывод нагрузки R2 digitalWrite(Cooler_2, HIGH); // Инициализируем термодатчик и установим разрешающую способность 12 бит sensors.begin(); sensors.getAddress(tempDeviceAddress, 0); sensors.setResolution(12); } void loop(){ // Модуль опроса датчиков и получения сведений о температуре // Вызывается 1 раз в секунду unsigned long currentMillis1 = millis(); if(currentMillis1 - previousMillis1 > interval1) { previousMillis1 = currentMillis1; // Запуск процедуры измерения температуры sensors.setWaitForConversion(false); sensors.requestTemperatures(); sensors.setWaitForConversion(true); // Считывание значения температуры sensors.getAddress(tempDeviceAddress, 0); temp1=sensors.getTempC(tempDeviceAddress); // Вывод текущего значения температуры на дисплей lcd.setCursor(0, 0); lcd.print("T1:"); lcd.setCursor(3, 0); lcd.print(temp1); } //Проверка условия включения/выключения вентиляции if (temp1>setTmp&&Cooler_2p==LOW) { Cooler_2p=HIGH; digitalWrite(Cooler_2,HIGH); } if (temp1<setTmp&&Cooler_2p==HIGH) { Cooler_2p=LOW; digitalWrite(Cooler_2,LOW); } //Выдаем значение реле Cooler_2 на LCD int Val = !digitalRead(Cooler_2); digitalWrite(int Val = !digitalRead(Cooler_2); digitalWrite(Cooler_2, Val); lcd.setCursor( 4, 1 ); lcd.print( Val ? "R1--" : "R1++" ); , Val); lcd.setCursor( 4, 1 ); lcd.print( Val ? "R1--" : "R1++" ); }Это полный код
У Вас Cooler_2p уже показывает состояние реле включено/выключено, зачем повторно читать, то что только что установили.
Выводите Cooler_2p на экран и всё.
Я тоже об этом подумал и решил изменить но правильно ли это или нет безпонятий. Посмотри пж
//Проверка условия включения/выключения вентиляции if (temp1>setTmp&&Cooler_2p==LOW) { Cooler_2p=HIGH; digitalWrite(Cooler_2,HIGH); lcd.setCursor(4, 1); lcd.print("R1++"); } if (temp1<setTmp&&Cooler_2p==HIGH) { Cooler_2p=LOW; digitalWrite(Cooler_2,LOW); lcd.setCursor(4, 1); lcd.print("R1--"); }Ну скажем так, это будет работать :) Еще один момент у Вас два if и строго больше и меньше стоит. Если температура будет ровна той что в setTmp то Вы не попадёте ни в одно условие, соответственно ничего не включите выключите и не покажите на экране хотя смотря что получить хотим может так и надо.
А как решить это проблему? :)
Что-то типо такого?
if (temp1==setTmp) lcd.setCursor(4, 1); lcd.print("R1~~");Для Вашей задачи это нормально. Если равно будет то просто мимо пройдем и ничего не сделаем. На экране останется текущий статус и все.
Слушай, а при таком условии я не убью реле от быстрого износа? Когда он будет сравнивать постоянно сначения в приделе от +23 и +25. Просто если он станет на этом уровне то без остановки будет клацать клемами реле.
Никто не будет клацать, проверяется же через && состояние, если оно выключено то еще раз его выключать никто не удет, так же и с включением. Можно разброс температур увеличить. Можно вместо реле полевик взять, ему не важно сколько раз там его дёрнули
Понял, Спасибо :)
Можно еще вопрос?)
Почему когда я вставляю данный код в свой скетч (просто выводить информацию без каких либо дальныйших действий) ардуино начинает подвисать, а точнее уже само управление реле становится лагающим :(
#include "DHT.h" #define DHTPIN 11 #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE); void setup() { dht.begin(); } void loop() { float h = dht.readHumidity(); float t = dht.readTemperature(); if (isnan(t) || isnan(h)) { lcd.setCursor(8, 0); lcd.print("*Failed*"); } else { lcd.setCursor(8, 0); lcd.print("C:"); lcd.setCursor(10, 0); lcd.print(t); lcd.setCursor(12, 0); lcd.print("H:"); lcd.setCursor(14, 0); lcd.print(h); } }Сам код выглядет так:
#include <Wire.h> // for i2c protocol #include <OneWire.h> // for DS18B20 #include <DallasTemperature.h> //#include "DHT.h" #include <LiquidCrystal_I2C.h> //#define DHTPIN 11 //#define DHTTYPE DHT11 // DHT 11 //DHT dht(DHTPIN, DHTTYPE); OneWire oneWire(10); // Термометр будет подключен на Pin 10 DallasTemperature sensors(&oneWire); // Создаем объект sensors, подключенный по OneWire // Создаем переменные для работы с термометром DeviceAddress tempDeviceAddress; // переменная для хранения адреса датчика float temp1=0; // переменная для текущего значения температуры int setTmp=24; // переменная для заданного значения температуры boolean Cooler_2p=LOW; //Переменна для хранения состояния реле вентиляции long previousMillis1 = 0; // Объявим переменные для задания задержки long interval1 = 1000; // интервал опроса датчиков температуры LiquidCrystal_I2C lcd(0x27,16,2); // Уровень раствора int WaterUP = 2; // Индикатор работы питания акб int WaterLOW = 3; // Индикатор работы питания сети int LedWater = 8; // Индекатор уровня раствора // Реле int Light_1 = 4; // Реле для освещения int Cooler_2 = 5; // Реле для вентиляции int Pump_3 = 6; // Реле управления помпой - поливом int Aero_4 = 7; // Реле управление аэрации ёмкости void setup(){ Serial.begin(9600); // Инициализируем COM-порт // dht.begin(); lcd.init(); lcd.backlight(); lcd.begin(16, 2); lcd.setCursor(2, 0); lcd.print("Hydroponics"); lcd.setCursor(3, 1); lcd.print("Controller"); delay(5000); lcd.clear(); pinMode(WaterUP, INPUT); // Вход датчика уровня раствора pinMode(WaterLOW, INPUT); // Вход датчика уровня раствора pinMode(LedWater, OUTPUT); // Выход датчика уровня раствора pinMode(Light_1, OUTPUT); // вывод нагрузки R1 pinMode(Cooler_2, OUTPUT); // вывод нагрузки R2 pinMode(Pump_3, OUTPUT); // вывод нагрузки R3 pinMode(Aero_4, OUTPUT); // вывод нагрузки R4 digitalWrite(Light_1, HIGH); digitalWrite(Cooler_2, HIGH); digitalWrite(Pump_3, HIGH); digitalWrite(Aero_4, HIGH); digitalWrite(WaterUP, LOW); digitalWrite(WaterLOW, LOW); // Инициализируем термодатчик и установим разрешающую способность 12 бит sensors.begin(); sensors.getAddress(tempDeviceAddress, 0); sensors.setResolution(12); } void loop(){ // Проверяем Serial порт, если получим значение включаем порты реле if (Serial.available() > 0) { int i = Serial.read()-48; if(i == 1) { int Val = !digitalRead(Light_1); digitalWrite(Light_1, Val); lcd.setCursor( 0, 1 ); lcd.print( Val ? "R1--" : "R1++" ); } if(i == 3) { int Val = !digitalRead(Pump_3); digitalWrite(Pump_3, Val); lcd.setCursor( 8, 1 ); lcd.print( Val ? "R1--" : "R1++" ); } if(i == 4) { int Val = !digitalRead(Aero_4); digitalWrite(Aero_4, Val); lcd.setCursor( 12, 1 ); lcd.print( Val ? "R1--" : "R1++" ); } } // Модуль опроса датчиков и получения сведений о температуре // Вызывается 1 раз в секунду unsigned long currentMillis1 = millis(); if(currentMillis1 - previousMillis1 > interval1) { previousMillis1 = currentMillis1; // Запуск процедуры измерения температуры sensors.setWaitForConversion(false); sensors.requestTemperatures(); sensors.setWaitForConversion(true); // Считывание значения температуры sensors.getAddress(tempDeviceAddress, 0); temp1=sensors.getTempC(tempDeviceAddress); // Вывод текущего значения температуры на дисплей lcd.setCursor(0, 0); lcd.print("T1:"); lcd.setCursor(3, 0); lcd.print(temp1); } //Проверка условия включения/выключения вентиляции if (temp1>setTmp&&Cooler_2p==LOW) { Cooler_2p=HIGH; digitalWrite(Cooler_2,HIGH); lcd.setCursor(4, 1); lcd.print("R1++"); } if (temp1<setTmp&&Cooler_2p==HIGH) { Cooler_2p=LOW; digitalWrite(Cooler_2,LOW); lcd.setCursor(4, 1); lcd.print("R1--"); } // // Датчик DHT11 // float h = dht.readHumidity(); // float t = dht.readTemperature(); // // if (isnan(t) || isnan(h)) // { // lcd.setCursor(8, 0); // lcd.print("*Failed*"); // } // else // { // lcd.setCursor(8, 0); // lcd.print("C:"); // lcd.setCursor(10, 0); // lcd.print(t); // lcd.setCursor(12, 0); // lcd.print("H:"); // lcd.setCursor(14, 0); // lcd.print(h); // } // Проверяем уровень раствора if ((digitalRead(WaterUP) == HIGH) || (digitalRead(WaterLOW) == HIGH)) digitalWrite(LedWater, HIGH); else digitalWrite(LedWater, LOW); if ((digitalRead(WaterUP) == LOW) || (digitalRead(WaterLOW) == LOW)) digitalWrite(LedWater, HIGH); else digitalWrite(LedWater, LOW); }Ну как минимум считывание температуры раз в секунду идёт, а сравнение идёт на каждом цикле loop. Смысла в этом нет. К тому же 1 секунда это сильно круто, за такое время температура не поменяется, если только со строительным феном бегать к датчику. А так не знаю, никогда оптимизацией не занимался под ардуинку, всегда хватало.
Где мне что вставить, что бы сократить задержку считывания dht11 хотя бы на 5-10 секунд?
DHT довольно медленные датчики, время считывания сенсора более 2х секунд, я с ними не работал, как чего ускорить не знаю.