Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Монитор напряжения термопары водонагревателя

Компоненты и расходные материалы

Adafruit Raspberry Pi Zero WH
× 1
Arduino Nano R3
× 1

Об этом проекте

Система контроля контрольного света водонагревателя

Традиционные газовые водонагреватели поддерживают зажигание круглосуточно. Эта контрольная лампа нагревает термопару, которая генерирует небольшое напряжение (до 30 милливольт). Это напряжение используется термостатом водонагревателя для удержания газового клапана в открытом состоянии. Если контрольная лампа гаснет, напряжение прекращается, и газовый клапан автоматически закрывается.

В моем водонагревателе время от времени гаснет контрольная лампа. Так как это происходит примерно 3 раза в год, я не хочу заменять дорогой водонагреватель. Я попытался заменить термопару, но это не решило проблему.

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

Обзор

Raspberry Pi Zero WH будет использоваться для отправки электронных писем и текстов, когда индикатор погаснет. Поскольку Raspberry Pi не имеет возможности измерять напряжение, Arduino Nano используется для контроля напряжения от термопары.

У Arduino есть аналого-цифровые преобразователи (АЦП), которые могут считывать напряжение и преобразовывать его в число от 0 до 1023. В этом проекте Arduino считывает напряжение с термопары и передает это значение на Raspberry Pi. Raspberry Pi получает показания напряжения и интерпретирует их. Если значение слишком низкое, мы предполагаем, что индикатор погас, и отправляем уведомления.

Шаг 1. Подготовьте Raspberry Pi

Установите Raspberry Pi и запустите его в своей сети (инструкции по этому поводу вы можете найти в другом моем проекте).

Создайте программу Python, которая будет получать показания напряжения от Arduino. Программа будет зацикливаться и отправлять уведомления, когда показание напряжения слишком низкое. Исходный код прилагается.

Шаг 2. Подготовьте Arduino

Я купил дешевые китайские Arduino Nano, поэтому потребовалось несколько проб и ошибок, чтобы заставить их работать с моим компьютером с Windows 10.

Загрузите в Arduino эскиз, чтобы каждые 30 секунд измерять напряжение на его входном контакте. Arduino может измерять напряжение между 0 и опорным напряжением. В качестве опорного напряжения можно выбрать 1,1 В или 5 В. Поскольку термопара выдает не более 30 милливольт, мы будем использовать опорное напряжение 1,1 В для большего разрешения. АЦП Arduino выдает 0 для 0 В и 1023 для 1,1 В. Как уже упоминалось, термопара выдает максимум 30 милливольт, поэтому показание будет 28 или меньше.

Шаг 3. Подключите Arduino к источнику напряжения

Термопара передает напряжение на термостат водонагревателя по коаксиальному проводу. Наружная сторона провода положительная.

Отрежьте провод примерно на 5 дюймов от термостата водонагревателя. Немного обрежьте коаксиальный провод снаружи, чтобы был доступен средний провод. Не разрушайте изоляцию, нарисованную на среднем проводе. Мы не хотим, чтобы средний провод закорачивался за пределы коаксиального провода.

Подключите провод так, чтобы он подавал положительное напряжение на термостат водонагревателя и на входной контакт Arduino. Я использовал входной вывод A0. Отрицательная сторона источника напряжения должна быть подключена к заземлению Arduino, а также отрицательная сторона термостата водонагревателя.

Для соединения я использовал провода длиной 1 фут с зажимами из крокодиловой кожи на концах.

Шаг 4. Подключите Arduino к Raspberry Pi

Наш скетч, запущенный на Arduino, передаст значение напряжения с АЦП на Raspberry Pi. Arduino отправит сигнал как выходной сигнал со своего цифрового вывода 9.

Arduinos отправляет сигналы с напряжением +5 В. Raspberry Pi может получать только входное напряжение 3 В. Следовательно, между Arduino и Raspberry Pi должен быть делитель напряжения. Это снижает напряжение с 5 В примерно до 2,8 В.

Делитель напряжения - это система резисторов, уменьшающих входное напряжение.

Выходное напряжение определяется соотношением делителя напряжения.

Нельзя использовать один резистор для снижения напряжения, потому что, когда ток не течет, напряжение на обеих сторонах резистора будет Vin (5 В). Использование делителя напряжения снизит напряжение даже при отсутствии тока.

Заземляющие провода всего должны быть соединены. См. Схему подключения.

Шаг 5:Arduino передает результаты измерения напряжения

Каждые 30 секунд скетч Arduino получает измерение напряжения от АЦП и передает это число в Raspberry Pi. Я решил использовать примитивную однопроводную систему передачи сигналов от вывода 9 Arduino до вывода 16 Raspberry Pi.

Шаг 6:Raspberry Pi получает результат измерения напряжения

Raspberry Pi использует программу Python с бесконечным циклом для прослушивания нарастающих фронтов на выводе 16. Когда обнаруживается нарастающий фронт, предполагается, что Arduino начал передавать число.

Система сигнализации
Передайте двузначное число (например, «12»). Каждой цифре предшествует положительный импульс, полученный на выводе 16. Последующие положительные импульсы, разделенные менее чем на 20 миллисекунд (мс), увеличивают значение этой цифры. Пауза более 40 мс означает, что эта цифра завершена, и начинается следующая цифра. Еще одна пауза более 40 мс означает, что вторая цифра завершена. Теперь полное двузначное число заполнено.

В коде Python, работающем на Raspberry Pi, число, полученное от Arduino, возвращается из метода, который интерпретирует сигналы от Arduino. Другой код Python решает, нужно ли отправлять уведомление. Затем код возвращается в режим ожидания следующего нарастающего фронта на выводе 16.

Шаг 7. Отправьте уведомление

Если напряжение слишком низкое, увеличьте младший счетчик. Поддерживается низкий счетчик для предотвращения ложных срабатываний. Если нижний счет достигает 5, значит, напряжение было низким в течение 5 измерений. Каждое измерение происходит с интервалом 30 секунд. Отправьте уведомление и сбросьте низкий счет. Уведомления отправляются с использованием smtplib и учетной записи Gmail. Метка времени сохраняется в коде Python при отправке уведомления. Следующее уведомление не будет отправлено в течение 6 часов.

Для отправки текстовых предупреждений я использовал функцию, которую предоставляют большинство провайдеров сотовой связи:возможность отправлять текст по электронной почте своим пользователям. Пример:для Verizon:[email protected] отправляет текст на этот номер.

Gmail
Я создал новую учетную запись Gmail для отправки уведомлений. Сначала я настроил параметры безопасности в этой учетной записи Gmail, чтобы разрешить «менее безопасный» доступ, чтобы код Python мог отправлять электронные письма. Однако через несколько месяцев Gmail может отключить этот менее безопасный доступ. Я обнаружил, что Gmail предпочитает, чтобы пользователи использовали пароли приложений.

Установка пароля приложения
https://support.google.com/accounts/answer/185833

Шаг 8. Подключите все

Подключите Arduino к проводу термопары водонагревателя и к Raspberry Pi через делитель напряжения. (В верхней части моего делителя напряжения используются два резистора общим сопротивлением 550 Ом, потому что это резисторы, которые у меня были под рукой.) Включите Arduino, и он начнет измерять напряжение и посылать сигналы на Raspberry Pi каждые 30 секунд.

Шаг 9. Запустите программу Python

  • Создайте сценарий, запускающий вашу программу Python.
  • Отредактируйте корневой crontab, чтобы сценарий автоматически запускался во время загрузки. Измените пути к каталогам, соответствующие вашему Raspberry Pi и месту сохранения программы Python.
  • Чтобы изменить crontab:
    sudo crontab -e
  • Добавьте строку для запуска сценария запуска при перезагрузке Raspberry Pi:
    @reboot sh /home/pi/hotwater/run_HotWaterNotifier.sh>> / home / pi / hotwater /logs/HotWaterNotifier.log 2> &1
  • Для запуска вручную (до настройки crontab)
    Сначала выполните процесс (выполните сценарий run_HotWaterNotifier.sh)
    Затем введите ctrl-Z чтобы приостановить процесс
    Затем введите bg один или два раза, чтобы отправить процесс в фоновый режим.
    Введите disown , это позволяет процессу продолжать работу после выхода из системы.
  • Чтобы узнать, выполняется ли процесс
    ps aux | grep -i HotWater


Код

  • Код Arduino
  • Код Phython
  • Скрипт для запуска кода Python
Код Arduino Arduino
Он считывает напряжение каждые 30 секунд и отправляет сигналы на Raspberry Pi
 / ******************************* ******************************************** HotWaterHeater Измеряет напряжение поступающий от термопары водонагревателя. Использует сигнализацию для отправки этого измерения датчика напряжения на Raspberry Pi. ************************************************* ************************* /// двойное ReferenceVoltage =5.0; // неиспользуемое опорное напряжение double ReferenceVoltage =1.1; int OUTPUT_PIN =9; int INTRA_DIGIT_WAIT =20; int BETWEEN_DIGIT_WAIT =50; ////////////////////////// ////////////////////////////////////////////////// ///// функция настройки запускается один раз, когда вы нажимаете кнопку сброса или включаете плату //////////////////////////////// /////////////////////////////////////////////// void setup ( ) {// инициализируем цифровой вывод LED_BUILTIN как выход. pinMode (LED_BUILTIN, ВЫХОД); pinMode (OUTPUT_PIN, ВЫХОД); // устанавливает цифровой вывод 9 как выход analogReference (ВНУТРЕННИЙ); Serial.begin (9600); // открывает последовательный порт, устанавливает скорость передачи данных 9600 бит / с} ///////////////////////////////////// //////////////////////////////////////////// Функция цикла выполняется и снова и снова навсегда. // Измерьте напряжение на входном контакте .// Затем отправьте это показание на Raspberry Pi ////////////////////////// ////////////////////////////////////////////////// /// void loop () {int pinInput; двойное напряжение; pinInput =analogRead (A0); // Пробный ввод Serial.print ("PinInputA0 ="); Serial.print (pinInput); // АЦП Arduino представляет собой десятиразрядный преобразователь, что означает, что выходное значение будет находиться в диапазоне от 0 до 1023. Voltage =(pinInput * ReferenceVoltage) / 1023; Serial.print (", VoltageA0 ="); Serial.println (напряжение); // Примечание:значение 5 =5,38 мВ sendNumberSignal (pinInput, OUTPUT_PIN, INTRA_DIGIT_WAIT, BETWEEN_DIGIT_WAIT); // Выполняем проверку каждые 30 секунд задержки (30000);} / ********************************** ******************************************************************************************************************************************************** одиночный провод. * * Для каждой цифры отправьте серию импульсов. * Также имеется начальный стартовый импульс. * Каждый импульс выглядит следующим образом:__ / 20 мс \ __ 20 мс__ * 20 + 20 мс между нарастающими фронтами в пределах одной цифры * * Между цифрами:__ / 20 мс \ __ 20 мс__ 50 мс___ * 20 + 20 + 50 мс между цифрами ********* ************************************************* ****************** / void sendNumberSignal (int number, int pin, int intraDigitWait, int betweenDigitWait) {int tens =number / 10; int ones =число% 10; Serial.print ("Сигнализация:"); Serial.println (номер); // отладка //////// //Serial.print("tens:"); //Serial.println(tens); //Serial.print("ones:"); //Serial.println(ones); //Serial.print("millis:"); //Serial.println (millis ()); // отладка //////// //Serial.println(" отправить десятки "); //Serial.print("millis:"); //Serial.println (millis ()); // отправляем число десятков sendPulse (pin, intraDigitWait); для (int я =0; я <десятки; я ++) {sendPulse (контакт, intraDigitWait); } //Serial.println("before между задержкой "); //Serial.print("millis:"); //Serial.println (millis ()); задержка (междуDigitWait); //Serial.println("after between delay "); //Serial.print("millis:"); //Serial.println (millis ()); // отладка //////// //Serial.println("отправить "); //Serial.print("millis:"); //Serial.println (millis ()); // отправляем единичное число sendPulse (pin, intraDigitWait); для (int я =0; я <единицы; я ++) {sendPulse (контакт, intraDigitWait); } delay (betweenDigitWait);} / **************************************** *********************************** * Отправьте импульс с требуемым временем ожидания, удерживая контакт на высоком уровне и затем низкий. ************************************************* ************************** / void sendPulse (int pin, int intraDigitWait) {//Serial.print("pulse start "); //Serial.println (millis ()); digitalWrite (контакт, ВЫСОКИЙ); задержка (intraDigitWait); // держать вывод на высоком уровне для intraDigitWait миллисекунд digitalWrite (pin, LOW); задержка (intraDigitWait); // держать вывод на низком уровне в течение миллисекунд intraDigitWait //Serial.print("pulse end "); //Serial.println (millis ());} 
Код Phython Python
Этот код получает сигналы от Arduino. Он интерпретирует сигналы в показания напряжения. Затем он определяет, не слишком ли низкое напряжение. Если напряжение слишком низкое, он отправляет электронные письма и тексты.
 ################################# ########################################### HotWaterNotifier.py # Следите за входным контактом и получайте сигналы от Arduino. # Декодируйте сигналы в числовые измерения датчика напряжения. Когда это происходит при 5 измерениях подряд, предположим, что # индикатор действительно не горит. Отправляйте электронные письма / тексты и записывайте время. # Отправляйте только электронное письмо / текст каждые шесть часов. ## Это было написано для Python 2.7. Для Python 3 могут потребоваться небольшие изменения. ###################################### #################################### import smtplibimport RPi.GPIO как GPIOimport osimport os.pathimport timeimport datetimeimport stringimport loggingimport sys # Вход GPIO для приема сигналов от ArduinoGPIO_Alert =16 # Сколько часов ждать между электронной почтойsemailWaitHours =6 # Показания датчика низкого напряжения. # Меньше или равно этому значению низкого напряжения .lowSensorReading =1 # Один раз показания датчика достигнуты, отправьте alertmaxLowVoltageCount =5 # для нумерации GPIO, выберите BCMGPIO.setmode (GPIO.BCM) GPIO.setup (GPIO_Alert, GPIO.IN, pull_up_down =GPIO.PUD_DOWN) lastEmailSentTime =datetime.datetime (2000,1, 1,0,0,0,0) #declare global variable #################################################################### ######################################### Настройте регистратор. ## ########################################################################### ########################## def setup_custom_logger (имя):formatter =logging.Formatter (fmt ='% (asctime) s% (levelname ) -8с% ( message) s ', datefmt ='% Y-% m-% d% H:% M:% S ') handler =logging.FileHandler (' HotWaterLog.txt ', mode =' a ') handler.setFormatter (форматтер) screen_handler =logging.StreamHandler (stream =sys.stdout) screen_handler.setFormatter (formatter) logger =logging.getLogger (name) logger.setLevel (logging.DEBUG) logger.addHandler (handler) logger.addHandler (screen_handler) return logger ## ########################################################################### ########################### Функция для отправки электронных писем / текстов ################ ########################################################################### ############# def send_email_alert ():# разрешить запись в глобальную переменную global lastEmailSentTime # проверить, прошло ли достаточно времени с момента последнего электронного письма nowTime =datetime.datetime.now () emailWaitDelta =datetime .timedelta (hours =emailWaitHours) limitTime =nowTime - emailWaitDelta # если прошло достаточно времени, отправьте электронное письмо. если lastEmailSentTime равно None или limitTime> lastEmailSentTime:logger.info ('Отправка предупреждения по электронной почте ...') HOST ="smtp.gmail.com" PORT =587 SUBJECT ="Предупреждение о нагревателе горячей воды" # Это должен быть объект списка для несколько адресов TO =["[email protected]", "[email protected]"] #TO =["[email protected]"] FROM ="[email protected]" PWD ="XXXXXXXXX text ="XXX" Низкое напряжение, измеренное на водонагревателе »# Здесь поле to объединено в одну строку. # Это то, что отображается получателю в его электронном письме. BODY =string.join (("from:% s"% FROM, "to:% s"% "," .join (TO), "Subject:% s"% SUBJECT, "", текст), "\ r \ n ") попробуйте:s =smtplib.SMTP (HOST, PORT) s.set_debuglevel (1) s.ehlo () s.starttls () s.login (FROM, PWD) s.sendmail (FROM, TO, BODY) s.quit except Exception as e:logger.exception ('Исключение обнаружено, что файл отправляет электронное письмо. Повторная попытка через 6 часов') # установить время, чтобы электронное письмо не отправлялось в течение 6 часов lastEmailSentTime =nowTime else:logger.info (' Электронная почта не отправляется. Последнее электронное письмо было отправлено по адресу:'+ lastEmailSentTime.strftime ("% Y-% m-% d% H:% M:% S")) ############### ########################################################################### ############### Получать сигналы от Arduino. # Число состоит из двух цифр. (цифра разряда десятков и цифра разряда единиц) # Arduino всегда передает число, состоящее из 2 цифр. # Полученные сигналы представляют собой серию высоких импульсов на входном выводе. # Метод waitReceiveNumber () подсчитывает высокие импульсы а [count -1] - # значение цифры. # Каждой цифре предшествует 1 импульс. ## 70 мс макс. между фронтами сигнала в одной и той же цифре чем 70 мс, затем переходите к следующей цифре # 200 мс означает, что число заполнено ################################ ########################################### def waitReceiveNumber (GPIO_Alert ):lastSignalTime =datetime.datetime (2000,1,1,0,0,0,0) isTens =True isFirstIteration =True tensValue =0 onesValue =0 receiveEdge =None # Между импульсами меньше 70 мс:это все та же цифра передается # Увеличить значение текущей цифры # Более 70 мс:переключиться на следующую цифру singleDigitMilliseconds =datetime.timedelta (milliseconds =70) # Если это время ожидания достигнуто, это конец числа inteNumberWaitTime =200 # здесь подождите, пока не будет обнаружен нарастающий фронт # logger.info ('Waiting on GPIO pin:' + str (GPIO_Alert)) while True:#Arduino отправляет импульс, когда вы мигаете это, запустите второй Raspberry Pi. # Arduino должен загружаться быстрее в случае отключения электроэнергии. if isFirstIteration:receiveEdge =GPIO.wait_for_edge (GPIO_Alert, GPIO.RISING, timeout =-1) # ждать вечно до стартового импульса else:receiveEdge =GPIO.wait_for_edge (GPIO_Alert, GPIO.RISING, timeout =wholeNumberWaitTime) #waitTime up to waitTime ms # вычислить временные метрики для этого сигнала signalTime =datetime.datetime.now () signalInterval =signalTime - lastSignalTime lastSignalTime =signalTime #debugging:logger.info ('signalInterval:' + str (signalInterval.total_seconds () * 1000 )) # определить, какую цифру увеличивать if (signalInterval  =singleNumberMilliseconds:#signalInterval> =singleNumberMilliseconds:#signalInterval> =singleNumberMilliseconds:#signalInterval> =singleNumberMilliseconds:к единицам isTens =False onesValue + =1 else:#isOnes # не может перейти к следующей цифре, поэтому число завершено. # Этого не должно происходить. Как только число набрано, время ожидания должно истечь, а значение ReceiveEdge должно быть None. return ((tensValue -1) * 10) + (onesValue -1) else:#timeout, значит число завершено. return ((tenValue -1) * 10) + (onesValue -1) ############################################# ############################################ Основной метод # ########################################################################### ########################## def main ():logger.info ('Запуск HotWaterNotifier') referenceVoltage =1.1 lowVoltageCount =0 попробуйте:while True:# Блокировка будет происходить до тех пор, пока не будут получены сигналы от Arduino. # Он вернется только после получения полного числа. sensorReading =waitReceiveNumber (GPIO_Alert) # рассчитать напряжение по показаниям датчика Arduino Voltage =(sensorReading * referenceVoltage) / 1023; logger.info ('sensorReading:' + str (sensorReading) + ', Voltage:' + str (Voltage)) if sensorReading <=lowSensorReading:lowVoltageCount + =1 # инкремент, если lowVoltageCount> =maxLowVoltageCount:logger.info ('Предупреждение о низком напряжении ') send_email_alert () lowVoltageCount =0 # сбросить счетчик, потому что мы отправили предупреждение else:lowVoltageCount =0 # сбросить счетчик, поскольку было получено хорошее напряжение, кроме KeyboardInterrupt:logger.info (' Получено прерывание клавиатуры ') GPIO.cleanup () # очистить GPIO по CTRL + C exit GPIO.cleanup () # очистить GPIO ############################### ################################################ Тест метод электронной почты ######################################################################## ############################# def testEmail ():logger.info ('Запуск HotWaterNotifier') referenceVoltage =1.1 lowVoltageCount =0 попробуйте:send_email_alert () except KeyboardInterrupt:logger.info ('Получено прерывание клавиатуры') GPIO.cleanup () # очистить GPIO при CTRL + C выйти из GPIO.cleanup () # очистить GPIO ######## ############ ########################################################################### ########## Глобальная переменная ################################### ######################################## Настройте файл журналаlogger =setup_custom_logger ('HotWaterNotifier') ############################################################################ ################################# Вызовите основной метод. ## Вызовите здесь testEmail (), если вы хотите проверить возможности электронной почты. ######################################### ################################# если __name __ ==«__main__»:main () 
Скрипт для запуска кода Python SH
Это сценарий, который crontab вызывает для запуска кода Python
 #! / Bin / bash # run_HotWaterNotifier.sh # Запуск notifiercd / home / pi / hotwatersudo python HotWaterNotifier.py 

Производственный процесс

  1. Мониторинг комнатной температуры с помощью Moteino’s и Raspberry Pi
  2. Создание монитора Ambilight с помощью Arduino
  3. Сбор данных солнечной панели в реальном времени с использованием Arduino
  4. Захват капель воды с помощью Arduino
  5. Как создать монитор энергии и регистратор данных Arduino
  6. Монитор сердечного ритма с использованием Интернета вещей
  7. Arduino Temp. Монитор и часы реального времени с дисплеем 3.2
  8. Идеальный тепловой насос для горячей воды
  9. Как выбрать лучший насос для горячей воды?
  10. Введение в насос для горячей воды