[PYTHON] Machen Sie eine Regenschirmerinnerung mit Raspberry Pi Zero W.

Ich bin ein Amateur wie elektronische Arbeit, aber um loszulegen

Machen Sie eine Regenschirmerinnerung mit. Auf meinem Handy befindet sich eine Wetter-App mit der Aufschrift "Wenn es regnen soll, wie spät ist es am Morgen?". Aber wenn ich ausgehe, vergesse ich es manchmal. .. Es ist, als würde man es in die Vordertür stecken und die Niederschlagswahrscheinlichkeit auf dem LCD anzeigen, die durch die Eingabe des menschlichen Sensors ausgelöst wird. Ich möchte auch eine Akku verwenden. In einigen Fällen sollten Sie den Stromverbrauch reduzieren. Es wurde vorerst fertiggestellt! Technisch ist nichts fortgeschritten.

Abbildung der Fertigstellung

Es stellte sich heraus, dass es so etwas war. Wenn Sie am Eingang richtig vorbereitet sind, werden Sie richtig benachrichtigt! Ich möchte überprüfen, wie lange diese Batterie hält. 4AF816CA-8529-40AA-8761-2ECC9EB76447-2791-000001FB8590F7A4.jpg

Was du vorbereitet hast

Ich habe den GPIO Hammer Header gekauft, weil ich nicht sicher bin, ob ich löten kann. Das OSOYOO-Set für elektronische Teile wird Personen empfohlen, die keine Erfahrung mit elektronischer Arbeit haben. Es ist billig, das Tutorial ist einfach und ich bin zufrieden.

Verwendung des LCD

Siehe unten. 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/

Verwendung des menschlichen Sensors

Siehe unten. http://osoyoo.com/ja/2016/07/14/motionsensor-pi/

Erfassung der Niederschlagswahrscheinlichkeit

Ich habe den folgenden untergeordneten Artikel erstellt. Abrufen der Niederschlagswahrscheinlichkeit aus XML mit Python

Kombination jeder Funktion

Es ist alles erledigt, aber als ich an diesem Punkt angekommen bin, habe ich den VCC und den GND des LCD umgekehrt angeschlossen und einen gebrochen: cry:

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') == 'Ost'
            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()

Netzteilbatterie

Beim Betrachten verschiedener Dinge war ich besorgt, dass die Schutzschaltung funktioniert und der Ausgang stoppt, wenn der Strom in neueren mobilen Batterien gering ist, aber ich konnte meine eigene Batterie normal verwenden. .. Ich frage mich, ob die Schutzschaltung nicht funktioniert, weil sie billig ist. Oder fließt ordentlich Strom? Ich möchte auch den Stromverbrauch messen. ANKER Astro Slim2

Reduzierung des Stromverbrauchs

Ich habe es noch nicht getan.

Recommended Posts

Machen Sie eine Regenschirmerinnerung mit Raspberry Pi Zero W.
Machen wir einen Fahrradcomputer mit Raspberry Pi Zero (W, WH)
Machen Sie einen in die Klimaanlage integrierten Personal Computer "airpi" mit Raspberry Pi 3!
Machen Sie einen Waschtrocknungs-Timer mit Raspberry Pi
Bedienen Sie das Oszilloskop mit dem Raspberry Pi
Machen wir ein IoT-Shirt mit Lambda, Kinesis, Raspberry Pi [Teil 1]
Discord Bot Himbeere Pi Null mit Python [Hinweis]
GPGPU mit Raspberry Pi
DigitalSignage mit Raspberry Pi
Steuern Sie bürstenlose Motoren mit GPIO von Raspberry Pi Zero
Mutter pflanzt mit Raspberry Pi
Spielen Sie mit dem Raspberry Pi Zero WH-Kameramodul Teil 1
Erstellen Sie LCD-Spiele (16x2) mit Raspberry Pi und Python
Machen Sie ein Auto mit automatischem Fahrroboter mit Raspberry Pi3 B + und Ultraschall-Abstandssensor HC-SR04
[Raspberry Pi] Schrittmotorsteuerung mit Raspberry Pi
Servomotorsteuerung mit Raspberry Pi
Betriebssystem-Setup mit Raspberry Pi Imager
Machen Sie ein Thermometer mit Raspberry Pi und machen Sie es im Browser Teil 4 sichtbar
Probieren Sie L Chika mit Himbeerpi
Erstellen Sie einen Kanji-Kompass mit Raspberry Pi und Sense Hat
Aufbau eines VPN-Servers mit Raspberry Pie
Versuchen Sie, 3 Servos mit Raspeye zu bewegen
Machen Sie Scrapy exe mit Pyinstaller
Verwenden einer Webkamera mit Raspberry Pi
Erstellen Sie mit Raspberry Pi einen WLAN-Ethernet-Konverter und einen einfachen Router
[Python + PHP] Erstellen Sie mit Raspberry Pi einen Temperatur-, Feuchtigkeits- und Druckmonitor
Ich habe versucht, mit Raspeye 4 (Python Edition) ein signalähnliches Signal zu erzeugen.
Erstellen Sie einen Socket mit einer Ethernet-Schnittstelle (eth0, eth1) (Linux, C, Raspberry Pi).
Messen Sie die SIM-Signalstärke mit Raspberry Pi
Erstellen Sie einen Audio-Interface-Controller mit pyusb (2).
Erstellen Sie einen Audio-Interface-Controller mit pyusb (1).
Hallo Welt mit Raspberry Pi + Minecraft Pi Edition
Erstellen Sie eine Tensorflow-Umgebung mit Raspberry Pi [2020]
Verwenden Sie OpenJtalk, damit Raspberry Pi Japanisch spricht
Versuchen Sie, mit Raspberry Pi nach Wakasagi zu fischen
Normal programmieren mit Node-RED-Programmierung mit Raspberry Pi 3
Verbesserter menschlicher Sensor mit Raspberry Pi
Versuchen Sie die Objekterkennung mit Raspberry Pi 4 + Coral
Arbeiten mit Sensoren in Mathematica auf Raspberry Pi
Verwenden Sie einen PIR-Bewegungssensor mit Himbeer-Pi
Infer Custom Vision Modell mit Raspeye
Erstellen Sie eine Auto-Anzeige mit Himbeer-Pi
Protokollieren des Werts von Inkbird IBS-TH1 mit Raspberry Pi
Arbeiten mit GPS in Python für Raspberry Pi 3
Ich habe eine Fehlermeldung erhalten, als ich opencv mit Raspeye in Python3 eingefügt habe [Remedy]
Ich habe versucht, mit Raspberry Pi 4 eine Umgebung von Ubuntu 20.04 LTS + ROS2 zu erstellen
Versuchen Sie, ein Objekt mit RaspberryPi zu erkennen ~ Teil 1: Vergleich der Erkennungsgeschwindigkeit ~
Stellen Sie ein Überwachungsgerät mit einem Infrarotsensor her
Ich habe L-Chika mit Razpai 4 (Python Edition) ausprobiert.
Genießen Sie die elektronische Arbeit mit GPIO von Raspberry Pi
MQTT Radicon Car mit Arduino und Himbeere
Schalten Sie Ihren PC mit Himbeer-Pi ein / aus
CSV-Ausgabe von Impulsdaten mit Raspberry Pi (CSV-Ausgabe)
Beobachten Sie die Futago-Meteorgruppe mit Raspberry Pi4
Holen Sie sich CPU-Informationen von Raspberry Pi mit Python
Stellen Sie DHT11 mit Raspeye + Python zur Verfügung (Hinweis)
Cross-Compilierung für Raspberry Pi Zero unter Ubuntu gestartet