Temperature log na Virtualbox

Tematy związane z RPI
RaPi
Posty: 5
Rejestracja: 12 listopada 2022, 20:14

Temperature log na Virtualbox

Post autor: RaPi »

Witam
Mam odpalone Rapsberry na Virtualboxie i za zadanie mam stworzyc graf pokazujacy temp procka
( https://projects.raspberrypi.org/en/pro ... ture-log/0 )
tylko ze to nie mozliwe jadac na VB, i napisalem kod :

Kod: Zaznacz cały

import random

temperautur = random.uniform(40, 60)
print(temperautur)
ktory wypluwa losowe liczby miedzy 40 i 60. Moje pytanie jest jak wstawic ten kod w kod gdzie temp jest zczytywana z procka, tutaj kod:

Kod: Zaznacz cały

from gpiozero import CPUTemperature
from time import sleep, strftime, time
import matplotlib.pyplot as plt

cpu = CPUTemperature()

plt.ion()
x = []
y = []

def write_temp(temp):
    with open("/home/pi/cpu_temp.csv", "a") as log:
        log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str(temp)))

def graph(temp):
    y.append(temp)
    x.append(time())
    plt.clf()
    plt.scatter(x,y)
    plt.plot(x,y)
    plt.draw()

while True:
    temp = cpu.temperature
    write_temp(temp)
    graph(temp)
    plt.pause(1)
Niewiem czy dobrze kombinuje ze cos trzeba zrobic z : from gpiozero import CPUTemperature
Awatar użytkownika
dedito
Moderator
Posty: 3410
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Temperature log na Virtualbox

Post autor: dedito »

Rozwiązanie 1:
Można zakomentować/usunąć/zmodyfikować funkcje biblioteki gpiozero i dorzucić swoje linijki oparte o funkcję random.

Rozwiązanie 2:
Doinstaluj sobie w systemie na VB bibliotekę gpiozero i wtedy "twój" kod powinien działać z ewentualnymi drobnymi przeróbkami np. stosując parametr sensor_file w funkcji CPUTemperature,
Np. u mnie na Debianie temperatury CPU znajduję w /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input (zamiast domyślnej ścieżki /sys/class/thermal/thermal_zone0/temp) czyli definicja zmiennej u mnie wyglądałaby tak:

Kod: Zaznacz cały

cpu = CPUTemperature(sensor_file='/sys/devices/platform/coretemp.0/hwmon/hwmon1/temp2_input')
Literatura: https://gpiozero.readthedocs.io/en/stab ... emperature

Dodatkowo na Debianie stosuję takie "obejście" na gpiozero, bo bez tego wyrzuca mi błąd z pin_factory:

Kod: Zaznacz cały

import os
os.environ['GPIOZERO_PIN_FACTORY'] = os.environ.get('GPIOZERO_PIN_FACTORY', 'mock')
Literatura: https://gpiozero.readthedocs.io/en/stab ... #mock-pins
RaPi
Posty: 5
Rejestracja: 12 listopada 2022, 20:14

Re: Temperature log na Virtualbox

Post autor: RaPi »

Super, dziekuje za podpowiedzi, poradzilem sobie zanim otrzymalem odpowiedz, ale Rozwiazanie 2 tez jest ciekawe i sprawdze je.
Poradzilem sobie w nastepujacy sposob:

Kod: Zaznacz cały

from gpiozero import CPUTemperature
from time import sleep, strftime, time
import random
trl = random.uniform(40, 60)
print(trl)
import matplotlib.pyplot as plt


plt.ion()
x = []
y = []

def write_temp(temp):
    with open("/home/pi/cpu_temp.csv", "a") as log:
        log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str(temp)))

def graph(temp):
    y.append(temp)
    x.append(time())
    plt.clf()
    plt.scatter(x,y)
    plt.plot(x,y)
    plt.draw()

while True:
    temp = trl
    write_temp(temp)
    graph(temp)
    plt.pause(2)
Pytanie mam nastepujace, po odpaleniu kodu wszystko jest ok, zapisuje temperature do pliku i pojawia sie wykres, ale na wykresie caly czas stala temperature gdyz random.uniform(40, 60) odpala sie tylko raz i wykres opiera sie tylko na tej jednej temperaturze.
Czy jest mozliwe zastosowanie jakiegos loopa lub cos podobnego tak zeby graf pokazywal wiecej niz jedna temperature?
Mam nadzieje ze wyrazilem sie zrozumiale ;)
https://ibb.co/7kqzpRw
Awatar użytkownika
dedito
Moderator
Posty: 3410
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Temperature log na Virtualbox

Post autor: dedito »

Co do bieżącego kodu:
Temperatura jest stała bo losujesz tylko raz.
Losuj w pętli while, wtedy temperatura będzie się zmieniać.

Co do rozwiązania nr2, widzę, że masz w bieżącym, działającym kodzie niezakomentowaną linijkę

Kod: Zaznacz cały

from gpiozero import CPUTemperature
więc już chyba masz obsługę wspomnianej biblioteki.
Pozostaje więc tylko znaleźć ścieżkę systemową do temperatury CPU, aby mieć działające rozwiązanie oparte o rzeczywiste temperatury CPU.
RaPi
Posty: 5
Rejestracja: 12 listopada 2022, 20:14

Re: Temperature log na Virtualbox

Post autor: RaPi »

dedito pisze: 20 listopada 2022, 18:10 Co do bieżącego kodu:
Temperatura jest stała bo losujesz tylko raz.
Losuj w pętli while, wtedy temperatura będzie się zmieniać.
Dodalem losowanie w petli i wyglada to tak:

https://ibb.co/jgQkHj2

Ale ciagle losuje a graf sie nie odpala, wyglada to tak jak by graf odpalal sie dopiero po wylosowaniu liczby a ze losuje caly czas to blokuje graf, jest jakis sposob na to?
Awatar użytkownika
dedito
Moderator
Posty: 3410
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Temperature log na Virtualbox

Post autor: dedito »

Nie widać pełnego kodu na tym obrazku, ale domyślam się na czym polega błąd.
Chyba stworzyłeś kolejną pętle while, a ja miałem na myśli istniejącą już pętle while.

Poza tym wklej pełny kod w formie tekstowej na forum w znaczniki code, bo z obrazka nie przekleję kodu aby go przetestować.

Polecam przerobić jakiś kurs pythona.
RaPi
Posty: 5
Rejestracja: 12 listopada 2022, 20:14

Re: Temperature log na Virtualbox

Post autor: RaPi »

dedito pisze: 20 listopada 2022, 21:09 Nie widać pełnego kodu na tym obrazku, ale domyślam się na czym polega błąd.
Chyba stworzyłeś kolejną pętle while, a ja miałem na myśli istniejącą już pętle while.

Poza tym wklej pełny kod w formie tekstowej na forum w znaczniki code, bo z obrazka nie przekleję kodu aby go przetestować.

Polecam przerobić jakiś kurs pythona.
Jestem zupelnie zielony jezeli chodzi o pythona i ucze sie podstaw, to akurat jest jedno z zadan i idzie mi to topornie, niestety. Dziekuje za podpowiedzi, dzieki nim poradzilem sobie, dzieki.

Kod: Zaznacz cały

from gpiozero import CPUTemperature
from time import sleep, strftime, time




import matplotlib.pyplot as plt


plt.ion()
x = []
y = []

def write_temp(temp):
    with open("/home/pi/cpu_temp.csv", "a") as log:
        log.write("{0},{1}\n".format(strftime("%Y-%m-%d %H:%M:%S"),str(temp)))

def graph(temp):
    y.append(temp)
    x.append(time())
    plt.clf()
    plt.scatter(x,y)
    plt.plot(x,y)
    plt.draw()

while True:
    import random
    trl = random.uniform(40, 60)
    print(trl)

    temp = trl
    write_temp(temp)
    graph(temp)
    plt.pause(1)

Awatar użytkownika
dedito
Moderator
Posty: 3410
Rejestracja: 18 listopada 2013, 21:07
Lokalizacja: Gliwice

Re: Temperature log na Virtualbox

Post autor: dedito »

Na początki nauki może być.
Z czasem powinno być lepiej.
Zamykam.
Zablokowany