Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Warmwaterverwarmer Thermokoppel Spanningsmonitor

Componenten en benodigdheden

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

Over dit project

Controlesysteem voor waakvlamverwarming voor warm water

Traditionele gasboilers houden een waakvlam 24x7 aan. Deze waakvlam verwarmt een thermokoppel dat een kleine spanning genereert (tot 30 millivolt). Deze spanning wordt door de thermostaat van de warmwaterboiler gebruikt om een ​​gasklep open te houden. Als de waakvlam uitvalt, stopt de spanning en wordt de gasklep automatisch gesloten.

In mijn warmwaterboiler blaast de waakvlam af en toe uit. Aangezien dit maar ongeveer 3 keer per jaar gebeurt, wil ik de dure warmwaterboiler niet vervangen. Ik heb geprobeerd het thermokoppel te vervangen, maar dit loste het probleem niet op.

Mijn oplossing:controleer de spanning die door het thermokoppel wordt gegenereerd. Als het tot nul daalt, stuur dan sms'jes en e-mails zodat ik de waakvlam opnieuw kan aansteken. Onthoud dat er hier geen gevaar voor gaslek is, omdat de gasklep wordt gesloten wanneer de spanning van het thermokoppel tot nul daalt.

Overzicht

Een Raspberry Pi Zero WH wordt gebruikt om e-mails en sms-berichten te verzenden wanneer het controlelampje uitgaat. Omdat de Raspberry Pi geen manier heeft om spanning te meten, wordt een Arduino Nano gebruikt om de spanning van het thermokoppel te bewaken.

Arduino's hebben analoog-naar-digitaal-omzetters (ADC's) die een spanning kunnen lezen en converteren naar een getal tussen 0 en 1023. In dit project leest de Arduino de spanning van het thermokoppel en communiceert deze waarde naar de Raspberry Pi. De Raspberry Pi ontvangt de spanningsmeting en interpreteert deze. Als de waarde te laag is, gaan we ervan uit dat het controlelampje uit is en sturen we meldingen.

Stap 1:Bereid je Raspberry Pi voor

Zet de Raspberry Pi aan de gang op je netwerk (je kunt mijn andere project bekijken voor instructies om dit te doen).

Maak een Python-programma dat spanningsmetingen van de Arduino ontvangt. Het programma zal een lus maken en meldingen verzenden wanneer de spanningswaarde te laag is. Broncode is bijgevoegd.

Stap 2:Bereid je Arduino voor

Ik kocht goedkope Chinese Arduino Nano's, dus het kostte wat vallen en opstaan ​​om deze werkend te krijgen met mijn Windows 10-computer.

Laad de Arduino met een schets om elke 30 seconden de spanning op de ingangspin te meten. De Arduino kan spanning meten tussen 0 en een referentiespanning. Men kan kiezen voor 1,1 V of 5 V als referentiespanning. Omdat het thermokoppel maximaal 30 millivolt afgeeft, zullen we de referentiespanning van 1,1 V gebruiken voor een grotere resolutie. De Arduino ADC-uitgangen 0 voor 0V en 1023 voor 1.1V. Zoals vermeld, levert het thermokoppel maximaal 30 millivolt, dus de meetwaarde zal 28 of minder zijn.

Stap 3:Sluit de Arduino aan op de spanningsbron

Het thermokoppel stuurt via een coaxiale draad spanning naar de thermostaat van de warmwaterboiler. De buitenkant van de draad is positief.

Knip de draad ongeveer 5 centimeter van de thermostaat van de warmwaterboiler af. Knip de buitenkant van de coaxiale draad iets terug zodat de middelste draad bereikbaar is. Vernietig de isolatie die op de middelste draad is geverfd niet. We willen niet dat de middelste draad kortsluiting maakt naar de buitenkant van de coaxiale draad.

Sluit de draad zo aan dat deze de positieve spanning levert aan de thermostaat van de warmwaterboiler en aan de Arduino-ingangspin. Ik gebruikte ingang pin A0. De negatieve kant van de spanningsbron moet worden aangesloten op de aarde van de Arduino, evenals de negatieve kant van de thermostaat van de warmwaterboiler.

Ik gebruikte 1 voet lange draden met krokodillenklemmen aan de uiteinden om de verbindingen te maken.

Stap 4:Verbind de Arduino met de Raspberry Pi

Onze schets die op de Arduino wordt uitgevoerd, verzendt het spanningsnummer van de ADC naar de Raspberry Pi. De Arduino stuurt het signaal als uitvoer vanaf zijn digitale pin 9.

Arduino's sturen signalen op +5V. De Raspberry Pi kan alleen een 3V ingang ontvangen. Daarom moet er tussen de Arduino en de Raspberry Pi een spanningsdeler zijn. Dit reduceert de spanning van 5V tot ongeveer 2,8V.

Een spanningsdeler is een systeem van weerstanden die de ingangsspanning verlagen.

De uitgangsspanning wordt bepaald door de spanningsdelerrelatie.

Men kan geen enkele weerstand gebruiken om de spanning te verlagen, want als er geen stroom vloeit, zal de spanning aan beide zijden van de weerstand Vin (5V) zijn. Het gebruik van een spanningsdeler zal de spanning zelfs in de stroomloze situatie verlagen.

De aardingsdraden van alles moeten worden aangesloten. Zie het aansluitschema.

Stap 5:Arduino verzendt de spanningsmeting

Elke 30 seconden krijgt de Arduino-schets de spanningsmeting van de ADC en verzendt het nummer naar de Raspberry Pi. Ik besloot om een ​​primitief, enkeldraads signaleringssysteem te gebruiken van Arduino pin 9 naar Raspberry Pi pin 16.

Stap 6:Raspberry Pi ontvangt de spanningsmeting

De Raspberry Pi gebruikt een Python-programma met een oneindige lus om te luisteren naar stijgende flanken op pin 16. Wanneer een stijgende flank wordt gedetecteerd, wordt aangenomen dat de Arduino is begonnen met het verzenden van een getal.

Signaalsysteem
Verzend een tweecijferig nummer (bijvoorbeeld:"12"). Elk cijfer wordt voorafgegaan door een positieve puls die wordt ontvangen op pin 16. Daaropvolgende positieve pulsen, gescheiden door minder dan 20 milliseconden (ms), verhogen de waarde van dit cijfer. Een pauze van meer dan 40 ms geeft aan dat dit cijfer voltooid is en dat het volgende cijfer begint. Een volgende pauze van meer dan 40 ms geeft aan dat het tweede cijfer voltooid is. Het volledige tweecijferige nummer is nu voltooid.

In de Python-code die op de Raspberry Pi draait, wordt het van de Arduino ontvangen nummer geretourneerd door de methode die de signalen van de Arduino interpreteert. Andere Python-code bepaalt of er al dan niet een melding moet worden verzonden. Vervolgens keert de code terug naar het wachten op de volgende stijgende flank op pin 16.

Stap 7:Verstuur de melding

Als de spanning te laag is, verhoogt u de lage telling. Een lage telling wordt gehandhaafd om valse alarmen te voorkomen. Als de lage telling 5 bereikt, is de spanning gedurende 5 metingen laag geweest. Elke meting is 30 seconden uit elkaar. Verzend de melding en reset de lage telling. Meldingen worden verzonden met smtplib en een Gmail-account. Er wordt een tijdstempel opgeslagen in de Python-code wanneer de melding wordt verzonden. De volgende melding wordt pas na 6 uur verzonden.

Om sms-waarschuwingen te verzenden, heb ik een functie gebruikt die de meeste mobiele providers bieden:de mogelijkheid om een ​​sms naar hun gebruikers te e-mailen. Bijvoorbeeld:voor Verizon:[email protected] stuurt een sms naar dat nummer.

Gmail
Ik heb een nieuw Gmail-account gemaakt om te gebruiken voor het verzenden van de meldingen. In eerste instantie heb ik de beveiligingsinstellingen op dit Gmail-account geconfigureerd om 'minder veilige' toegang toe te staan, zodat de Python-code e-mails kon verzenden. Na een paar maanden kan Gmail deze minder veilige toegang echter uitschakelen. Ik ontdekte dat Gmail er de voorkeur aan geeft dat gebruikers app-wachtwoorden gebruiken.

Een app-wachtwoord instellen
https://support.google.com/accounts/answer/185833

Stap 8:Alles aansluiten

Sluit de Arduino aan op de thermokoppeldraad van de warmwaterboiler en op de Raspberry Pi via de spanningsdeler. (Het bovenste deel van mijn spanningsdeler gebruikt twee weerstanden van in totaal 550 ohm - want dat zijn de weerstanden die ik bij de hand had.) Zet ​​de Arduino aan en hij begint de spanning te meten en elke 30 seconden signalen naar de Raspberry Pi te sturen.

Stap 9:Voer het Python-programma uit

  • Maak een script dat je Python-programma start.
  • Bewerk de root-crontab om je script automatisch uit te voeren tijdens het opstarten. Bewerk de mappaden zoals geschikt voor uw Raspberry Pi en waar u het Python-programma hebt opgeslagen.
  • De crontab bewerken:
    sudo crontab -e
  • Voeg een regel toe om uw 'kick-off'-script uit te voeren wanneer de Raspberry Pi opnieuw wordt opgestart:
    @reboot sh /home/pi/hotwater/run_HotWaterNotifier.sh>> /home/pi/hotwater /logs/HotWaterNotifier.log 2>&1
  • Handmatig uitvoeren (voordat je de crontab-setup hebt)
    Voer eerst het proces uit (voer je script run_HotWaterNotifier.sh uit)
    Typ vervolgens ctrl-Z om uw proces op te schorten
    Typ vervolgens bg een of twee keer om het proces naar de achtergrond te sturen
    Typ disown , hierdoor kan het proces doorgaan nadat u zich afmeldt
  • Om te zien of het proces nog steeds actief is
    ps aux | grep -i Heet Water


Code

  • Arduino-code
  • Phython-code
  • Script om de Python-code te starten
Arduino-codeArduino
Deze leest elke 30 seconden de spanning en stuurt signalen naar de Raspberry Pi
/******************************** ********************************************* HotWaterHeater Meet de spanning afkomstig van het thermokoppel van de warmwaterboiler. Gebruikt signalering om deze spanningssensormeting naar de Raspberry Pi te sturen. ********************************************** *************************///dubbele referentiespanning =5,0; //ongebruikte referentiespanningdubbel ReferenceVoltage =1.1;int OUTPUT_PIN =9;int INTRA_DIGIT_WAIT=20;int BETWEEN_DIGIT_WAIT=50;////////////////////////// ////////////////////////////////////////////////// ///// de setup-functie wordt één keer uitgevoerd wanneer u op reset drukt of het bord aanzet//////////////////////////////// ////////////////////////////////////////////////Void setup( ) {// initialiseer digitale pin LED_BUILTIN als output. pinMode (LED_BUILTIN, UITGANG); pinMode (OUTPUT_PIN, OUTPUT); // stelt de digitale pin 9 in als output analoogReferentie (INTERN); Serieel.begin(9600); // opent seriële poort, zet datasnelheid op 9600 bps}///////////////////////////////////// //////////////////////////////////////////// De loop-functie loopt over en voor altijd opnieuw.// Meet de spanning op de ingangspin.// Stuur die waarde vervolgens naar de Raspberry Pi////////////////////////// ////////////////////////////////////////////////// ///void loop() { int pinInput; dubbele spanning; pinInput =analoog lezen (A0); // Probe-invoer Serial.print ("PinInputA0="); Serial.print(pinInput); // De Arduino ADC is een tien-bits converter, wat betekent dat de uitgangswaarde zal variëren van 0 tot 1023 voltage =(pinInput * ReferenceVoltage)/1023; Serial.print(", voltageA0="); Serial.println(spanning); // Opmerking:een lezing van 5 =5,38 mV sendNumberSignal (pinInput, OUTPUT_PIN, INTRA_DIGIT_WAIT, BETWEEN_DIGIT_WAIT); // Voer de controle eenmaal per 30 seconden vertraging (30000) uit;}/*********************************** ***************************************** * Signaal een nummer op a enkele draad. * * Stuur voor elk cijfer een reeks pulsen. * Er is ook een initiële kick-off puls. * Elke puls ziet er als volgt uit:__/ 20ms \__20ms__ * 20+20ms tussen stijgende flanken binnen hetzelfde cijfer * * Tussen cijfers:__/ 20ms \__20ms__ 50ms___ * 20+20+50ms tussen cijfers ********** ********************************************** *********************/void sendNumberSignal(int number, int pin, int intraDigitWait, int betweenDigitWait) {int tens =number/10; int degenen =aantal % 10; Serial.print("Signalering:"); Serial.println(nummer); // foutopsporing //////// //Serial.print("tientallen:"); //Serial.println(tientallen); //Serial.print("ones:"); //Serial.println(enen); //Serial.print("millis:"); //Serial.println(millis()); // debugging //////// //Serial.println ("verzend tientallen"); //Serial.print("millis:"); //Serial.println(millis()); // stuur het tientallen-nummer sendPulse (pin, intraDigitWait); for (int i=0; i 
Phython-codePython
Deze code ontvangt signalen van de Arduino. Het interpreteert de signalen in een spanningsmeting. Het bepaalt dan of de spanning te laag is. Als het voltage te laag is, stuurt het e-mails en sms'jes.
################################## ############################################## HotWaterNotifier.py# Bewaak de ingangspin en ontvang signalen van een Arduino.# Decodeer de signalen in numerieke spanningssensormetingen.# Wanneer de ontvangen spanningswaarde te laag is, geeft dit aan dat het controlelampje# uit is. Als dit 5 metingen achter elkaar gebeurt, neem dan aan dat# de waakvlam echt uit is. Stuur e-mails/sms'en en noteer de tijd.# Stuur alleen om de zes uur een e-mail/sms.## Dit is geschreven voor Python 2.7. Kleine wijzigingen kunnen nodig zijn voor Python 3.######################################### ######################################import smtplibimport RPi.GPIO als GPIOimport osimport os.pathimport timeimport datetimeimport stringimport loggingimport sys#Voer GPIO in om signalen van de Arduino te ontvangenGPIO_Alert=16# Hoeveel uur wachten tussen e-mailsemailWaitHours=6# Laagspanningssensormeting.# Minder dan of gelijk aan dit is laag voltage.lowSensorReading=1# Zodra dit veel laag is sensormetingen is bereikt, stuur de alertmaxLowVoltageCount=5# voor GPIO-nummering, kies 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 globale variabele#################################### ############################################ Stel de logger in.## ###################################################################### ###########################def setup_custom_logger(name):formatter =logging.Formatter(fmt='%(asctime)s %(levelname) )-8s %( message)s', datefmt='%Y-%m-%d %H:%M:%S') handler =logging.FileHandler('HotWaterLog.txt', mode='a') handler.setFormatter(formatter) 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## ###################################################################### ############################ Functie voor het verzenden van e-mails/teksten################ ###################################################################### #############def send_email_alert():# schrijf naar de globale variabele global lastEmailSentTime # controleer of er genoeg tijd is verstreken sinds de laatste e-mail nowTime =datetime.datetime.now() emailWaitDelta =datetime .timedelta(hours=emailWaitHours) limitTime =nowTime - emailWaitDelta #als er voldoende tijd is verstreken, verzendt u de e-mail. if lastEmailSentTime is Geen of limitTime> lastEmailSentTime:logger.info('E-mailwaarschuwing wordt verzonden...') HOST ="smtp.gmail.com" PORT =587 SUBJECT ="Warmwaterverwarmingswaarschuwing" #Dit zou een lijstobject moeten zijn voor meerdere adressen TO =["[email protected]", "[email protected]"] #TO =["[email protected]"] FROM ="[email protected]" PWD ="XXXXXXXXXXXXXX" text =" Laagspanning gemeten op de warmwaterboiler" #Het to-veld wordt hier samengevoegd tot 1 string. #Dit is wat de ontvanger in zijn e-mail ziet. BODY =string.join(("from:%s" %FROM, "to:%s" %", ".join(TO), "Subject:%s" %SUBJECT, " ", text), "\r \n") probeer:s =smtplib.SMTP(HOST,PORT) s.set_debuglevel(1) s.ehlo() s.starttls() s.login(FROM, PWD) s.sendmail(FROM,TO,BODY) s.quit behalve Exception as e:logger.exception('Uitzondering betrapt bestand bij verzenden van e-mail. Opnieuw proberen over 6 uur') #stel de tijd in zodat er 6 uur geen e-mail wordt verzonden lastEmailSentTime =nowTime else:logger.info(' Geen e-mail verzonden. Laatste e-mail verzonden om:' + lastEmailSentTime.strftime("%Y-%m-%d %H:%M:%S"))############### ###################################################################### ############### Ontvang signalen van de Arduino.# Een nummer bestaat uit twee cijfers. (een cijfer met tientallen en een cijfer met één plaats)# De Arduino zendt altijd een getal uit dat uit 2 cijfers bestaat.# De ontvangen signalen zijn een reeks hoge pulsen op de ingangspen.# De waitReceiveNumber()-methode telt de hoge pulsen en de [telling -1] is# de waarde van het cijfer.# Elk cijfer wordt voorafgegaan door 1 puls.## 70 ms max tussen signaalflanken binnen hetzelfde cijfer# stijgende flanken gescheiden door minder dan 70ms zijn hetzelfde cijfer# indien groter dan 70 ms, ga dan naar het volgende cijfer# 200 ms betekent dat het nummer compleet is################################# ##############################################def waitReceiveNumber(GPIO_Alert) ):lastSignalTime =datetime.datetime(2000,1,1,0,0,0,0) isTens=True isFirstIteration=True tensValue=0 onesValue=0 ontvangenEdge=Geen #Minder dan 70ms tussen pulsen:dit is nog steeds hetzelfde cijfer wordt verzonden # Verhoog de waarde van het huidige cijfer #Meer dan 70ms:schakel over naar het volgende cijfer singleDigitMilliseconds =datetime.timedelta(milliseconds=70) #Als deze time-out is bereikt, is het het einde van het getal wholeNumberWaitTime =200 # wacht hier totdat een stijgende flank wordt gedetecteerd #logger.info('Wachten op GPIO-pin:' + str(GPIO_Alert)) terwijl True:#Arduino een puls verzendt wanneer u flitst het, start de Raspberry Pi als tweede. #De Arduino zou sneller moeten opstarten in het geval van een stroomstoring. if isFirstIteration:ReceivedEdge =GPIO.wait_for_edge(GPIO_Alert, GPIO.RISING, timeout=-1) #wait forever tot een kick-off pulse else:ReceivedEdge =GPIO.wait_for_edge(GPIO_Alert, GPIO.RISING, timeout=wholeNumberWaitTime) #wait for tot waitTime ms #bereken de timingstatistieken voor dit signaal signalTime =datetime.datetime.now() signalInterval =signalTime - lastSignalTime lastSignalTime =signalTime #debugging:logger.info('signalInterval:' + str(signalInterval.total_seconds() * 1000 )) #bepaal welk cijfer moet worden verhoogd als (signalInterval =singleNumberMilliseconds:#shift naar enen isTens =False OnesValue+=1 else:#isOnes #kan niet naar het volgende cijfer verschuiven, dus het nummer is compleet. #Dit mag niet gebeuren. Zodra het nummer klaar is, moet #the wait time-out en moet ReceiveEdge Geen zijn. return ((tensValue -1)*10) + (onesValue -1) else:#timeout, dus nummer is compleet. return ((tensValue -1)*10) + (onesValue -1)################################## ############################################## De belangrijkste methode# ###################################################################### ############################def main():logger.info('Starting HotWaterNotifier') referenceVoltage =1.1 lowVoltageCount=0 probeer:terwijl True:#Dit blokkeert totdat het signalen van de Arduino ontvangt. #Het komt pas terug als een ingevuld nummer is ontvangen. sensorReading =waitReceiveNumber (GPIO_Alert) # bereken de spanning van de Arduino-sensorleesspanning =(sensorReading * referenceVoltage) / 1023; logger.info('sensorReading:' + str(sensorReading) + ', voltage:' + str(voltage)) if sensorReading <=lowSensorReading:lowVoltageCount+=1 #increment if lowVoltageCount>=maxLowVoltageCount:logger.info('Laagspanningswaarschuwing ') send_email_alert() lowVoltageCount=0 #reset de teller omdat we een waarschuwing hebben gestuurd anders:lowVoltageCount=0 #reset de teller omdat een goede spanning is ontvangen, behalve KeyboardInterrupt:logger.info('Toetsenbordonderbreking ontvangen') GPIO.cleanup() # GPIO opschonen op CTRL+C exit GPIO.cleanup() # GPIO opschonen################################ ################################################ De test e-mailmethode################################################ ###############################def testEmail():logger.info('Starting HotWaterNotifier') referenceVoltage =1.1 lowVoltageCount=0 probeer:send_email_alert() behalve KeyboardInterrupt:logger.info('Toetsenbordonderbreking ontvangen') GPIO.cleanup() # opschonen GPIO op CTRL+C afsluiten GPIO.cleanup() # opschonen GPIO######## ############ ###################################################################### ########## Een globale variabele##################################### ########################################### Stel een logfilelogger in =setup_custom_logger ('HotWaterNotifier')############################################# ################################### Roep de hoofdmethode aan.## Roep hier testEmail() aan als u wil de e-mailcapaciteit testen.########################################### ####################################if __name__=="__main__":main()
Script om de Python-code te startenSH
Dit is het script dat crontab aanroept om de Python-code te starten
#!/bin/bash# run_HotWaterNotifier.sh# Start de notifiercd /home/pi/hotwatersudo python HotWaterNotifier.py

Productieproces

  1. Kamertemperaturen bewaken met Moteino's en Raspberry Pi
  2. Maak Monitor Ambilight met Arduino
  3. Real-time data-acquisitie van zonnepaneel met behulp van Arduino
  4. De waterdruppels vastleggen met Arduino
  5. Een Arduino-energiemonitor en datalogger bouwen
  6. Hartslagmeter met IoT
  7. Arduino Temp. Monitor en realtimeklok met 3.2-weergave
  8. Aanpasbare Geiger Muller-teller
  9. De perfecte warmtepomp voor warm water
  10. Hoe de beste warmwaterpomp voor huishoudelijk gebruik kiezen?
  11. Een inleiding tot de warmwaterpomp