산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

온수기 열전대 전압 모니터

구성품 및 소모품

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

이 프로젝트 정보

온수기 파일럿 조명 모니터링 시스템

기존 가스 온수기는 24x7 파일럿 조명을 유지합니다. 이 파일럿 라이트는 작은 전압(최대 30밀리볼트)을 생성하는 열전대를 가열합니다. 이 전압은 온수 히터 온도 조절 장치에서 가스 밸브를 열어 두는 데 사용됩니다. 파일럿 라이트가 꺼지면 전압이 정지되고 가스 밸브가 자동으로 닫힙니다.

내 온수기에서 파일럿 표시등이 가끔 꺼집니다. 1년에 3번 정도 이런 일이 일어나기 때문에 비싼 온수기를 교체하고 싶지 않습니다. 열전대를 교체해 보았지만 문제가 해결되지 않았습니다.

내 솔루션:열전쌍에서 생성된 전압을 모니터링합니다. 0으로 떨어지면 파일럿 라이트를 다시 켤 수 있도록 문자와 이메일을 보내주세요. 열전대 전압이 0으로 떨어질 때마다 가스 밸브가 닫히기 때문에 여기서 가스 누출의 위험이 없음을 기억하십시오.

개요

라즈베리 파이 제로 WH는 파일럿 라이트가 꺼지면 이메일 및 문자를 보내는 데 사용됩니다. Raspberry Pi에는 전압을 측정할 수 있는 방법이 없기 때문에 Arduino Nano를 사용하여 열전대에서 전압을 모니터링합니다.

Arduino에는 전압을 읽고 0에서 1023 사이의 숫자로 변환할 수 있는 아날로그-디지털 변환기(ADC)가 있습니다. 이 프로젝트에서 Arduino는 열전쌍에서 전압을 읽고 이 값을 Raspberry Pi에 전달합니다. Raspberry Pi는 전압 판독값을 수신하여 해석합니다. 값이 너무 낮으면 표시등이 꺼진 것으로 가정하고 알림을 보냅니다.

1단계:Raspberry Pi 준비

Raspberry Pi를 네트워크에서 실행하고 실행합니다(이 작업에 대한 지침은 제 다른 프로젝트에서 확인할 수 있습니다).

Arduino에서 전압 판독값을 수신할 Python 프로그램을 만듭니다. 프로그램은 전압 판독값이 너무 낮을 때 반복하여 알림을 보냅니다. 소스코드를 첨부합니다.

2단계:Arduino 준비

저렴한 중국산 Arduino Nanos를 구입했기 때문에 Windows 10 컴퓨터에서 작동시키려면 시행착오를 거쳐야 했습니다.

Arduino에 스케치를 로드하여 30초마다 입력 핀의 전압을 측정합니다. Arduino는 0과 기준 전압 사이의 전압을 측정할 수 있습니다. 기준 전압으로 1.1V 또는 5V를 선택할 수 있습니다. 열전쌍은 최대 30밀리볼트만 출력하므로 더 높은 분해능을 위해 1.1V 기준 전압을 사용합니다. Arduino ADC는 0V의 경우 0을 출력하고 1.1V의 경우 1023을 출력합니다. 언급했듯이 열전대는 최대 30밀리볼트를 출력하므로 판독값은 28볼트 이하가 됩니다.

3단계:Arduino를 전압 소스에 연결

열전대는 동축 전선을 통해 온수 히터 온도 조절기에 전압을 보냅니다. 와이어 외부는 양극입니다.

온수 히터 온도 조절 장치에서 약 5인치 떨어진 곳에서 와이어를 자릅니다. 중간 와이어에 접근할 수 있도록 동축 와이어의 외부를 약간 뒤로 자릅니다. 중간 와이어에 칠해진 절연체를 파괴하지 마십시오. 우리는 동축 전선의 외부에 중간 전선이 단락되는 것을 원하지 않습니다.

온수 히터 온도 조절 장치와 Arduino 입력 핀에 양의 전압을 공급하도록 와이어를 연결합니다. 입력 핀 A0을 사용했습니다. 전압 소스의 음극은 아두이노 접지와 연결되어야 하며, 온수 히터 온도 조절기의 음극은 연결되어야 합니다.

연결을 위해 끝에 악어 클립이 있는 1피트 길이의 와이어를 사용했습니다.

4단계:Arduino를 Raspberry Pi에 연결

Arduino에서 실행되는 스케치는 ADC에서 Raspberry Pi로 전압 번호를 전송합니다. Arduino는 디지털 핀 9에서 출력으로 신호를 보냅니다.

Arduino는 +5V에서 신호를 보냅니다. Raspberry Pi는 3V 입력만 받을 수 있습니다. 따라서 Arduino와 Raspberry Pi 사이에는 전압 분배기가 있어야 합니다. 이렇게 하면 전압이 5V에서 약 2.8V로 감소합니다.

전압 분배기는 입력 전압을 줄이는 저항 시스템입니다.

출력 전압은 전압 분배기 관계에 의해 결정됩니다.

전류가 흐르지 않을 때 저항 양쪽의 전압은 Vin(5V)이 되기 때문에 단일 저항을 사용하여 전압을 낮출 수는 없습니다. 전압 분배기를 사용하면 전류가 없는 상황에서도 전압을 낮출 수 있습니다.

모든 것의 접지선을 연결해야 합니다. 연결 다이어그램을 참조하십시오.

5단계:Arduino가 전압 측정값을 전송합니다.

30초마다 Arduino 스케치는 ADC에서 전압 측정값을 가져와서 그 수치를 Raspberry Pi로 전송합니다. Arduino 핀 9에서 Raspberry Pi 핀 16까지 원시적인 단일 와이어 신호 시스템을 사용하기로 결정했습니다.

6단계:Raspberry Pi가 전압 측정을 수신합니다.

Raspberry Pi는 무한 루프가 있는 Python 프로그램을 사용하여 핀 16의 상승 에지를 수신 대기합니다. 상승 에지가 감지되면 Arduino가 숫자 전송을 시작했다고 가정합니다.

신호 시스템
두 자리 숫자(예:"12")를 전송합니다. 각 숫자 앞에는 핀 16에서 수신된 양의 펄스가 옵니다. 20밀리초(ms) 미만으로 분리된 후속 양의 펄스는 이 숫자의 값을 증가시킵니다. 40ms 이상의 일시 중지는 이 숫자가 완료되고 다음 숫자가 시작됨을 나타냅니다. 40ms 동안 또 다른 일시 중지는 두 번째 숫자가 완료되었음을 나타냅니다. 이제 전체 두 자리 숫자가 완성되었습니다.

라즈베리파이에서 실행되는 파이썬 코드에서 아두이노로부터 받은 신호를 해석하는 메소드에서 아두이노로부터 받은 숫자를 반환한다. 다른 Python 코드는 알림을 보내야 하는지 여부를 결정합니다. 그런 다음 코드는 핀 16의 다음 상승 에지 대기로 돌아갑니다.

7단계:알림 보내기

전압이 너무 낮으면 낮은 카운트를 증가시킵니다. 잘못된 경보를 방지하기 위해 낮은 카운트가 유지됩니다. 낮은 카운트가 5에 도달하면 전압이 5회 측정에 대해 낮은 것입니다. 각 측정은 30초 간격입니다. 알림을 보내고 낮은 카운트를 재설정합니다. 알림은 smtplib 및 Gmail 계정을 사용하여 전송됩니다. 알림이 전송되면 타임스탬프가 Python 코드에 저장됩니다. 다음 알림은 6시간 동안 전송되지 않습니다.

문자 알림을 보내기 위해 대부분의 셀 공급자가 제공하는 기능인 사용자에게 문자를 이메일로 보내는 기능을 사용했습니다. 예:Verizon의 경우:[email protected]이 해당 번호로 문자를 보냅니다.

Gmail
알림을 보내는 데 사용할 새 Gmail 계정을 만들었습니다. 처음에는 Python 코드가 이메일을 보낼 수 있도록 '보안 수준이 낮은' 액세스를 허용하도록 이 Gmail 계정의 보안 설정을 구성했습니다. 그러나 몇 개월 후 Gmail은 이 덜 안전한 액세스를 비활성화할 수 있습니다. Gmail은 사용자가 앱 비밀번호를 사용하는 것을 선호한다는 것을 알게 되었습니다.

앱 비밀번호 설정
https://support.google.com/accounts/answer/185833

8단계:모든 것을 연결하세요

Arduino를 온수기 열전쌍 와이어에 연결하고 전압 분배기를 통해 Raspberry Pi에 연결합니다. (내 전압 분배기의 상단 부분은 총 550옴의 저항 2개를 사용합니다. 왜냐하면 그것들은 제가 가지고 있던 저항기이기 때문입니다.) Arduino의 전원을 켜면 전압 측정이 시작되고 30초마다 Raspberry Pi에 신호가 전송됩니다.

9단계:Python 프로그램 실행

<울>
  • Python 프로그램을 시작하는 스크립트를 만드세요.
  • 루트 crontab을 편집하여 부팅 시 스크립트를 자동으로 실행합니다. Raspberry Pi 및 Python 프로그램이 저장된 위치에 맞게 디렉터리 경로를 편집합니다.
  • 크론탭을 수정하려면:
    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 핫워터

  • <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Arduino 코드
  • 파이썬 코드
  • Python 코드를 시작하는 스크립트
  • Arduino 코드Arduino
    이것은 30초마다 전압을 읽고 Raspberry Pi
    /********************************로 신호를 보냅니다. ****************************************** HotWaterHeater 전압 측정 온수기의 열전대에서 나옵니다. 신호를 사용하여 이 전압 센서 측정값을 Raspberry Pi로 보냅니다. ************************************************** **************************///이중 참조 전압 =5.0; //미사용 기준 전압double ReferenceVoltage =1.1;int OUTPUT_PIN =9;int INTRA_DIGIT_WAIT=20;int BETWEEN_DIGIT_WAIT=50;/////////////////////////// ////////////////////////////////////////////////////// ///// 리셋을 누르거나 보드에 전원을 공급하면 설정 기능이 한 번 실행됩니다. //////////////////////////////// ////////////////////////////////////////////////// 무효 설정( ) { // 디지털 핀 LED_BUILTIN을 출력으로 초기화합니다. 핀모드(LED_BUILTIN, 출력); 핀모드(OUTPUT_PIN, OUTPUT); // 디지털 핀 9를 출력으로 설정합니다. analogReference(INTERNAL); Serial.begin(9600); // 직렬 포트를 열고 데이터 속도를 9600bps로 설정}//////////////////////////////////// ///////////////////////////////////////////// 루프 함수는 영원히 반복하십시오.// 입력 핀의 전압을 측정하십시오.// 그런 다음 해당 판독값을 Raspberry Pi로 전송//////////////////////// ////////////////////////////////////////////////////// /// 무효 루프() { int pinInput; 이중 전압; pinInput =analogRead(A0); // 프로브 입력 Serial.print("PinInputA0="); Serial.print(pinInput); //Arduino ADC는 10비트 변환기입니다. 즉, 출력 값의 범위는 0 ~ 1023입니다. voltage =(pinInput * ReferenceVoltage ) / 1023; Serial.print(", 전압A0="); Serial.println(전압); //참고:5 =5.38mV의 판독값 sendNumberSignal(pinInput, OUTPUT_PIN, INTRA_DIGIT_WAIT, BETWEEN_DIGIT_WAIT); //30초 간격으로 체크 실행 delay(30000);}/********************************** ******************************************** * 전화번호부 단일 와이어. * * 각 숫자에 대해 일련의 펄스를 보냅니다. * 초기 킥오프 펄스도 있습니다. * 각 펄스는 다음과 같습니다. __/ 20ms \__20ms__ * 동일한 디지트 내 상승 에지 사이 20+20ms * * 디지트 간:__/ 20ms \__20ms__ 50ms__ * * 숫자 사이 20+20+50ms ********* ************************************************** ******************/void sendNumberSignal(int number, int pin, int intraDigitWait, int betweenDigitWait) { int tens =number/10; 정수 =숫자 % 10; Serial.print("시그널링:"); Serial.println(숫자); // 디버깅 //////// //Serial.print("tens:"); //Serial.println(수십); //Serial.print("one:"); //Serial.println(ones); //Serial.print("밀리:"); //Serial.println(밀리()); // 디버깅 /////// //Serial.println("send tens"); //Serial.print("밀리:"); //Serial.println(밀리()); //10개의 숫자를 보냅니다. sendPulse(pin, intraDigitWait); for (int i=0; i 
    파이썬 코드파이썬
    이 코드는 Arduino에서 신호를 수신합니다. 신호를 전압 판독값으로 해석합니다. 그런 다음 전압이 너무 낮은지 결정합니다. 전압이 너무 낮으면 이메일과 문자를 보냅니다.
    ################################# ############################################### HotWaterNotifier.py# 입력 핀을 모니터링하고 Arduino에서 신호를 수신합니다.# 신호를 수치 전압 센서 측정으로 디코딩합니다.# 수신된 전압 판독값이 너무 낮으면 # 파일럿 라이트가 꺼졌음을 나타냅니다. 이것이 연속 5회 측정에 대해 발생하면 파일럿 라이트가 실제로 꺼졌다고 가정합니다. 이메일/문자를 보내고 시간을 기록하세요.# 6시간마다 이메일/문자만 보내세요.## Python 2.7용으로 작성되었습니다. Python 3.########################################################################################## ########################################GPIO로 smtplibimport RPi.GPIO 가져오기 os.pathimport 시간 가져오기 datetimeimport stringimport loggingimport sys#Arduino로부터 신호를 수신하기 위한 GPIO 입력GPIO_Alert=16# emailsemailWaitHours=6# 저전압 센서 판독값 사이에 몇 시간을 기다려야 하는지 센서 판독값에 도달하면 GPIO 번호 지정을 위해 alertmaxLowVoltageCount=5#를 보내고 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) #전역 변수 선언################################### ############################################### 로거를 설정합니다.## #################################################### ############################def setup_custom_logger(name):formatter =logging.Formatter(fmt='%(asctime)s %(레벨 이름) )-8초 %( message)s', datefmt='%Y-%m-%d %H:%M:%S') 핸들러 =logging.FileHandler('HotWaterLog.txt', 모드='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) 반환 logger## #################################################### ############################# 이메일/문자 전송 기능################ #################################################### #############def send_email_alert():# 전역 변수에 쓰기 허용 global lastEmailSentTime # 마지막 이메일 이후 충분한 시간이 경과했는지 확인 nowTime =datetime.datetime.now() emailWaitDelta =datetime .timedelta(hours=emailWaitHours) limitTime =nowTime - emailWaitDelta #시간이 충분하면 이메일을 보냅니다. if lastEmailSentTime이 None이거나 limitTime> lastEmailSentTime:logger.info('Sending email alert...') HOST ="smtp.gmail.com" PORT =587 SUBJECT ="Hot Water Heater Alert" #이것은 목록 객체여야 합니다. 여러 주소 TO =["[email protected]", "[email protected]"] #TO =["[email protected]"] FROM ="[email protected]" PWD ="XXXXXXXXXXXXXX" 텍스트 =" 온수 히터에서 측정된 저전압" #여기서 to 필드가 1개의 문자열로 결합됩니다. #받는 사람의 이메일에 표시되는 내용입니다. BODY =string.join(("시작:%s" %FROM, "끝:%s" %", ".join(TO), "제목:%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"))############### #################################################### ############### 아두이노에서 신호를 받습니다.# 숫자는 두 자리 숫자로 이루어져 있습니다. (10자리 숫자와 1자리 숫자)# Arduino는 항상 2자리 숫자로 구성된 숫자를 전송합니다.# 수신된 신호는 입력 핀에서 일련의 하이 펄스입니다.# waitReceiveNumber() 메서드는 하이 펄스를 계산합니다 그리고 [count -1]은 # 숫자의 값입니다.# 각 숫자 앞에는 1 펄스가 옵니다.## 동일한 숫자 내에서 신호 에지 사이 최대 70ms# 70ms 미만으로 분리된 상승 에지는 동일한 숫자입니다. 70ms보다 지난 다음 다음 숫자로 이동# 200ms는 숫자가 완료되었음을 의미합니다.################################ ################################################def waitReceiveNumber(GPIO_Alert ):lastSignalTime =datetime.datetime(2000,1,1,0,0,0,0) isTens=True isFirstIteration=True tensValue=0 onesValue=0 recipientEdge=None #펄스 간 70ms 미만:여전히 동일한 숫자 전송 중 # 현재 숫자의 값을 증가 #70ms 이상:다음 숫자로 전환 singleDigitMilliseconds =datetime.timedelta(milliseconds=70) #이 타임아웃인 경우 에 도달하면 숫자의 끝입니다. wholeNumberWaitTime =200 # 상승 에지가 감지될 때까지 여기서 기다립니다. #logger.info('Waiting on GPIO pin:' + str(GPIO_Alert)) while True:#Arduino가 깜박일 때 펄스를 보냅니다. 두 번째로 Raspberry Pi를 시작합니다. # 정전 시 Arduino가 더 빨리 부팅되어야 합니다. if isFirstIteration:recipientEdge =GPIO.wait_for_edge(GPIO_Alert, GPIO.RISING, timeout=-1) #킥오프 펄스까지 영원히 기다립니다. 최대 waitTime ms #이 신호에 대한 타이밍 메트릭 계산 signalTime =datetime.datetime.now() signalInterval =signalTime - lastSignalTime lastSignalTime =signalTime #디버깅:logger.info('signalInterval:' + str(signalInterval.total_seconds() * 1000 )) #증가할 숫자 결정 if (signalInterval =singleNumberMilliseconds:if isTens:#shift to one isTens =False onesValue+=1 else:#isOnes #다음 숫자로 이동할 수 없으므로 숫자가 완성됩니다. #이러면안됩니다. 번호가 완료되면 # wait는 시간 초과되어야 하고 수신된Edge는 None이어야 합니다. return ((tensValue -1)*10) + (onesValue -1) else:#timeout, 그래서 숫자가 완성됩니다. 반환((tensValue -1)*10) + (onesValue -1)################################## ################################################ 주요 방법# #################################################### #############################def main():logger.info('HotWaterNotifier 시작') referenceVoltage =1.1 lowVoltageCount=0 시도:while True:# 이것은 Arduino에서 신호를 수신할 때까지 차단됩니다. #완성된 번호를 받은 후에만 반환됩니다. sensorReading =waitReceiveNumber(GPIO_Alert) # 아두이노 센서 판독 전압에서 전압 계산 =(sensorReading * referenceVoltage ) / 1023; logger.info('sensorReading:' + str(sensorReading) + ', voltage:' + str(voltage)) if sensorReading <=lowSensorReading:lowVoltageCount+=1 #increment if lowVoltageCount>=maxLowVoltageCount:logger.info('저전압 경고 ') send_email_alert() lowVoltageCount=0 #경보를 보냈기 때문에 카운터 재설정 else:lowVoltageCount=0 # KeyboardInterrupt를 제외하고 양호한 전압이 수신되었기 때문에 카운터 재설정:logger.info('키보드 인터럽트 수신') GPIO.cleanup() # CTRL+C 종료 GPIO.cleanup() # GPIO 정리#################################################### ################################################ 시험 이메일 방식################################################## ################################def testEmail():logger.info('HotWaterNotifier 시작') referenceVoltage =1.1 lowVoltageCount=0 시도:send_email_alert() 제외 KeyboardInterrupt:logger.info('키보드 인터럽트 수신') GPIO.cleanup() # CTRL+C 종료 시 GPIO 정리 GPIO.cleanup() # GPIO 정리######## ############# #################################################### ########## 전역 변수##################################### ############################################ 로그 파일 로거 설정 =setup_custom_logger ('온수기')############################################## #################################### 메인 메소드를 호출하세요.## 다음과 같은 경우 대신 여기서 testEmail()을 호출하세요. 이메일 기능을 테스트하고 싶습니다.########################################### ######################################if __name__=="__main__":main()
    Python 코드 시작을 위한 스크립트SH
    crontab이 Python 코드를 시작하기 위해 호출하는 스크립트입니다.
    #!/bin/bash# run_HotWaterNotifier.sh# 알림을 시작합니다.cd /home/pi/hotwatersudo python HotWaterNotifier.py

    제조공정

    1. Moteino와 Raspberry Pi로 실내 온도 모니터링
    2. Arduino를 사용하여 모니터 Ambilight 만들기
    3. Arduino를 사용한 태양 전지판의 실시간 데이터 수집
    4. Arduino로 물방울 캡처
    5. Arduino 에너지 모니터 및 데이터 로거를 구축하는 방법
    6. IoT를 사용한 심박수 모니터
    7. Arduino Temp. 3.2 디스플레이가 있는 모니터 및 실시간 시계
    8. 완벽한 히트 펌프 온수
    9. 최고의 국내 온수 펌프를 선택하는 방법?
    10. 온수 펌프 소개