Таймер на потенциометре
- Войдите на сайт для отправки комментариев
Втр, 12/02/2019 - 15:07
Здравствуйте уважаемые!
Прошу помощи,понимаю,что тема не сложная,но бьюсь над ней уже неделю,не понимаю логику работы(
суть проблеммы: нужен таймер ,который будет включать реле на 2 минуты через задананный потенциметром промежуток времени(макс задержка 24 часа).
и выводить информацию на дисплей lcd1602(достаточно в часах или минутах)
это лишь кусочек программы,остальное написанно и работает. а вот таймер никак не победю)
Заранее спасибо за помощь!!!!
Головную тему в этом разделе читали, или ну его нах.
#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); // Выводим значение температуры }Исправился)
Головную тему в этом разделе читали, или ну его нах.
Читаете и осмысливаете это. Читаете про функцию "map".
Рисуете алгоритм работы своего таймера (сразу вопросы: как узнать, что пора начать отсчитывать интервал, что делать если в процессе отсчета значение изменилось и т.д.). Переводите свой алгоритм в код, наслаждаетесь.
а чем таймер запускать? кнопкой? Логика программы будет такая. Создайте два таймера на миллис. Один который вам нужен, .второй на 2минуты для реле.
Также в программе будет еще несколько моментов.
- считывание кнопки;
- считывание потенциометра (в зависимтости от этого показателя меняется величина вашего таймера)
- вывод на экран;
Если кнопка нажата запускаете ваш таймер, по его окончании выключаете ваш таймер и включаете реле и второй таймер. По его окончании выключаете реле и таймер2.
спасибо за правильные вопросы)
таймер запускается сразу после включение ардуино,если во время работы значение изменилось,то начать заново с новым значением
От, теперь алгоритм можно начать сочинять.
а как заставить правильно считывать потанциометр?в смысле чтобы программа понимала что это время
Вы про "map" почитали?
если во время работы значение изменилось,то начать заново с новым значением
при таком алгоритме надо тщательно бороться с дребезгом, иначе программа НИКОГДА не дойдет до срабатывания таймера
при таком алгоритме надо тщательно бороться с дребезгом, иначе программа НИКОГДА не дойдет до срабатывания таймера
Боюсь, это Вы очень далеко заглядываете.))))
получился вот такой код.остались проблемы: возврат таймера в ноль и почемуто не вкл реле
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); } }странно, что реле не включается :) По этому коду оно не должно выключатся
ТС - в этом коде куча ошибок, как в синтаксисе )условие в строке 16 - неверное), так и в логике.
Вы время задаете и отсчитываете совершенно неправильно. У вас максимальный интервал получается 1.5 секунды - вы именно такой хотели? Вроде в начале ветки речь шла о часах...
спасибо КЭП!
поэтому и прошу помощи!
как правильно сделать цикл ,почему 1,5 ,где это прописанно?
А вот еще мне интересно, почему всем неофитам, так впадлу писать алгоритм. Или настолько великими себя чувствуют, что все сразу с головы придумывают? Ну, ну.
спасибо КЭП!
поэтому и прошу помощи!
как правильно сделать цикл ,почему 1,5 ,где это прописанно?
ну знаете, если на прямое указание на ошибку вы отвечаете "спасибо КЭП!" - это что означает? Что вы и без меня ее видите? - так исправляйте
Вы может рассчитывали, что кто-то вам готовый код напишет? - точно не я
я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.
пока что я вижу как слепому говорят что он слепой
а как заставить правильно считывать потанциометр?в смысле чтобы программа понимала что это время
Никак! Считываете с потенциометра напряжение и переводите его в единицы миллис, от 0 до 24 часов
я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.
пока что я вижу как слепому говорят что он слепой
Вам в посте 9 уже подсказали - оператор - map
я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.
пока что я вижу как слепому говорят что он слепой
Пилять, я уже три раза сказал, напиши алгоритм. А это значит, что человеческим языком, по шагам, распиши все действия своей программы. А потом можно операторы к нему прикладывать.
я расчитывал что мне подскажут какой оператор использовать,этого мне достаточно.
да вот оказывается недостаточно. оператор вам подсказали - map - да только что толку. вы ж его использовать не смогли. Потому что не умеете пользоваться миллис, не понимаете, как оно работает. И синтаксис языка знаете нетвердо. И алгоритм заранее не прописали... и многое еще.
Вы думаете. вас кто-то по каждому этому шагу за руку проведет? - У кого-то куча времени? - нет. Вам дали ключевые слова. где у вас главные проблемы - садитесь и читайте учебники.
Да зайка ты мой неноглядный,да открой ты глазки своего великого "Я"
оператор map я использую в самой программе,алгорит написан для всей программы.
А то что я оператор не могу грамотно применить....ТАК И ТЕМА В РАЗДЕЛЕ "ДЛЯ НОВИЧКОВ"
и мы с вами знаем что кода отсилы строк 10;
но так хочется пообщатся,верно?;)
Короче, похоже что сам все знает. Я отваливаю.
вроде как работает,осталось только марофет навести.и можно идти мужу ужин готовить) 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(); } }ОК. Ответьте на вопрос: в 10-ой строке у Вас записано
pVent = map(pVent, 0, 1023, 0, 1440);Что у Вас означает число 1440?
upd. Или 60000 в строке 13 нового скетча
pVent = map(pVent, 0, 1023, 0, 60000);'эти цифры не имееют значения и используются для теста,в конечном варианте они будут равны необхъодымым константам
Т.е., что туда надо подставить для заявленых 24 часов Вы уже определились?
а в этом уже и нет необходимости;)
Это был скетч кухонного таймера, но пока он писался - ужин сбёг с плиты. Поэтому ничего уже не надо.
Это был скетч кухонного таймера, но пока он писался - ужин сбёг с плиты. Поэтому ничего уже не надо.
Позавидовали? И скетчик пописала и мужу ужин приготовила, лепота )))