Таймер на потенциометре

Trupp
Offline
Зарегистрирован: 12.02.2019

Здравствуйте уважаемые!

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

суть проблеммы: нужен таймер ,который будет включать реле на 2 минуты через задананный потенциметром промежуток времени(макс задержка 24 часа).

и выводить информацию на дисплей lcd1602(достаточно в часах или минутах)

это лишь кусочек программы,остальное написанно и работает. а вот таймер никак не победю)

Заранее спасибо за помощь!!!!

 

 

 

bwn
Offline
Зарегистрирован: 25.08.2014

Головную тему в этом разделе читали, или ну его нах.

Trupp
Offline
Зарегистрирован: 12.02.2019

#include <Wire.h> // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#define DHTPIN A0 // к какому пину будет подключен сигнальный выход датчика
#define DHTTYPE DHT22 // DHT 22 (AM2302)
//инициализация датчика
DHT dht(DHTPIN, DHTTYPE);
byte degree[8] = // кодируем символ градуса
{
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
};
LiquidCrystal_I2C lcd(0x27,16,2); // Задаем адрес и размерность дисплея
int Holod = 2;
int Vent = 3;
int Sushit = 4;
int Uvla= 5;
void setup()
{                
  pinMode(Holod, OUTPUT);
  pinMode(Vent, OUTPUT);
  pinMode(Sushit, OUTPUT);
  pinMode(Uvla, OUTPUT);     
lcd.init(); // Инициализация lcd
lcd.backlight(); // Включаем подсветку
lcd.createChar(1, degree); // Создаем символ под номером 1
Serial.begin(9600);
dht.begin();
}
void loop() {
// Добавляем паузы в несколько секунд между измерениями
delay(500);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
int h = dht.readHumidity();
// Read temperature as Celsius
int t = dht.readTemperature();
// Read temperature as Fahrenheit
int f = dht.readTemperature(true);
  int pTemp = analogRead(1);
  pTemp = map(pTemp, 0, 1023, 0, 100);
  int pVla = analogRead(2);
  pVla = map(pVla, 0, 1023, 0, 100);
// Выводим показания влажности и температуры
digitalWrite(Holod, HIGH);  
 digitalWrite(Vent, HIGH);   
 digitalWrite(Sushit, HIGH); 
 digitalWrite(Uvla, HIGH);  
 if(t > pTemp){
 digitalWrite(Holod, LOW); 
}
else
{ 
digitalWrite(Holod, HIGH);
 } 
 if(h > pVla){
 digitalWrite(Sushit, LOW); 
}
else{ 
digitalWrite(Sushit, HIGH);
 } 
if(h < pVla){
 digitalWrite(Uvla, LOW); 
}
else{ 
digitalWrite(Uvla, HIGH);
}
lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки
lcd.print("DV= % "); // Выводим текст
lcd.setCursor(2, 0); // Устанавливаем курсор на 7 символ
lcd.print(h, 1); // Выводим на экран значение влажности
lcd.setCursor(6, 0); // Устанавливаем курсор в начало 2 строки
lcd.print("DT= C "); // Выводим текст, \1 - значок градуса
lcd.setCursor(8, 0); // Устанавливаем курсор на 7 символ
lcd.print(t,1); // Выводим значение температуры
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 1 строки
lcd.print("ZV= %"); // Выводим текст
lcd.setCursor(0, 1); // Устанавливаем курсор в начало 1 строки
lcd.print("ZV= % "); // Выводим текст
lcd.setCursor(2, 1); // Устанавливаем курсор на 7 символ
lcd.print(pVla, 1); // Выводим на экран значение влажности
lcd.setCursor(6, 1); // Устанавливаем курсор в начало 2 строки
lcd.print("ZT= C "); // Выводим текст, \1 - значок градуса
lcd.setCursor(8, 1); // Устанавливаем курсор на 7 символ
lcd.print(pTemp,1); // Выводим значение температуры

}

 

Trupp
Offline
Зарегистрирован: 12.02.2019

Исправился)

bwn пишет:

Головную тему в этом разделе читали, или ну его нах.

bwn
Offline
Зарегистрирован: 25.08.2014

Читаете и осмысливаете это. Читаете про функцию "map". 
Рисуете алгоритм работы своего таймера (сразу вопросы: как узнать, что пора начать отсчитывать интервал, что делать если в процессе отсчета значение изменилось и т.д.). Переводите свой алгоритм в код, наслаждаетесь.

MaksVV
Offline
Зарегистрирован: 06.08.2015

а чем таймер запускать? кнопкой?  Логика программы будет такая. Создайте два таймера на миллис. Один который вам нужен, .второй на 2минуты для реле. 

Также в программе будет еще несколько моментов. 

- считывание кнопки; 

- считывание потенциометра (в зависимтости от этого показателя меняется величина вашего таймера)

- вывод на экран;

Если кнопка нажата запускаете ваш таймер, по его окончании выключаете ваш таймер и включаете реле и второй таймер. По его окончании выключаете реле и таймер2. 

Trupp
Offline
Зарегистрирован: 12.02.2019

спасибо за правильные вопросы)

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

bwn
Offline
Зарегистрирован: 25.08.2014

От, теперь алгоритм можно начать сочинять.

Trupp
Offline
Зарегистрирован: 12.02.2019

а как заставить правильно считывать потанциометр?в смысле чтобы программа понимала что это время

bwn
Offline
Зарегистрирован: 25.08.2014

Вы про "map" почитали?

b707
Offline
Зарегистрирован: 26.05.2017

Trupp пишет:

если во время работы значение изменилось,то начать заново с новым значением

при таком алгоритме надо тщательно бороться с дребезгом, иначе программа НИКОГДА не дойдет до срабатывания таймера

bwn
Offline
Зарегистрирован: 25.08.2014

b707 пишет:

при таком алгоритме надо тщательно бороться с дребезгом, иначе программа НИКОГДА не дойдет до срабатывания таймера

Боюсь, это Вы очень далеко заглядываете.))))

Trupp
Offline
Зарегистрирован: 12.02.2019

получился вот такой код.остались проблемы: возврат таймера в ноль и почемуто не вкл реле

unsigned long time;
int Vent = 3;
void setup(){
Serial.begin(9600);
pinMode(Vent, OUTPUT);
}
void loop(){
  digitalWrite(Vent, HIGH);
int pVent=analogRead(3);
pVent = map(pVent, 0, 1023, 0, 1440);
Serial.print(time);
time = millis()/1000; // запомнить значение времени
Serial.println(time);// отправка информации через последовательный порт
Serial.println(pVent);
delay(1000);
if(time = pVent){
 digitalWrite(Vent,LOW);
}
else{ 
digitalWrite(Vent, HIGH);
 } 
}

 

b707
Offline
Зарегистрирован: 26.05.2017

странно, что реле не включается :) По этому коду оно не должно выключатся

ТС - в этом коде куча ошибок, как в синтаксисе )условие в строке 16 - неверное), так и в логике.

Вы время задаете и отсчитываете совершенно неправильно. У вас максимальный интервал получается 1.5 секунды - вы именно такой хотели? Вроде в начале ветки речь шла о часах...

Trupp
Offline
Зарегистрирован: 12.02.2019

спасибо КЭП!

поэтому и прошу помощи!

как правильно сделать цикл ,почему 1,5 ,где это прописанно?

bwn
Offline
Зарегистрирован: 25.08.2014

А вот еще мне интересно, почему всем неофитам, так впадлу писать алгоритм. Или настолько великими себя чувствуют, что все сразу с головы придумывают? Ну, ну.

b707
Offline
Зарегистрирован: 26.05.2017

Trupp пишет:

спасибо КЭП!

поэтому и прошу помощи!

как правильно сделать цикл ,почему 1,5 ,где это прописанно?

ну знаете, если на прямое указание на ошибку вы отвечаете "спасибо КЭП!" - это что означает? Что вы и без меня ее видите? - так исправляйте

Вы может рассчитывали, что кто-то вам готовый код напишет? - точно не я

Trupp
Offline
Зарегистрирован: 12.02.2019

я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.

пока что я вижу как слепому говорят что он слепой

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Trupp пишет:

а как заставить правильно считывать потанциометр?в смысле чтобы программа понимала что это время

Никак! Считываете с потенциометра напряжение и переводите его в единицы миллис, от 0 до 24 часов

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Trupp пишет:

я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.

пока что я вижу как слепому говорят что он слепой

Вам в посте 9 уже подсказали - оператор  - map

bwn
Offline
Зарегистрирован: 25.08.2014

Trupp пишет:

я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.

пока что я вижу как слепому говорят что он слепой

Пилять, я уже три раза сказал, напиши алгоритм. А это значит, что человеческим языком, по шагам, распиши все действия своей программы. А потом можно операторы к нему прикладывать.

b707
Offline
Зарегистрирован: 26.05.2017

Trupp пишет:

я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.

 

да вот оказывается недостаточно. оператор вам подсказали - map - да только что толку. вы ж его использовать не смогли. Потому что не умеете пользоваться миллис, не понимаете, как оно работает. И синтаксис языка знаете нетвердо. И алгоритм заранее не прописали... и многое еще.

Вы думаете. вас кто-то по каждому этому шагу за руку проведет? - У кого-то куча времени? - нет. Вам дали ключевые слова. где у вас главные проблемы - садитесь и читайте учебники.

 

Trupp
Offline
Зарегистрирован: 12.02.2019

Да зайка ты мой неноглядный,да открой ты глазки своего великого "Я"

оператор map я использую в самой программе,алгорит написан для всей программы.

А то что я оператор не могу грамотно применить....ТАК  И ТЕМА В РАЗДЕЛЕ "ДЛЯ НОВИЧКОВ"

и мы с вами знаем что кода отсилы строк 10;

но так хочется пообщатся,верно?;)

 

bwn
Offline
Зарегистрирован: 25.08.2014

Короче, похоже что сам все знает. Я отваливаю.

Trupp
Offline
Зарегистрирован: 12.02.2019
вроде как работает,осталось только марофет навести.и можно идти  мужу ужин готовить)
int relay =3 ;
 
void setup()
{
  Serial.begin(9600);
  pinMode(relay, OUTPUT);
}
 
void loop()
{
  int pVent=analogRead(3);
  pVent = map(pVent, 0, 1023, 0, 60000);
  Serial.println(pVent);
delay(1000);
  static bool state;
  static unsigned long time;
  if((millis() - time) > (state ? pVent : 1000))
  {
    state = !state;
    digitalWrite(relay, state);
    time = millis();
  } 
}

 

vk007
Offline
Зарегистрирован: 16.06.2015

ОК. Ответьте на вопрос: в 10-ой строке у Вас записано

pVent = map(pVent, 0, 1023, 0, 1440);

Что у Вас означает число 1440?

upd. Или 60000 в строке 13 нового скетча

  pVent = map(pVent, 0, 1023, 0, 60000);

Trupp
Offline
Зарегистрирован: 12.02.2019

'эти цифры не имееют значения и используются для теста,в конечном варианте они будут равны необхъодымым константам

vk007
Offline
Зарегистрирован: 16.06.2015

Т.е., что туда надо подставить для заявленых 24 часов Вы уже определились?

Trupp
Offline
Зарегистрирован: 12.02.2019

а в этом уже и нет необходимости;)

sadman41
Offline
Зарегистрирован: 19.10.2016

Это был скетч кухонного таймера, но пока он писался - ужин сбёг с плиты. Поэтому ничего уже не надо.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

sadman41 пишет:

Это был скетч кухонного таймера, но пока он писался - ужин сбёг с плиты. Поэтому ничего уже не надо.

Позавидовали? И скетчик пописала и мужу ужин приготовила, лепота )))