Enviro+ ãš Firebaseð¥ã§ããŒã ã»ãã¥ãªãã£ã®ãããã¿ã€ãéçº
ç®æ¬¡
Enviro+
Enviro+ã¯ããŸããŸãªã¿ã€ãã®ã»ã³ãµãŒãå
èµããRaspberry Piçšã®æ°ããæ¡åŒµããŒãã§ããåšèŸºç°å¢ã®ããããç°å¢ããŒã¿ãåéããããã«äœ¿çšã§ããŸãã
詳现ã¯ãã¡ããhttps://shop.pimoroni.com/products/enviro-plus
ããããäœããã®
仿¥ã¯å ãšè¿æ¥ãæ€ç¥ããããšã§ãå®¶ãå®ãè¶ ãã€ãã¯ãªãœãªã¥ãŒã·ã§ã³ãäœã£ãŠã¿ãŸãããã®ã¢ã€ãã¢ã¯ç§ã®å®¶ãžã®å ¥ãå£ãæŒéã§ãéåžžã«æããšããç¹ããæ¥ãŠããŸããã€ãŸããå ã®å€åã¯ãã¢ãéãããããšã瀺ããã®ã§ãããè·é¢ã»ã³ãµãŒã®å€åã¯èª°ãããŸãã¯äœãïŒð»ïŒãã»ã³ãµãŒã«è¿ã¥ãããéãéããããšæå³ããããã§ãã
ããŒã¿ã¯Firebase DBã«éããReactã®ããã³ããšã³ãããç£èŠããŸãã
宿ãããµã³ãã«ã¯ããã«ãããŸãã
https://tender-lamarr-33eddc.netlify.com
泚æïŒãã®ã¢ã€ãã¢ã¯æãããã€éåžžã«åæ©çãªè§£æ±ºçã§ããå®éã®ããŒã ã»ãã¥ãªãã£ã§ã®äœ¿çšã¯ããªãã§ãã ããã
ããäžã€æ³šæïŒãã®ãããžã§ã¯ãã¯Raspbian liteãã€ã³ã¹ããŒã«ãããã€ã³ã¿ãŒãããã«æ¥ç¶ã§ããRaspberry Piãæ¢ã«ã»ããã¢ãããããŠããããšãåæãšããŠããŸãã
ã¹ã¿ãŒãã¢ããã¬ã€ã
ãŸãRaspberry Piã«ãã°ã€ã³ããPimoroniãæäŸããã€ã³ã¹ããŒã«ã¹ã¯ãªãããå®è¡ããŸãã
ããã¯ãäŸåé¢ä¿ãã€ã³ã¹ããŒã«ããããã«æãç°¡åã§æšå¥šã§ããæ¹æ³ã§ãããæ¬¡ã®readmeã§ã¯ä»ã«ãããŸããŸãªæ¹æ³ã説æãããŠããŸããhttps://github.com/pimoroni/enviroplus-python
curl -sSL https://get.pimoroni.com/enviroplus | bash
ã€ã³ã¹ããŒã«ãçµããããããã«ããã€ãã®äŸåé¢ä¿ãæåã§è¿œå ããå¿ èŠããããŸãã
sudo apt install python-pip pip install configparser pip3 install RPi.GPIO pip3 install spidev
ã³ãŒãã®å®è¡
ããã§ãã¹ãŠã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããã®ã§ãä»åºŠã¯ã³ãŒããæžããŠè¡ããŸãã
ã¹ã¿ãŒã¿ãŒã»ãããžã§ã¯ãïŒhttps://github.com/makeupsomething/entrance-monitorïŒãããŠã³ããŒãããfeature/step-1
ã®ãã©ã³ãããã§ãã¯ã¢ãŠãããŠããµã³ãã«ãå®è¡ããŸãã
git clone https://github.com/makeupsomething/entrance-monitor.git cd entrance-monitor git checkout feature/step-1 python3 entrance-monitor/index.py
ã¢ããªã±ãŒã·ã§ã³ãèµ·åããLCDç»é¢ã«ã©ã€ããšè¿æ¥ã®å€ã衚瀺ãããŸããã©ã€ãã»ã³ãµãŒãèŠã£ãŠãå€ãå€åããããšã確èªããŠãã ããã
次ã«ã³ãŒãã®äžéšãèŠãŠã¿ãŸãããã
ãã£ã³ãã¹ãšãã©ã³ãã®ã»ããã¢ãã
#/New canvas to draw on./ img = Image.new('RGB', (WIDTH, HEIGHT), color=(0, 0, 0)) draw = ImageDraw.Draw(img) path = os.path.dirname(os.path.realpath(__file__)) #/Set up canvas and font/ font_size = 15 font = ImageFont.truetype("entrance-monitor/fonts/Asap/Asap-Bold.ttf", font_size) text_colour = (255, 255, 255) back_colour = (170, 0, 170) message = ""
ããã§ã¯ãPillowã©ã€ãã©ãªã䜿çšããŠæ°ããã€ã¡ãŒãžãäœæããæ¬¡ã«ãã©ã³ããšããã¹ãã®ããã©ã«ããèšå®ããŠãããŸããããã¹ããèæ¯è²ãèªåãªãã«ç·šéããŠã¿ãŠãã ããã
try: while True: lux = ltr559.get_lux() prox = ltr559.get_proximity() message = """Light: {:05.02f} Lux Proximity: {:05.02f} """.format(lux, prox) #/Calculate text position/ size_x, size_y = draw.textsize(message, font) x = (WIDTH - size_x) / 2 y = (HEIGHT / 2) - (size_y / 2) draw.rectangle((0, 0, 255, 80), back_colour) draw.text((x, y), message, font=font, fill=text_colour) disp.display(img) time.sleep(1.0) except KeyboardInterrupt: pass
ããããã®ã³ãŒãã®ã¡ã€ã³ãšãªããŸãã
ltr559ã©ã€ãã©ãªã䜿çšããŠå ã»ã³ãµãŒããèŒåºŠãè¿æ¥ã»ã³ãµããè¿æ¥å€ãååŸããŠããŸãã
次ã«ãããããæååã«ãã©ãŒãããããå ã«èšå®ãã空ã¡ãã»ãŒãžã«å²ãåœãŠãŸããæååã®é·ãã«åºã¥ããŠãµã€ãºãèšç®ããç»é¢ã®äžå€®ã«é 眮ããŸãã
æåŸã«ãé·æ¹åœ¢ãæç»ããPillowã©ã€ãã©ãªã䜿çšããŠããã¹ãã远å ã宿ããã€ã¡ãŒãžã衚瀺ãããŸãããã®åŸ0.5ç§ã¹ãªãŒããããŠããã«ãŒããããŠããŸãã
Firebase
Firebaseãšã¯Googleãææããã¢ãã€ã«ãšãŠã§ãã¢ããªã±ãŒã·ã§ã³éçºãã©ãããã©ãŒã ã§ãã
https://firebase.google.com/?hl=ja
Firebaseã®ãããžã§ã¯ããäœã
Firebaseã¢ã«ãŠã³ããæã£ãŠããªãå Žåã¯ãäœæããå¿
èŠããããŸããã¢ã«ãŠã³ãã®äœæã¯ç¡æã§ã䜿çšããããã«æ¯æãæ
å ±ãå
¥åããå¿
èŠã¯ãããŸããã
ãã°ã€ã³ãããã [ãããžã§ã¯ãã®è¿œå ] ãã¿ã³ãã¯ãªãã¯ããŸãã
ãããžã§ã¯ãã«ååãä»ãã [ç¶è¡] ãã¯ãªãã¯ããŸããGoogle analyticsããããžã§ã¯ãã«è¿œå ããã«ã¯ ãä»ã¯ããªãã ãéžæããæåŸã« ããããžã§ã¯ããäœæã ãã¯ãªãã¯ããŸãã
ãµãŒãã®ããããžã§ãã³ã°ã«ã¯æ°åãããå ŽåããããŸãã
ããŒã¿ããŒã¹ãšã«ãŒã«ã®ã»ããã¢ãã
Firebaseã«ã¯2ã€ã®ããŒã¿ããŒã¹ãœãªã¥ãŒã·ã§ã³ããããŸãã
ãã®ããŒã¿ããŒã¹ã䜿çšããéã«ã¯ã»ãšãã©Cloud Firestoreãæšå¥šãããŠããŸãããä»å䜿çšããPythonã©ã€ãã©ãªã¯ãµããŒããããŠããªããããRealtime Databaseã䜿çšããŸããä»åã®äœ¿ãæ¹ã¯éåžžã«åçŽãªã®ã§éãã¯ãããŸããã
Firebaseã³ã³ãœãŒã«ã®ãµã€ãããŒã«è¡ãã ãéçº>databaseã ãã¯ãªãã¯ããŸãã
æåã«ãCloud Firestoreãæå¹ã«ãããã©ãããã®ãªãã·ã§ã³ã衚瀺ãããŸãã
ãããä»åã®ãããžã§ã¯ãã§ã¯äœ¿çšããŸããã®ã§ãããŒãžãå°ãäžã«ã¹ã¯ããŒã«ããŠãRealtime Datebaseã®ãããŒã¿ããŒã¹ãäœæããã¯ãªãã¯ããŸãã
ããŒã¿ããŒã¹ã®ã«ãŒã«ãèšå®ãããããã¢ããã衚瀺ãããã®ã§ã ããã¹ãã¢ãŒãã§éå§ããéžæãããæå¹ã«ããã ãã¯ãªãã¯ããŸããããã¯ãç§ãã¡ã®ããŒã¿ããŒã¹ãèªèšŒãæããªãããšãæå³ããŸãããã®èšå®ãå®éã®ã¢ããªã ãšãããåé¡ããããŸãããä»åã¯ãã¹ãç®çã§ã®äœ¿çšããããä»ã®ãšããæ°ã«çããå¿ èŠã¯ãããŸããã
泚æïŒç¹°ãè¿ãã«ãªããŸãããããŒã¿ããŒã¹ããã¹ãã¢ãŒãã«ããŠããã®ã¯å±éºã§ããæ¬çªã¢ããªã±ãŒã·ã§ã³ã§ã¯çµ¶å¯Ÿã«ããªãã§ãã ããã
次ã«ããããžã§ã¯ãAPIããŒãšãããžã§ã¯ãIDãååŸããå¿
èŠããããŸãã
ãµã€ãããŒã®æ¯è»ã¢ã€ã³ã³ãã¯ãªãã¯ãããProject settingsããéžæãããšãããã«ãããžã§ã¯ãIDãšapiããŒã衚瀺ãããŸããããã«å¿
èŠã«ãªãã®ã§ã¡ã¢ããŠãããŠãã ããã
pyrebaseã®ã€ã³ã¹ããŒã«ãšfirebaseãžã®æ¥ç¶
ãããžã§ã¯ããFirebaseã«Raspberry Piäžã§çµ±åããããšãã§ããããã«ãªããŸããã
ããããç§ãã¡ã¯pyrebase4ã䜿ããŸããããã¯ãªãªãžãã«ã®pyrebaseã©ã€ãã©ãªãããã©ãŒã¯ãããã®ã§ãpythonããã®firebaseãšäºãã«é£æºããŸãã
pyrebase4ãã€ã³ã¹ããŒã«ããŸãã
pip3 install pyrebase4
次ã«ããããžã§ã¯ããã©ã«ãå
ã§feature/step-2
ããã§ãã¯ã¢ãŠãããŸãã
git checkout feature/step-2
ä»ãããå®è¡ããããšãããšããšã©ãŒã衚瀺ãããŸããããã¯ãFirebaseãããžã§ã¯ãã«æ¥ç¶ããããã«ããŒã¿ã远å ããå¿
èŠãããããã§ãããã®ãããžã§ã¯ãã¯ç°å¢å€æ°ïŒAPI_KEYããã³PROJECT_IDïŒãæ€çŽ¢ãããããããããèšå®ããŸãã
ãããå
ã«ã¡ã¢ããŠãããFirebase APIããŒãšãããžã§ã¯ãIDã§ãã
export API_KEY="apiKey" export PROJECT_ID="projectId"
ã§ã¯ååãšåæ§ã«ã³ãŒããèµ°ãããŠã¿ãŸãããã
python3 entrance-monitor/index.py
ããã€ã¹ãŸãã¯ç«¯æ«ã®åºåã«ã¯éãã¯ãããŸããããFirebaseã³ã³ãœãŒã«ã§ããŒã¿ããŒã¹ã確èªãããšãããŒã¿ãæŽæ°ãããŠããã¯ãã§ããå
ã»ã³ãµãæã§èŠã£ãŠã¿ãŠããŒã¿ãæŽæ°ãããã確èªããŠã¿ãŠãã ããã
ã³ãŒããèŠãŠã¿ãŸãããã
Firebaseã®èšå®
Firebaseã®ã€ã³ã¹ã¿ã³ã¹ã次ã®ããã«èšå®ããŠæ¥ç¶ããŠããŸãã
config = { "apiKey": os.getenv('API_KEY'), "authDomain": os.getenv('PROJECT_NAME')+".firebaseapp.com", "databaseURL": "https://"+os.getenv('PROJECT_NAME')+".firebaseio.com", "storageBucket": os.getenv('PROJECT_NAME')+"appspot.com", } firebase = pyrebase.initialize_app(config) db = firebase.database()
ããŒã¿ããŒã¹ã«ããŒã¿ãéä¿¡ãã
次ã«ç§ãã¡ã®ããŒã¿ããŒã¹ã«ããŒã¿ãéä¿¡ã§ããããã«ããç°¡åãªã«ãŒãã远å ããŸãã
data = {"light": lux, "proximity": prox, "createdAt": str(datetime.datetime.now())} db.child("data").push(data)
Firebase realtime databaseã¯JSONãã©ãŒãããã§ããŒã¿ãåãåãã®ã§ãèŒåºŠãšè¿æ¥å€ããããŠtimestampãå«ããªããžã§ã¯ããäœæããŸããæ¬¡ã«ããããdataãšãããã£ã€ã«ãã³ã¬ã¯ã·ã§ã³ã«ããã·ã¥ããŸãã
ããããããã§ã¯æ¯ç§ããŒã¿ãéä¿¡ããããšã«ãªããç§ãã¡ã®ããŒã¿ã¯Firebaseäžã§å¶åŸ¡äžèœãšãªããç¡æãã©ã³ã§ããïŒæ¥ã®æžã蟌ã¿å¶éããããè¶
ããŠããŸããŸããç§ãã¡ãæ¬åœã«ãããã®ã¯èŒåºŠãè¿æ¥å€ãåçã«å€åããã®ãæ€åºãããšãã ãã§ãããã以å€ã«ã¯é©åœãªééãäŸãã°60ç§ããšã«ã¹ããŒã¿ã¹æŽæ°ãéä¿¡ã§ããã°å
åã§ãã
ãŸãèŒåºŠãšè¿æ¥å€ãè¿œè·¡ãæ¬¡ã®å€ã倧å¹
ã«ç°ãªããã©ãããæ€åºããå¿
èŠããããŸãããŸããããŒã¿ããŒã¹ã«æåŸã«ããŒã¿ãéä¿¡ããŠããã®çµéæéã远跡ããããã«count
ã远å ããŸãã60ç§ãè¶
ããå Žåã¯ãçŸåšã®å€ãéä¿¡ããŸãã
whileã«ãŒãã®å€ã§å®£èšããŸãã
prev_lux = 0 prev_prox = 0 count = 0
次ã«whileã«ãŒãå ã§ãèŒåºŠãšè¿æ¥å€ã®çŸåšã®å€ãåã®å€ãã倧ãããã©ããããã§ãã¯ããå¿ èŠããããŸããããå€ã倧ããã£ãå Žåã¯ããã«ããŒã¿ããŒã¹ãæŽæ°ããŸããããèŒåºŠãšè¿æ¥å€ã®çŸåšã®å€ãåã®å€ããå°ããã£ãå Žåã«ã¯ãæ°ããåã®å€ãèšå®ãã«ãŠã³ãå€ãå¢ãããŸãã
if(abs(prev_lux - lux) > 20 or abs(prev_prox - prev_prox) > 20 or count >= 60): data = {âlightâ: lux, âproximityâ: prox, âcreatedAtâ: str(datetime.datetime.now())} db.child(âdataâ).push(data) count = 0 prev_lux = lux prev_prox = prox count = count + 1
ã€ãã«ããŒã¿ãå¯èŠåããæãããŸããã
Reactã®ããã³ããšã³ã
React
Reactã¯ãŠãŒã¶ã€ã³ã¿ãã§ãŒã¹ãæ§ç¯ããããã®JavaScriptã©ã€ãã©ãªã§ãFacebookãšåã ã®éçºè ãšäŒæ¥ã®ã³ãã¥ããã£ã«ãã£ãŠç¶æãããŠããŸãã
ãããžã§ã¯ãã®éå§
ãªããžããªããã©ãŒã¯ããŠããŠã³ããŒãããŸãã
ããã³ããšã³ããã©ã®ããã«æ©èœãããã«ã€ããŠã¯ããã®èšäºã§ã¯è©³ãã説æããŸãããç°¡åã«æžããšãããã€ã¹ããFirebaseããã³ããšã³ããŸã§ã®ããŒã¿ã(ã»ãšãã©)ãªã¢ã«ã¿ã€ã ã«ååŸã§ãããã®ã§ãã
ãããžã§ã¯ããå®è¡ããã«ã¯ãFirebase APIããŒãšãããžã§ã¯ãIDããããžã§ã¯ãã«è¿œå ããå¿
èŠããããŸãããããã¯ãpythonãããžã§ã¯ãã§äœ¿çšããã®ãšåãAPIããŒãšãããžã§ã¯ãIDã§ãã
.envãšãããã¡ã€ã«ãäœæããæ¬¡ã®è¡ã远å ããŸãã
REACT_APP_API_KEY=apiKey REACT_APP_PROJECT_ID=projectId
ã§ã¯äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããæ¬¡ã®ããã«ãããžã§ã¯ããå®è¡ããŸãããã
npm install npm run start
Raspberry Piäžã®ã¢ããªã±ãŒã·ã§ã³ããŸã å®è¡äžã§ããããšã確èªããããã¢ããªã±ãŒã·ã§ã³ãåèµ·åããhttps://localhost:3000ã«ã¢ã¯ã»ã¹ããŠã©ã€ãåºåã確èªããŸãã
0ä»¶ã®ã³ã¡ã³ã