Ballon sonde

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

  1. je voudrai que le programme prenne la température et la prétion
    puit qu'il prenne les photo
    1. Contributeur
      es-tu certain de t'être bien exprimé?
      peux-tu être plus précis? dans quel ordre doit-il faire tout cela?
    2. @yg_beje pense avoir plus détailler si dessous dans réponse |
      \/
  2. 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 .
    1. Contributeur
      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.
    2. @yg_becomme ç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()
    3. Contributeur
      @codeur_du_01as-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?
    4. @yg_beoui 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'
  3. bonjour

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