Помогите новичку с данной переменной "int setTmp=0"

Marlen S
Offline
Зарегистрирован: 13.01.2015

Дорогие форумчане! Помогите с данным кодом пж, не могу сообразить :( не хватает опыта.

За ранее Спасибо всем откликнувшимся. 

Задача заключается в том, что надо указать переменную заданного значения темпиратуры "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);
  }
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

24 строку комментируете, в 7 строке вместо 0 указываете температуру при которой должно выполниться условие включения реле

Marlen S
Offline
Зарегистрирован: 13.01.2015

Спасибо 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
	}
}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
 if ((digitalRead(WaterUP) == HIGH) || (digitalRead(WaterLOW) == HIGH))
  digitalWrite(LedWater, HIGH);
else
  digitalWrite(LedWater, LOW);

Если раствора больше или раствора меньше включаем индикатор, иначе индикатор отключаем.

Marlen S
Offline
Зарегистрирован: 13.01.2015

Правильно ли будет выдать сообщения об о значении переменной реле  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++" );

 

Marlen S
Offline
Зарегистрирован: 13.01.2015
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++" );

}

Это полный код

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

У Вас Cooler_2p уже показывает состояние реле включено/выключено, зачем повторно читать, то что только что установили.
Выводите Cooler_2p на экран и всё.

Marlen S
Offline
Зарегистрирован: 13.01.2015

Я тоже об этом подумал и решил изменить но правильно ли это или нет безпонятий. Посмотри пж

//Проверка условия включения/выключения вентиляции
  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--");
  }

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну скажем так, это будет работать :) Еще один момент у Вас два if и строго больше и меньше стоит. Если температура будет ровна той что в setTmp то Вы не попадёте ни в одно условие, соответственно ничего не включите выключите и не покажите на экране хотя смотря что получить хотим может так и надо.

Marlen S
Offline
Зарегистрирован: 13.01.2015

А как решить это проблему? :)

Marlen S
Offline
Зарегистрирован: 13.01.2015

Что-то типо такого?

 if (temp1==setTmp)
lcd.setCursor(4, 1);
 lcd.print("R1~~");

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Для Вашей задачи это нормально. Если равно будет то просто мимо пройдем и ничего не сделаем. На экране останется текущий статус и все.

Marlen S
Offline
Зарегистрирован: 13.01.2015

Слушай, а при таком условии я не убью реле от быстрого износа? Когда он будет сравнивать постоянно сначения в приделе от +23 и +25.  Просто если он станет на этом уровне то без остановки будет клацать клемами реле.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Никто не будет клацать, проверяется же через && состояние, если оно выключено то еще раз его выключать никто не  удет, так же и с включением. Можно разброс температур увеличить. Можно вместо реле полевик взять, ему не важно сколько раз там его дёрнули

Marlen S
Offline
Зарегистрирован: 13.01.2015

Понял, Спасибо :) 

Можно еще вопрос?) 

Почему когда я вставляю данный код в свой скетч (просто выводить информацию без каких либо дальныйших действий) ардуино начинает подвисать, а точнее уже само управление реле становится лагающим :(

#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);
  }
}

 

Marlen S
Offline
Зарегистрирован: 13.01.2015

Сам код выглядет так:

#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);

}

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Ну как минимум считывание температуры раз в секунду идёт, а сравнение идёт на каждом цикле loop. Смысла в этом нет. К тому же 1 секунда это сильно круто, за такое время температура не поменяется, если только со строительным феном бегать к датчику. А так не знаю, никогда оптимизацией не занимался под ардуинку, всегда хватало.

Marlen S
Offline
Зарегистрирован: 13.01.2015

Где мне что вставить, что бы сократить задержку считывания dht11 хотя бы на 5-10 секунд?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

DHT довольно медленные датчики, время считывания сенсора более 2х секунд, я с ними не работал, как чего ускорить не знаю.