Сигнализатор температуры

Ижанитович
Offline
Зарегистрирован: 02.12.2018

Всем привет!

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

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

Пока что вопросов нету, просто такий мини расказ о первых шагах )

Скетч

int temp; // освобождаем память для переменной "temp"
float grad; // освобождаем память для переменной "grad"

void setup() // процедура setup
{
  pinMode(4, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A3, INPUT); // сенсор LM35 подключим к аналоговому входу A0
  Serial.begin(9600); // подключаем монитор порта
}

void loop() // процедура loop
{
  temp = analogRead(A3); // переменная находится в интервале 0 - 1023
  grad = ( temp/1023.0 )*5.0*1000/10; // формулу можно изменять
  Serial.println(grad); // выводим значение датчика на монитор
  delay(1000); // ставим небольшую задержку
  if (grad > 48)
  noTone(4);
  else
  tone(4, 2000);  // pinMode(13, HIGH); 
  }

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

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

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

К такому сигнализатору лучше сразу добавить еще одно условие и реализовать гистерезис.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ижанитович пишет:
Пока что вопросов нету, просто такий мини расказ о первых шагах )
Ну раз нет вопросов, то оставлю тут. В работе не проверял

/**/
const byte BeepPin =/*пин*/4;
const byte LedPin =/*пин*/13;
const byte SensPin =/*пин*/A3;
const int MaxTemp = 48;
enum state_t {sLOW = 0, sHIGH} state;
void stand(state_t s) {
  state = s;
  switch (state) {
    case sLOW :
      noTone(BeepPin);
      pinMode(LedPin, HIGH);
      break;
    case sHIGH :
      tone(BeepPin, 2000);
      pinMode(LedPin, HIGH);
      break;
  }
}
unsigned long past = 0;
//-----------------------------
void setup() {
  Serial.begin(9600); // подключаем монитор порта
  pinMode(BeepPin, OUTPUT);
  pinMode(LedPin, OUTPUT);
  pinMode(SensPin , INPUT); // сенсор LM35 подключим к аналоговому входу A0
}

void loop() {
  if (millis() - past >= 1000) {
    past = millis();
    float grad = ( analogRead(SensPin ) / 1023.0 ) * 5.0 * 1000 / 10; // формулу можно изменять
    Serial.println(grad); // выводим значение датчика на монитор
    switch (state) {
      case sLOW :
        if (grad >= MaxTemp)stand( sHIGH);
        break;
      case sHIGH :
        if (grad < MaxTemp - 1)stand(sLOW);
        break;
    }
  }
}
/**/

 

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Ижанитович пишет:
Наступила зима, и пришло время снова его запустить, за вечер набросал скетч, собрав по кусочкам с разных статей. Первые запуски, питаясь от юсб входа, прошли успешно!

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

По дашику для измерения отрицательных температур его в минус тянуть нужно, от источника питания юсб или какого либо другого стабилизированного однополярного источника измерения температуры +2...+150. Как вы датчик подключаете для измерения отрицательных температур? Я даласами разными пользовался, хочу попробовать и этот датчик.

Ижанитович
Offline
Зарегистрирован: 02.12.2018

sadman41 пишет:

К такому сигнализатору лучше сразу добавить еще одно условие и реализовать гистерезис.

После прочтения заглянул в вики, но еще больше запутался, оставил до лучших времен это слово ) но все равно спасибо за вариант!

qwone пишет:

Ну раз нет вопросов, то оставлю тут. В работе не проверял

/**/
const byte BeepPin =/*пин*/4;
const byte LedPin =/*пин*/13;
const byte SensPin =/*пин*/A3;
const int MaxTemp = 48;
enum state_t {sLOW = 0, sHIGH} state;
void stand(state_t s) {
  state = s;
  switch (state) {
    case sLOW :
      noTone(BeepPin);
      pinMode(LedPin, HIGH);
      break;
    case sHIGH :
      tone(BeepPin, 2000);
      pinMode(LedPin, HIGH);
      break;
  }
}
unsigned long past = 0;
//-----------------------------
void setup() {
  Serial.begin(9600); // подключаем монитор порта
  pinMode(BeepPin, OUTPUT);
  pinMode(LedPin, OUTPUT);
  pinMode(SensPin , INPUT); // сенсор LM35 подключим к аналоговому входу A0
}

void loop() {
  if (millis() - past >= 1000) {
    past = millis();
    float grad = ( analogRead(SensPin ) / 1023.0 ) * 5.0 * 1000 / 10; // формулу можно изменять
    Serial.println(grad); // выводим значение датчика на монитор
    switch (state) {
      case sLOW :
        if (grad >= MaxTemp)stand( sHIGH);
        break;
      case sHIGH :
        if (grad < MaxTemp - 1)stand(sLOW);
        break;
    }
  }
}
/**/

Спасибо, как только налажу питание и помехи, попробую изучить ваш код!

Алексей. пишет:

По дашику для измерения отрицательных температур его в минус тянуть нужно, от источника питания юсб или какого либо другого стабилизированного однополярного источника измерения температуры +2...+150. Как вы датчик подключаете для измерения отрицательных температур?

Читал про это, там типовая схема приводится но разбиратся не стал. В моем случае температуры плюсовые, важно получит сигнал когда труба горячая, но уже ниже чем рабочая температура системы. В будущем попробую и минус измерить, но уже с другой платой, но это на пятилетку задача)

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

Ижанитович пишет:

sadman41 пишет:

К такому сигнализатору лучше сразу добавить еще одно условие и реализовать гистерезис.

После прочтения заглянул в вики, но еще больше запутался, оставил до лучших времен это слово ) но все равно спасибо за вариант!

https://helpiks.org/8-11314.html - тут всё разрисовано.

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

Ижанитович пишет:

sadman41 пишет:

К такому сигнализатору лучше сразу добавить еще одно условие и реализовать гистерезис.

После прочтения заглянул в вики, но еще больше запутался, оставил до лучших времен это слово ) но все равно спасибо за вариант!

Если простым языком, то включить когда опустилась до 25°С, а выключить когда достигла 28°С.(условно).

Ижанитович
Offline
Зарегистрирован: 02.12.2018

Спасибо, за гистерезис понял!

  --но в моем случае это не нужно, важно зафиксировать именно остывание ,а дальше я ручками подсыплю уголь )

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

Ижанитович пишет:

Спасибо, за гистерезис понял!

  --но в моем случае это не нужно, важно зафиксировать именно остывание ,а дальше я ручками подсыплю уголь )


интересно, а я уголь подсыпал когда старая порция полностью разгорелась