Таймер при заданной температуре

roman_2016
Offline
Зарегистрирован: 25.11.2015

Помогите со скетчем.

Нужно только при достижении 10 градусов (и ниже) на DHT22 включать счетчик времени

Затем по достижению 15 градусов выводить в Сериал сколько прошло секунд

нашел скетч - счетчик но принцип фиксирования времени не осилю

 

unsigned long watch_millis;//значение millis() для текущего времени
long watch(long watch_t)//расчет текущего времени
{
unsigned long time_;
long watch_delta;

time_ = millis();

watch_delta = ((time_ - watch_millis)/1000); // изменение в сек
 if (watch_delta>0)
 {
watch_millis = time_;

}

return watch_t + watch_delta;
}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

И не осилите - это невозможно осилить, т.к. это какой-то огрызок, в котором не хватает очень важных вещей (например watch_millis используется раньше, чем получает значение).

roman_2016
Offline
Зарегистрирован: 25.11.2015

вот весь код, но он делает не то что нужно

#include "DHT.h"
#define DHTPIN2 2

long watch_time=0;

DHT dht2(DHTPIN2, DHT22);

void setup() {
Serial.begin(9600);
dht2.begin();

}
void loop() {

int t2 = dht2.readTemperature();

Serial.print(t2);

if(t2<=10)
{
watch_time=watch(watch_time);
}
else
{
watch_time=0;
}

delay(1000);

}

unsigned long watch_millis;//значение millis() для текущего времени
long watch(long watch_t)//расчет текущего времени
{
unsigned long time_;
long watch_delta;

time_ = millis();

watch_delta = ((time_ - watch_millis)/1000); // изменение в сек
 if (watch_delta>0)
{
watch_millis = time_;

}
Serial.println(watch_time);
return watch_t + watch_delta;
}

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1.  watch_millis по-прежнему используется раньше, чем получает значение - выбросьте этот код.

2. Пожалуйста, вставляйте код в соответсвии с правилами форума.

roman_2016
Offline
Зарегистрирован: 25.11.2015

Есть идеи какой код нужно использовать ? - поэтому и прошу помощи

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы не просите помощи, т.к сами Вы ничего не написали - нельзя помочь тому, кто ничего не делает. Нужный Вам код тривиален. Просто сядьте и напишите эти несчастные три строки буквально дословно по Вашему словесному описанию. А вот если уж в этих трёх строках Вы умудритесь чего-то напарить, тогда уж и помощи просите.

roman_2016
Offline
Зарегистрирован: 25.11.2015
#include "DHT.h"
#define DHTPIN2 2

unsigned long watch_time=0;
 boolean  start_time=false;

DHT dht2(DHTPIN2, DHT22);

void setup() {
Serial.begin(9600);
dht2.begin();

}
void loop() {

t2 = dht2.readTemperature();

Serial.println(t2);

if(t2<=10 && start_time=false)
{
watch_time = millis();
start_time=true;
}
else if (t2>=15)
{
watch_time = (millis()-watch_time)/1000;
start_time=false;
Serial.println(watch_time);
}

delay(1000);

}

вот что у меня получилось прошу проверить

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, во-первых, неплохо прикладывать лог - что печатается в строках 18 и 29? Что-то же печатается, так не скрывайте этого.

Во-вторых, Вы смотрели описания библиотеки DHT? Не знаю, какой версией Вы пользуетесь, но вот в этой функция readTemperature описана как:

float readTemperature(bool S=false, bool force=false);

т.е. возвращает она значение типа float. А Вы в 16-ой строке это значение в какой тип засовываете? 

В третьих, переменная watch_time описана в строке 4 как unsigned long. Так зачем Вы в строке 27 её значение к long преобразовываете? Чтобы оно тут же начало преобразовываться обратно?

Ну, а так, запустите, посмотрите что печатает. Если останутся вопросы, поговорим.

roman_2016
Offline
Зарегистрирован: 25.11.2015

про лог - буду в дальнейшем сохранять через COM програмулину в текст и в Excel, поэтому только цифры и точки запятые.

функцию readTemperature работает нормально в том виде как я написал - преобразую в int - так как не нужны десятые.
 

про (bool S=false, bool force=false)  первый раз вижу - понятия не имею для чего это нужно

 watch_time не буду в long преобразовывать - исправлю

 

спасибо

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

roman_2016 пишет:
про лог - буду в дальнейшем сохранять через COM програмулину в текст и в Excel, поэтому только цифры и точки запятые.

Так там не просто цифры! Там то, что Вы считали с датчика и вычисленное время! По-вашему их не нужно анализировать при отладке программы?

roman_2016 пишет:
функцию readTemperature работает нормально в том виде как я написал - преобразую в int - так как не нужны десятые

Не нормально. Если не нужны десятые, то припишите ещё +0.5. Так как у Вас сейчас, она Вам 15.999 до 15 окрулит, т.к. округляет она отбрасыванием дробной части.

roman_2016 пишет:
про (bool S=false, bool force=false)  первый раз вижу

Плохо, что Вы впервые видите библиотеку, которой пользуетесь :)

roman_2016
Offline
Зарегистрирован: 25.11.2015

ЕвгенийП пишет:

roman_2016 пишет:
про лог - буду в дальнейшем сохранять через COM програмулину в текст и в Excel, поэтому только цифры и точки запятые.

Так там не просто цифры! Там то, что Вы считали с датчика и вычисленное время! По-вашему их не нужно анализировать при отладке программы?

На предмет чего их анализировать - датчик выдает через цифровой выход значение температуры?!

Весь анализ будет в видет дат и цифр на графиках в Excel

остальное - ок спасибо

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы, всё-таки не поняли. Поймите на будущее. Куда Вы помещаете свои числа - в эксель или печатаете на бумагу и на стенку вешаете - это Ваше дело. Но, когда Вы просите кого-то посмотреть Вашу программу, то этому человеку надо давать логи потому что так смотреть намного информативнее и человеку легче понимать что происходит. Понимаете? Это на будущее, с данной программой, как я понял, проблем уже нет.

roman_2016
Offline
Зарегистрирован: 25.11.2015

да, спасибо

осталось понять как и для чего использовать (bool S=false, bool force=false)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это опциональные параметры функции. Если их опустить (как Вы делаете), то они оба будут false.

Первый параметер:
   если true - Фаренгейт, если false - Цельсий

Второй параметр:
    если true - обязательно читать с датчика;
    если false - читать с датчика только если последнее чтение было "давнее", чем 2 секунды назад, а если последнее чтоение было менее 2 секунд назад - просто вернуть его результат.

Это всё описано в библиотеке.

roman_2016
Offline
Зарегистрирован: 25.11.2015

спасибо