Gå till innehåll

Pythonprogrammering?


Gå till lösning Löst av _.M,

Recommended Posts

Sökte på ordet Python och fick träffar som är 12 år gamla, eller mer men gör ett försök ändå.
(Har ställt samma fråga i annat forum som hade en forumkategori för just programmering.)

Jag har denna kod:

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

import time
import board
import adafruit_dht

# Initial the dht device, with data pin connected to:
dhtDevice = adafruit_dht.DHT22(board.D4)

# you can pass DHT22 use_pulseio=False if you wouldn't like to use pulseio.
# This may be necessary on a Linux single board computer like the Raspberry Pi,
# but it will not work in CircuitPython.
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False)

while True:
    try:
        # Print the values to the serial port
        temperature_c = dhtDevice.temperature
        temperature_f = temperature_c * (9 / 5) + 32
        humidity = dhtDevice.humidity
        print(
            "Temp: {:.1f} F / {:.1f} C    Humidity: {}% ".format(
                temperature_f, temperature_c, humidity
            )
        )

    except RuntimeError as error:
        # Errors happen fairly often, DHT's are hard to read, just keep going
        print(error.args[0])
        time.sleep(2.0)
        continue
    except Exception as error:
        dhtDevice.exit()
        raise error

    time.sleep(2.0)

Jag skulle vilja peta in rader som påverkar ett usbrelä vid ett visst gradtal.

Om jag manuellt triggar reläet gör jag det i ett terminalfönster med

usbrelay HW348_1=1

Någon som kan hjälpa mig med detta?

Redigerad av Mikael63
Länk till kommentar
Dela på andra webbplatser

  • Lösning

För det första, är du medveten om att adafruit verkar ha lagt ned supporten på pyton biblioteket du använder? Bara så du vet. 

Kanske något I stil med det här fungerar 

Quote

if temperature_c == 10:

  os.system("usbrelay osv etc") 

Jag är osäker på hur du tar hand om eventuellt svar från usbrelay programmet dock. Och dessa rader bör kluddas, strax under där du tilldelar temperature_c variabeln. 

  • Thanks 1
Länk till kommentar
Dela på andra webbplatser

2 timmar sedan, _.M sade:

För det första, är du medveten om att adafruit verkar ha lagt ned supporten på pyton biblioteket du använder? Bara så du vet. 

Ja, det tog rätt länge innan jag insåg detta. Hittade koden här: https://learn.adafruit.com/dht-humidity-sensing-on-raspberry-pi-with-gdocs-logging/python-setup
och där är det då CircuitPython libraries som används.

2 timmar sedan, _.M sade:

Kanske något I stil med det här fungerar 

Ja det gör det! Jag fick lägga till import os först.

2 timmar sedan, _.M sade:

eventuellt svar från usbrelay

Ja det poppar upp en massa rader...
 

Citat

Orig: HW348, Serial: HW348, Relay: 1 State: ff
Device Found
  type: 16c0 05df
  path: /dev/hidraw0
  serial_number: 
  Manufacturer: www.dcttech.com
  Product:      USBRelay1
  Release:      100
  Interface:    0
  Number of Relays = 1
Serial: HW348, Relay: 1 State: ff 
1 HID Serial: HW348 Serial: HW348, Relay: 1 State: ff

Serial: HW348, Relay: 1 State: ff --- Found
Temp: 76.8 F / 24.9 C    Humidity: 42.4% 

När jag testade så använde jag 

        if temperature_c > 24.4:
                os.system("usbrelay HW348_1=1")
        if temperature_c < 24.4:
                os.system("usbrelay HW348_1=0")

Samplar jag på en sekund får jag ju en väldigt exakt "termostat" :)

 

Länk till kommentar
Dela på andra webbplatser

Jag lägger in hela "min" kod här:

(där är det dock 10 sekunder mellan varje koll av temperaturen)

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

import time
import board
import adafruit_dht
import os

# Initial the dht device, with data pin connected to:
dhtDevice = adafruit_dht.DHT22(board.D4)

# you can pass DHT22 use_pulseio=False if you wouldn't like to use pulseio.
# This may be necessary on a Linux single board computer like the Raspberry Pi,
# but it will not work in CircuitPython.
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False)

while True:
    try:
        # Print the values to the serial port
        temperature_c = dhtDevice.temperature
        setpoint = 22.6
        if temperature_c > setpoint:
                os.system("usbrelay HW348_1=1")
        if temperature_c < setpoint:
                os.system("usbrelay HW348_1=0")
        print(
            "{:.1f}".format(
                temperature_c
            )
        )

    except RuntimeError as error:
        # Errors happen fairly often, DHT's are hard to read, just keep going
        print(error.args[0])
        time.sleep(2.0)
        continue
    except Exception as error:
        dhtDevice.exit()
        raise error

    time.sleep(2.0)

 

Redigerad av Mikael63
rensat koden för mitt behov
  • Like 1
Länk till kommentar
Dela på andra webbplatser

Jag kan ju fylla på med denna bild..

image.png.cf2ebd5d1f88b2f5bccf399f1ca251b0.png

som jag har tagit härifrån https://www.researchgate.net/figure/Wiring-diagram-for-connecting-the-DHT22-sensor-to-the-RPi_fig3_335740857

***

USB-reläet då?
Ja jag vet inte när jag fick den idén. På chans skaffade jag ett av de billigaste hos Jeff B,s svenska webbshop. Hade inte några större förhoppningar att mitt tålamod skulle räcka för att få liv i det men där tog jag faktiskt fel (men säg inte det till nån).

I åtminstone Linux Mint och i Raspberry Pi OS "finns" paketet usbrelay. Installeras snabbt med sudo apt install usbrelay

vad reläet heter får man fram genom att skriva usbrelay i terminalen:

Citat

Device Found
  type: 16c0 05df
  path: /dev/hidraw2
  serial_number: 
  Manufacturer: www.dcttech.com
  Product:      USBRelay1
  Release:      100
  Interface:    0
  Number of Relays = 1
HW348_1=0

I mitt fall heter det då HW341_1 och nu har det statusen 0 dvs AV

 

Jag har "snyggat" till koden lite, byter ut den ovan..

 

 

Länk till kommentar
Dela på andra webbplatser

  • 1 månad senare...

Nu har jag hittat ett annat användningsområde :rolleyes:

Koden ser nu ut så här:

# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# SPDX-License-Identifier: MIT

import time
import board
import adafruit_dht
import os
import requests

# Initial the dht device, with data pin connected to:
dhtDevice = adafruit_dht.DHT22(board.D4)

# you can pass DHT22 use_pulseio=False if you wouldn't like to use pulseio.
# This may be necessary on a Linux single board computer like the Raspberry Pi,
# but it will not work in CircuitPython.
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False)
temperature_d = 20      #init value


while True:
    try:
        # Print the values to the serial port
        temperature_c = dhtDevice.temperature
        temperature_a = temperature_c - 1.8
        temperature_b = str("{:.1f}".format (temperature_a))
        humidity = dhtDevice.humidity
        fukt = str("{} %".format (humidity))
        result = "Temp " + str(temperature_b) + " °C   Fukt " + str(fukt)
        if temperature_a < temperature_d - 1:
                requests.post("https://ntfy.sh/xxxxtemp",data=result.encode(encoding='utf-8'))
                temperature_d = temperature_a
        if temperature_a > temperature_d + 1:
                requests.post("https://ntfy.sh/xxxxtemp",data=result.encode(encoding='utf-8'))
                temperature_d = temperature_a
        print(
            "{:.1f} {:.1f} {:.1f} {} % ".format(
                temperature_c, temperature_a, temperature_d, humidity
            )
        )

    except RuntimeError as error:
        # Errors happen fairly often, DHT's are hard to read, just keep going
        print(error.args[0])
        time.sleep(2.0)
        continue
    except Exception as error:
        dhtDevice.exit()
        raise error

    time.sleep(600.0)

Vad gör då detta? Jo, var 10:e minut görs en kontroll av yttertemperaturen. Är avvikelsen mer än en (1) °C från föregående mätning skickas ett pushmeddelande till min surfplatta. Meddelandet skickas med hjälp av ntfy.sh och tas emot av den appen i surfplattan. Vill jag kolla hur många grader det är öppnar jag appen och kollar.

Väderappar i all ära men de visar i regel den temperatur som prognosen, någon gång längre tillbaks i tid, trodde det skulle bli. Ja, undantaget https://rl.se då förstås.

(-1,8 i koden är för att "kalibrera" temperaturen)

Redigerad av Mikael63
lite uppfixad kod
Länk till kommentar
Dela på andra webbplatser

  • 1 år senare...
Postad (redigerade)

Får skämmas lite. Skulle ha uppdaterat denna tråd för mer än ett år sedan!

Det blev inget av med projektet ovan. Det gick inte att hantera minusgrader och då blir det en rätt kass utomhustermometer. Sensorn i sig klarar minus men inte "biblioteket".

***

Nu har dock projektet återupptagits och nu med en annan sensor.
Jag snodde hela upplägget härifrån:
https://raspberrypi-guide.github.io/electronics/temperature-monitoring

Modifierade koden så att jag får notis i telefonen:

#!/usr/bin/env python

import os
import glob
import time
import datetime
import requests

def read_temp(decimals = 1, sleeptime = 600):

    """Reads the temperature from a 1-wire device"""

    device = glob.glob("/sys/bus/w1/devices/" + "28*")[0] + "/w1_slave"
    lasttemp = 20 #init value
    while True:
        try:
            timepoint = datetime.datetime.now()
            with open(device, "r") as f:
                lines = f.readlines()
            while lines[0].strip()[-3:] != "YES":
                time.sleep(0.2)
                lines = read_temp_raw()
            timepassed = (datetime.datetime.now() - timepoint).total_seconds()
            equals_pos = lines[1].find("t=")
            if equals_pos != -1:
                temp_string = lines[1][equals_pos+2:]
                temp = round(float(temp_string) / 1000.0, decimals)
                print(time.strftime("%d/%m/%y@%H:%M:%S - ")+str(temp)+" C")
                if temp > lasttemp + 1:
                    requests.post("https://ntfy.sh/minprenumeration_hos_ntfy",data=str(temp)+" C")
                    lasttemp = temp
                if temp < lasttemp - 1:
                    requests.post("https://ntfy.sh/minprenumeration_hos_ntfy",data=str(temp)+" C")
                    lasttemp = temp
                time.sleep(sleeptime-timepassed)
                timepoint = datetime.datetime.now()
        except KeyboardInterrupt:
            break

if __name__ == "__main__":
    read_temp()

 

Redigerad av Mikael63
  • Like 2
Länk till kommentar
Dela på andra webbplatser

Delta i dialogen

Du kan skriva svaret nu och registrera dig senare, Om du har ett konto, logga in nu för att svara på inlägget.

Gäst
Svara i detta ämne...

×   Du har klistrat in innehåll med formatering.   Ta bort formatering

  Only 75 emoji are allowed.

×   Din länk har automatiskt bäddats in.   Visa som länk istället

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Skapa nytt...