Ballon sonde

Fermé
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021 - Modifié le 10 avril 2021 à 19:12
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021 - 11 avril 2021 à 15:52
Bonjour, j'ai un problème avec mon code , j'ai un programme timelapse et un programme de température présion que je doit assembler et je n'ai pas les connaissance requise les programmes à assembles son :
pour la temp:

 import smbus
import picamera
import time
from datetime import datetime
from ctypes import c_short
from ctypes import c_byte
from ctypes import c_ubyte


DEVICE = 0x76  # Default device I2C address


bus = smbus.SMBus(1)  # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1
# Rev 1 Pi uses bus 0


def getShort(data, index):
    # return two bytes from data as a signed 16-bit value
    return c_short((data[index + 1] << 8) + data[index]).value


def getUShort(data, index):
    # return two bytes from data as an unsigned 16-bit value
    return (data[index + 1] << 8) + data[index]


def getChar(data, index):
    # return one byte from data as a signed char
    result = data[index]
    if result > 127:
        result -= 256
    return result


def getUChar(data, index):
    # return one byte from data as an unsigned char
    result = data[index] & 0xFF
    return result


def readBME280ID(addr=DEVICE):
    # Chip ID Register Address
    REG_ID = 0xD0
    (chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
    return (chip_id, chip_version)


def readBME280All(addr=DEVICE):
    # Register Addresses
    REG_DATA = 0xF7
    REG_CONTROL = 0xF4
    REG_CONFIG = 0xF5

    REG_CONTROL_HUM = 0xF2
    REG_HUM_MSB = 0xFD
    REG_HUM_LSB = 0xFE

    # Oversample setting - page 27
    OVERSAMPLE_TEMP = 2
    OVERSAMPLE_PRES = 2
    MODE = 1

    # Oversample setting for humidity register - page 26
    OVERSAMPLE_HUM = 2
    bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM)

    control = OVERSAMPLE_TEMP << 5 | OVERSAMPLE_PRES << 2 | MODE
    bus.write_byte_data(addr, REG_CONTROL, control)

    # Read blocks of calibration data from EEPROM
    # See Page 22 data sheet
    cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
    cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
    cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)

    # Convert byte data to word values
    dig_T1 = getUShort(cal1, 0)
    dig_T2 = getShort(cal1, 2)
    dig_T3 = getShort(cal1, 4)

    dig_P1 = getUShort(cal1, 6)
    dig_P2 = getShort(cal1, 8)
    dig_P3 = getShort(cal1, 10)
    dig_P4 = getShort(cal1, 12)
    dig_P5 = getShort(cal1, 14)
    dig_P6 = getShort(cal1, 16)
    dig_P7 = getShort(cal1, 18)
    dig_P8 = getShort(cal1, 20)
    dig_P9 = getShort(cal1, 22)

    dig_H1 = getUChar(cal2, 0)
    dig_H2 = getShort(cal3, 0)
    dig_H3 = getUChar(cal3, 2)

    dig_H4 = getChar(cal3, 3)
    dig_H4 = (dig_H4 << 24) >> 20
    dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)

    dig_H5 = getChar(cal3, 5)
    dig_H5 = (dig_H5 << 24) >> 20
    dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)

    dig_H6 = getChar(cal3, 6)

    # Wait in ms (Datasheet Appendix B: Measurement time and current calculation)
    wait_time = (
        1.25
        + (2.3 * OVERSAMPLE_TEMP)
        + ((2.3 * OVERSAMPLE_PRES) + 0.575)
        + ((2.3 * OVERSAMPLE_HUM) + 0.575)
    )
    time.sleep(wait_time / 1000)  # Wait the required time

    # Read temperature/pressure/humidity
    data = bus.read_i2c_block_data(addr, REG_DATA, 8)
    pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
    temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
    hum_raw = (data[6] << 8) | data[7]

    # Refine temperature
    var1 = ((((temp_raw >> 3) - (dig_T1 << 1))) * (dig_T2)) >> 11
    var2 = (
        ((((temp_raw >> 4) - (dig_T1)) * ((temp_raw >> 4) - (dig_T1))) >> 12) * (dig_T3)
    ) >> 14
    t_fine = var1 + var2
    temperature = float(((t_fine * 5) + 128) >> 8)

    # Refine pressure and adjust for temperature
    var1 = t_fine / 2.0 - 64000.0
    var2 = var1 * var1 * dig_P6 / 32768.0
    var2 = var2 + var1 * dig_P5 * 2.0
    var2 = var2 / 4.0 + dig_P4 * 65536.0
    var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0
    var1 = (1.0 + var1 / 32768.0) * dig_P1
    if var1 == 0:
        pressure = 0
    else:
        pressure = 1048576.0 - pres_raw
        pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
        var1 = dig_P9 * pressure * pressure / 2147483648.0
        var2 = pressure * dig_P8 / 32768.0
        pressure = pressure + (var1 + var2 + dig_P7) / 16.0

    # Refine humidity
    humidity = t_fine - 76800.0
    humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (
        dig_H2
        / 65536.0


* (
            1.0
            + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity)
        )
    )
    humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
    if humidity > 100:
        humidity = 100
    elif humidity < 0:
        humidity = 0

    return temperature / 100.0, pressure / 100.0, humidity


#################################################################################################


def display_data(nb_for, chip_id, chip_version, temperature, pressure, humidity):
    # affichage des données collectées grâce aux librairies readBME280ID & readBME280All
    now = datetime.now()
    print("\n{}: {}ème fois...".format(now.strftime("%d/%m/%Y %H:%M:%S"), nb_for + 1))
    print("Chip ID     : ", chip_id)
    print("Version     : ", chip_version)
    print("Temperature : ", temperature, "C")
    print("Pression    : ", pressure, "hPa")
    print("Humidité    : ", humidity, "%")


def record_data(chip_id, chip_version, temperature, pressure, humidity):
    # mise en forme des données collectées à enregistrer
    now = datetime.now()

    mesures = "{}\n\nChip ID     : {}\nVersion     : {}\nTemperature : {}C\nPression    : {}hPa\nHumidité    : {}%\n\n".format(
        now.strftime("%d/%m/%Y %H:%M:%S"),
        chip_id,
        chip_version,
        temperature,
        pressure,
        humidity,
    )
    # stockage des données formatées dans un fichier mesures.txt à la racine
    with open("mesures.txt", "a") as file:
        file.write(mesures)


#################################################################################################


def main():
    # fonction principale
    print(" start ".center(50, "-"))
    for nb_for in range(3):  # nb fois que la boucle est parcourrue au total

        # récupération des données via les appareils de mesures
        chip_id, chip_version = readBME280ID()
        temperature, pressure, humidity = readBME280All()

        # actionner la fonction display
        display_data(nb_for, chip_id, chip_version, temperature, pressure, humidity)
        # actionner la fonction record
        record_data(chip_id, chip_version, temperature, pressure, humidity)

        time.sleep(3)  # nb secondes d'attente

    print(" end ".center(50, "-"))

if __name__ == "__main__":
    # execution du programme
    main()




##############################

Et pour la timelaps :
###############################

import time
import picamera
with picamera.PiCamera() as camera:
    for n in range(3):
        camera.start_preview()
        time.sleep(2)
        camera.capture_sequence([
            'image%02d.jpg' % i
            for i in range(1)
         ])
    camera.stop_preview()


EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici : ICI

Merci d'y penser dans tes prochains messages.

4 réponses

yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
10 avril 2021 à 20:11
bonjour,
quel comportement attends-tu?
0
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021
10 avril 2021 à 20:38
je voudrai que le programme prenne la température et la prétion
puit qu'il prenne les photo
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
10 avril 2021 à 20:58
es-tu certain de t'être bien exprimé?
peux-tu être plus précis? dans quel ordre doit-il faire tout cela?
0
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
Modifié le 11 avril 2021 à 10:57
je pense avoir plus détailler si dessous dans réponse |
\/
0
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021
10 avril 2021 à 22:56
le premier programme présenter doit d'abord prendre la température , pression , humidité : ensuit,
il les enregistre dans un fichier "mesures.txt" .
Le deuxième programme présenter , qui luit prend plusieurs photo.
Et donc en ajoutent les deux programmes :
je voudrais que le programme prenne la température , la pression et l'humidité en les enregistrent dans le fichiée "mesurs.txt" et une fois fais , il faut qu'il prenne des photo.



je travail sur un rasberry a l'école pour un projet avec le B.I.A ;on envoi un ballon sond , je pourrait donc pas tester le programme pour l'instant en raison du confinement .
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471
11 avril 2021 à 11:13
ok, je me demandais dans quel ordre tout cela devait se passer.
le plus simple, me semble, alors, dans le fichier "temp":
- de créer une fonction timelaps()
- de mettre dans cette fonction les ligne 3 à 11 du fichier "timelaps"
- d'appeler cette fonction en ligne 212 du fichier "temp", juste avant les trois secondes d'attente.

il est également possible de faire un seul programme en gardant les deux fichiers séparés.
0
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
Modifié le 11 avril 2021 à 12:52
comme ça :


import smbus
import picamera
import time
from datetime import datetime
from ctypes import c_short
from ctypes import c_byte
from ctypes import c_ubyte


DEVICE = 0x76 # Default device I2C address


bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 uses bus 1
# Rev 1 Pi uses bus 0


def getShort(data, index):
# return two bytes from data as a signed 16-bit value
return c_short((data[index + 1] << 8) + data[index]).value


def getUShort(data, index):
# return two bytes from data as an unsigned 16-bit value
return (data[index + 1] << 8) + data[index]


def getChar(data, index):
# return one byte from data as a signed char
result = data[index]
if result > 127:
result -= 256
return result


def getUChar(data, index):
# return one byte from data as an unsigned char
result = data[index] & 0xFF
return result


def readBME280ID(addr=DEVICE):
# Chip ID Register Address
REG_ID = 0xD0
(chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
return (chip_id, chip_version)


def readBME280All(addr=DEVICE):
# Register Addresses
REG_DATA = 0xF7
REG_CONTROL = 0xF4
REG_CONFIG = 0xF5

REG_CONTROL_HUM = 0xF2
REG_HUM_MSB = 0xFD
REG_HUM_LSB = 0xFE

# Oversample setting - page 27
OVERSAMPLE_TEMP = 2
OVERSAMPLE_PRES = 2
MODE = 1

# Oversample setting for humidity register - page 26
OVERSAMPLE_HUM = 2
bus.write_byte_data(addr, REG_CONTROL_HUM, OVERSAMPLE_HUM)

control = OVERSAMPLE_TEMP << 5 | OVERSAMPLE_PRES << 2 | MODE
bus.write_byte_data(addr, REG_CONTROL, control)

# Read blocks of calibration data from EEPROM
# See Page 22 data sheet
cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)

# Convert byte data to word values
dig_T1 = getUShort(cal1, 0)
dig_T2 = getShort(cal1, 2)
dig_T3 = getShort(cal1, 4)

dig_P1 = getUShort(cal1, 6)
dig_P2 = getShort(cal1, 8)
dig_P3 = getShort(cal1, 10)
dig_P4 = getShort(cal1, 12)
dig_P5 = getShort(cal1, 14)
dig_P6 = getShort(cal1, 16)
dig_P7 = getShort(cal1, 18)
dig_P8 = getShort(cal1, 20)
dig_P9 = getShort(cal1, 22)

dig_H1 = getUChar(cal2, 0)
dig_H2 = getShort(cal3, 0)
dig_H3 = getUChar(cal3, 2)

dig_H4 = getChar(cal3, 3)
dig_H4 = (dig_H4 << 24) >> 20
dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)

dig_H5 = getChar(cal3, 5)
dig_H5 = (dig_H5 << 24) >> 20
dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)

dig_H6 = getChar(cal3, 6)

# Wait in ms (Datasheet Appendix B: Measurement time and current calculation)
wait_time = (
1.25
+ (2.3 * OVERSAMPLE_TEMP)
+ ((2.3 * OVERSAMPLE_PRES) + 0.575)
+ ((2.3 * OVERSAMPLE_HUM) + 0.575)
)
time.sleep(wait_time / 1000) # Wait the required time

# Read temperature/pressure/humidity
data = bus.read_i2c_block_data(addr, REG_DATA, 8)
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
hum_raw = (data[6] << 8) | data[7]

# Refine temperature
var1 = ((((temp_raw >> 3) - (dig_T1 << 1))) * (dig_T2)) >> 11
var2 = (
((((temp_raw >> 4) - (dig_T1)) * ((temp_raw >> 4) - (dig_T1))) >> 12) * (dig_T3)
) >> 14
t_fine = var1 + var2
temperature = float(((t_fine * 5) + 128) >> 8)

# Refine pressure and adjust for temperature
var1 = t_fine / 2.0 - 64000.0
var2 = var1 * var1 * dig_P6 / 32768.0
var2 = var2 + var1 * dig_P5 * 2.0
var2 = var2 / 4.0 + dig_P4 * 65536.0
var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0
var1 = (1.0 + var1 / 32768.0) * dig_P1
if var1 == 0:
pressure = 0
else:
pressure = 1048576.0 - pres_raw
pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
var1 = dig_P9 * pressure * pressure / 2147483648.0
var2 = pressure * dig_P8 / 32768.0
pressure = pressure + (var1 + var2 + dig_P7) / 16.0

# Refine humidity
humidity = t_fine - 76800.0
humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.0 * humidity)) * (
dig_H2
/ 65536.0
  • (

1.0
+ dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity)
)
)
humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
if humidity > 100:
humidity = 100
elif humidity < 0:
humidity = 0

return temperature / 100.0, pressure / 100.0, humidity


#################################################################################################


def display_data(nb_for, chip_id, chip_version, temperature, pressure, humidity):
# affichage des données collectées grâce aux librairies readBME280ID & readBME280All
now = datetime.now()
print("\n{}: {}ème fois...".format(now.strftime("%d/%m/%Y %H:%M:%S"), nb_for + 1))
print("Chip ID : ", chip_id)
print("Version : ", chip_version)
print("Temperature : ", temperature, "C")
print("Pression : ", pressure, "hPa")
print("Humidité : ", humidity, "%")


def record_data(chip_id, chip_version, temperature, pressure, humidity):
# mise en forme des données collectées à enregistrer
now = datetime.now()

mesures = "{}\n\nChip ID : {}\nVersion : {}\nTemperature : {}C\nPression : {}hPa\nHumidité : {}%\n\n".format(
now.strftime("%d/%m/%Y %H:%M:%S"),
chip_id,
chip_version,
temperature,
pressure,
humidity,
)
# stockage des données formatées dans un fichier mesures.txt à la racine
with open("mesures.txt", "a") as file:
file.write(mesures)


#################################################################################################


def main():
# fonction principale
print(" start ".center(50, "-"))
for nb_for in range(3): # nb fois que la boucle est parcourrue au total

# récupération des données via les appareils de mesures
chip_id, chip_version = readBME280ID()
temperature, pressure, humidity = readBME280All()

# actionner la fonction display
display_data(nb_for, chip_id, chip_version, temperature, pressure, humidity)
# actionner la fonction record
record_data(chip_id, chip_version, temperature, pressure, humidity)

time.sleep(3) # nb secondes d'attente

print(" end ".center(50, "-"))
time.sleep(1)

######################################################

with picamera.PiCamera() as camera:
for n in range(3):
camera.start_preview()
time.sleep(5)
camera.capture_sequence([
'image%02d.jpg' % i
for i in range(1)
])
camera.stop_preview()



if __name__ == "__main__":
# execution du programme
main()
0
yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024 1 471 > codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021
11 avril 2021 à 14:38
as-tu lu les explications (en dessous de ta question de départ) à propos de comment poster du code?
as-tu testé le code que tu montres?
0
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021 > yg_be Messages postés 22707 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 19 avril 2024
11 avril 2021 à 15:52
oui j'ai lu les instruction , mais le programme je ne peut pas le tester parce-que je n'est pas de rasberry à la
maison il faut que j'attende la rentrer pour le tester .
mais il n'y a pas d'erreurs de syntaxe quand je le lance .

Traceback (most recent call last):
File "ballsond.py", line 1, in <module>
import smbus
ModuleNotFoundError: No module named 'smbus'
0
codeur_du_01 Messages postés 7 Date d'inscription samedi 10 avril 2021 Statut Membre Dernière intervention 11 avril 2021
11 avril 2021 à 10:34
bonjour

ce sont deux programmes différent qui fonctionne , mais j'aimerais que sa ne soi que un seul programme .
0