[PYTHON] Faire un rappel de parapluie avec Raspberry Pi Zero W

Je suis un amateur comme le travail électronique, mais pour commencer

Faites un rappel de parapluie en utilisant. Il y a une application météo sur mon téléphone portable qui dit "Quand il pleut, quelle heure est-il le matin?", Mais quand je sors, je l'oublie parfois. .. C'est comme le mettre dans la porte d'entrée et afficher la probabilité de précipitation sur l'écran LCD déclenché par l'entrée du capteur humain. Je souhaite également utiliser une batterie d'alimentation. Dans certains cas, pensez à réduire la consommation d'énergie. C'était terminé pour le moment! Il n'y a rien de techniquement avancé.

Figure d'achèvement

Il s'est avéré être quelque chose comme ça. Si vous êtes bien préparé à l'entrée, vous serez correctement averti! Je voudrais vérifier combien de temps durera cette batterie. 4AF816CA-8529-40AA-8761-2ECC9EB76447-2791-000001FB8590F7A4.jpg

Ce que tu as préparé

J'ai acheté le GPIO Hammer Header parce que je ne suis pas sûr de la soudure. Le jeu de pièces électroniques OSOYOO est recommandé aux personnes n'ayant aucune expérience du travail électronique. C'est bon marché, le tutoriel est facile et j'en suis satisfait.

Comment utiliser l'écran LCD

Voir ci-dessous. http://osoyoo.com/ja/2016/04/10/drive-16x2-lcd-with-raspberry-pi/ http://osoyoo.com/ja/2016/06/01/drive-i2c-lcd-screen-with-raspberry-pi/

Comment utiliser le capteur humain

Voir ci-dessous. http://osoyoo.com/ja/2016/07/14/motionsensor-pi/

Acquisition de la probabilité de précipitation

J'ai créé l'article enfant suivant. Obtenir la probabilité de précipitation à partir de XML avec Python

Combinaison de chaque fonction

C'était terminé, mais à ce moment-là, j'ai connecté le VCC et le GND de l'écran LCD à l'envers et en ai cassé un: pleurez:

--Améliorations -Requests.get () est appelé une fois pour ~~ 12-18h et 18-24h. ~~ --2017 / 08/13 Addendum: Correction de l'utilisation de la notation d'inclusion tapple (strictement, générateur?) Enseignée par @shiracamus. ――Je ne sais pas comment savoir s'il est rétroéclairé.

umbrella_reminder.py


#!/usr/bin/env python2
# coding: utf-8

# If motion sensor detected a person, get and show today's rain fall chance
# of Yokohama (East of Kanagawa) on LCD for 30 seconds.
# If not, wait 1 second and check again.


# for general use
import time

# for motion sensor (referred to as "MS")
import RPi.GPIO as GPIO

# for LCD
import smbus

# for rain fall chance
import datetime
import requests
import xml.etree.ElementTree as ET


# constants for motion sensor

MS_GPIO_INPUT_PIN = 14


# constants for LCD

LCD_I2C_ADDR                = 0x3F
LCD_CHR_DISP_WIDTH          = 16
LCD_CHR_DRAM_WIDTH          = 0x28
LCD_NUM_LINES               = 2
LCD_PULSE_WAIT              = 0.0005
LCD_DELAY_WAIT              = 0.0005

I2C_CMD_MODE                = 0x00
I2C_CHR_MODE                = 0x01
I2C_ENABLE_BIT              = 0x04
I2C_BACKLIGHT_OFF           = 0x00
I2C_BACKLIGHT_ON            = 0x08


bus = smbus.SMBus(1)


def initialize_gpio_for_ms():

    GPIO.setwarnings(False)
    GPIO.cleanup()
    GPIO.setwarnings(True)

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(MS_GPIO_INPUT_PIN, GPIO.IN, pull_up_down = GPIO.PUD_UP)


def initialize_lcd():

    send_byte_to_lcd(0x33, I2C_CMD_MODE) # establish 4 bits mode
    send_byte_to_lcd(0x32, I2C_CMD_MODE) # establish 4 bits mode

    send_byte_to_lcd(0x01, I2C_CMD_MODE) # 000001 clear display, return cursor to the home position
    # send_byte_to_lcd(0x02, I2C_CMD_MODE) # 000010 return cursor to the home position
    send_byte_to_lcd(0x06, I2C_CMD_MODE) # 000110 cursor move direction: increment, display shift: disabled
    send_byte_to_lcd(0x0C, I2C_CMD_MODE) # 001100 display on, cursor off, blink off
    # send_byte_to_lcd(0x10, I2C_CMD_MODE) # 010000 move cursor without writing, not used for initialization
    send_byte_to_lcd(0x28, I2C_CMD_MODE) # 101000 4 bits mode, use 2 lines, use 5 dots font
    time.sleep(LCD_DELAY_WAIT)


def send_byte_to_lcd(lcd_data, i2c_mode):

    first_data  = ((lcd_data & 0xF0) << 0) | i2c_mode
    second_data = ((lcd_data & 0x0F) << 4) | i2c_mode

    write_and_toggle_lcd_enable(first_data)
    write_and_toggle_lcd_enable(second_data)


def write_and_toggle_lcd_enable(data):

    time.sleep(LCD_DELAY_WAIT)
    bus.write_byte(LCD_I2C_ADDR, (data | I2C_ENABLE_BIT))
    time.sleep(LCD_PULSE_WAIT)
    bus.write_byte(LCD_I2C_ADDR, (data & ~I2C_ENABLE_BIT))
    time.sleep(LCD_DELAY_WAIT)


def turn_off_lcd():

    send_byte_to_lcd(0x08, (I2C_CMD_MODE | I2C_BACKLIGHT_OFF))


def turn_on_lcd():

    send_byte_to_lcd(0x0C, (I2C_CMD_MODE | I2C_BACKLIGHT_ON))


def move_cursor(line, offset):

    if line < 0 or LCD_NUM_LINES <= line:
        print('invalid line')
        return False

    if offset < 0 or LCD_CHR_DRAM_WIDTH <= offset:
        print('invalid offset')
        return False

    if   line == 0:
        line_data = 0x00
    elif line == 1:
        line_data = 0x40

    data = 0x80 + line_data + offset
    send_byte_to_lcd(data, (I2C_CMD_MODE | I2C_BACKLIGHT_ON))

    return True


def show_text_to_line(message, line):

    if move_cursor(line, 0) == False:
        return

    message = message.ljust(LCD_CHR_DISP_WIDTH)

    for i in range(LCD_CHR_DISP_WIDTH):
        send_byte_to_lcd(ord(message[i]), (I2C_CHR_MODE | I2C_BACKLIGHT_ON))


def get_yokohama_rain_fall_chances():

    today = datetime.datetime.today().strftime("%Y/%m/%d")

    url = 'http://www.drk7.jp/weather/xml/14.xml'
    response = requests.get(url)

    root = ET.fromstring(response.content)

    return ((period.get('hour'), period.text)
            for area in root.iter('area')
            if area.get('id').encode('utf-8') == 'Est'
            for info in area.findall('info')
            if info.get('date') == today
            for period in info.find('rainfallchance').findall('period'))


def main():

    initialize_gpio_for_ms()
    initialize_lcd()

    target_periods = '12-18', '18-24'

    while True:

        motion_detected = True if GPIO.input(MS_GPIO_INPUT_PIN) != 0 else False

        if motion_detected:

            print('motion detected')

            turn_on_lcd()

            curr_line = 0
            for period, rain_fall_chance in get_yokohama_rain_fall_chances():
                if period in target_periods:
                    text = period + 'h ' + rain_fall_chance + '%'
                    show_text_to_line(text, curr_line)
                    print(text)
                    curr_line += 1
                    if curr_line >= LCD_NUM_LINES:
                        break

            time.sleep(30)

        else:

            print('motion not detected')

            turn_off_lcd()
            time.sleep(1)


if __name__ == '__main__':

    try:
        main()

    except KeyboardInterrupt:
        pass

    finally:
        send_byte_to_lcd(0x01, I2C_CMD_MODE)
        turn_on_lcd()
        show_text_to_line('Goodbye!', 0)
        GPIO.cleanup()

Batterie d'alimentation

En regardant diverses choses, je craignais que le circuit de protection fonctionne et que la sortie s'arrête lorsque le courant est faible dans les batteries mobiles récentes, mais j'ai pu utiliser ma propre batterie normalement. .. Je me demande si le circuit de protection ne fonctionne pas car il est bon marché? Ou y a-t-il une quantité décente de courant qui circule? Je souhaite également mesurer la consommation électrique. ANKER Astro Slim2

Consommation d'énergie réduite

Je ne l'ai pas encore fait.

Recommended Posts

Faire un rappel de parapluie avec Raspberry Pi Zero W
Faisons un ordinateur de vélo avec Raspberry Pi Zero (W, WH)
Fabriquez un climatiseur intégré à un ordinateur personnel "airpi" avec Raspberry Pi 3!
Faire une minuterie de lavage-séchage avec Raspberry Pi
Faites fonctionner l'oscilloscope avec le Raspberry Pi
Faisons une chemise IoT avec Lambda, Kinesis, Raspberry Pi [Partie 1]
Discord bot raspberry pi zéro avec python [Note]
GPGPU avec Raspberry Pi
DigitalSignage avec Raspberry Pi
Contrôlez les moteurs sans balais avec GPIO de Raspberry Pi Zero
Plantes Mutter avec Raspberry Pi
Jouez avec le module de caméra Raspberry Pi Zero WH Partie 1
Créez des jeux LCD (16x2) avec Raspberry Pi et Python
Fabriquez une voiture robotique à conduite automatique avec Raspberry Pi3 B + et capteur de distance à ultrasons HC-SR04
[Raspberry Pi] Contrôle du moteur pas à pas avec Raspberry Pi
Commande de servomoteur avec Raspberry Pi
Configuration du système d'exploitation avec Raspberry Pi Imager
Créez un thermomètre avec Raspberry Pi et rendez-le visible sur le navigateur Partie 4
Essayez L Chika avec raspberrypi
Faire une boussole d'affichage kanji avec Raspberry Pi et Sense Hat
Construire un serveur VPN avec Raspberry Pie
Essayez de déplacer 3 servos avec Raspeye
Créer un exe Scrapy avec Pyinstaller
Utiliser une webcam avec Raspberry Pi
Créez un convertisseur Ethernet LAN sans fil et un routeur simple avec Raspberry Pi
[Python + PHP] Créez un moniteur de température / humidité / pression avec Raspberry Pi
J'ai essayé de faire un signal avec Raspeye 4 (édition Python)
Créer une socket avec une interface Ethernet (eth0, eth1) (Linux, C, Raspberry Pi)
Mesurer la force du signal SIM avec Raspberry Pi
Créer un contrôleur d'interface audio avec pyusb (2)
Créer un contrôleur d'interface audio avec pyusb (1)
Bonjour le monde avec Raspberry Pi + Minecraft Pi Edition
Créer un environnement Tensorflow avec Raspberry Pi [2020]
Faire en sorte que Raspberry Pi parle japonais en utilisant OpenJtalk
Essayez de pêcher le Wakasagi avec Raspberry Pi
Programmation normale avec la programmation Node-RED avec Raspberry Pi 3
Capteur humain amélioré fabriqué avec Raspberry Pi
Essayez la détection d'objets avec Raspberry Pi 4 + Coral
Travailler avec des capteurs dans Mathematica sur Raspberry Pi
Utiliser le capteur de mouvement PIR avec Raspberry Pi
Modèle Infer Custom Vision avec Raspeye
Créez un compteur de voiture avec Raspberry Pi
Enregistrement de la valeur d'Inkbird IBS-TH1 avec Raspberry Pi
Travailler avec le GPS en Python pour Raspberry Pi 3
J'ai eu une erreur lorsque j'ai mis opencv dans python3 avec Raspeye [Remedy]
J'ai essayé de créer un environnement Ubuntu 20.04 LTS + ROS2 avec Raspberry Pi 4
Essayez de détecter un objet avec RaspberryPi ~ Partie 1: Comparaison de la vitesse de détection ~
Fabriquer un appareil de surveillance avec un capteur infrarouge
J'ai essayé L-Chika avec Razpai 4 (édition Python)
Profitez du travail électronique avec GPIO de Raspberry Pi
MQTT Radicon Car avec Arduino et Raspberry
Allumez / éteignez votre PC avec Raspberry Pi
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)
Observez le groupe de météores Futago avec RaspberryPi4
Obtenez des informations sur le processeur de Raspberry Pi avec Python
Rendre DHT11 disponible avec Raspeye + python (Remarque)
Démarrage de la compilation croisée pour Raspberry Pi Zero sur Ubuntu