Présentation de M5StickC (Mesure de température / humidité et transmission MQTT, UIFlow Python)

image.png

Affichage à l'écran (température, humidité, pression, tension d'alimentation, intervalle de transmission MQTT) image.png Tous les programmes graphiques UIFlow (le code Python est automatiquement généré en temps réel)

introduction

J'ai mesuré la température, l'humidité et la pression avec "M5 Stick C" et "M5 Stick C ENV Hat (avec DHT12 / BMP280 / BMM150)" et j'ai essayé la transmission MQTT. L'environnement de développement est UIFlow V1.4.0-Beta. (UIFlow V1.3.2 ne semble pas prendre en charge ENV Hat.) Le code Python est généré en temps réel à partir du programme graphique et ça fait du bien.

M5StickC est petit et bon.

48(W)×24(D)×14(H)mm 18.1 g Vous pouvez créer une interface utilisateur avec trois commutateurs (l'un est le bouton d'alimentation), LED, écran couleur LCD, etc. Il dispose également d'une pile bouton intégrée pour une horloge en temps réel.

ENV Hat est affecté par la chaleur générée par l'unité principale M5StickC et la température augmente.

On a l'impression qu'il ne peut pas être utilisé tel quel. Il est nécessaire de concevoir des moyens de supprimer la génération de chaleur.

L'écran Blockly de l'IDE UIFlow est amusant à programmer graphiquement.

UIFlow V1.4.0-Beta a rencontré les problèmes suivants.

--Si vous entrez '%' dans la chaîne de caractères, ce sera '%' côté python.

Il semble possible de faire la mise en page de l'écran LCD et l'accès au matériel dans un environnement graphique, puis d'abandonner l'environnement graphique et de développer avec uniquement du code Python.

Matériel

Corps M5StickC

image.png Sur https://docs.m5stack.com/#/ja/core/m5stickc

Gestion de l'alimentation M5StickC

image.png

De https://lang-ship.com/reference/unofficial/M5StickC/Tips/AXP192/

Chapeau M5StickC ENV (avec DHT12 / BMP280 / BMM150)

image.png

Depuis https://www.switch-science.com/catalog/5755/

Spécifications du programme

Informations sur l'écran LCD

--Température, humidité, pression

Éclairage LED

Données de transmission MQTT (création de graphe et affichage des données côté PC)

image.png

Programme graphique (écran Blockly)

Initialisation (MQTT, écran, minuterie) et boucle principale (pulsation LED, boucle de lecture du capteur, calcul de la valeur médiane, affichage LCD)

image.png

Traitement des boutons A et B

--Bouton A (surface supérieure, marque M5) LCD marche / arrêt, appuyez et maintenez pour envoyer MQTT --Bouton B (côté) Sélection de la minuterie de transmission MQTT (1/3/30 minutes), appui long pour changer la couleur de fond (bleu / rouge)

image.png

Minuterie d'économiseur d'écran 1

image.png

Minuterie de transmission MQTT 2

image.png

Programme Python (programme généré automatiquement)

Le programme généré automatiquement à partir du programme graphique est illustré ci-dessous. Aucun ajout ou modification de code n'a été effectué depuis la génération automatique.

main.py


from m5stack import *
from m5ui import *
from uiflow import *
from m5mqtt import M5mqtt
import hat

setScreenColor(0x111111)

hat_env0 = hat.get(hat.ENV)

m5mqtt = M5mqtt('M5StickC', '192.168.11.2', 1883, '', '', 300)

label0 = M5TextBox(74, 5, "Text", lcd.FONT_DejaVu18,0xFFFFFF, rotate=90)
label1 = M5TextBox(50, 5, "Text", lcd.FONT_DejaVu18,0xFFFFFF, rotate=90)
label2 = M5TextBox(25, 5, "Text", lcd.FONT_DejaVu18,0xFFFFFF, rotate=90)
label4 = M5TextBox(50, 97, "Text", lcd.FONT_DejaVu18,0xFFFFFF, rotate=90)
label3 = M5TextBox(74, 97, "Text", lcd.FONT_DejaVu18,0xFFFFFF, rotate=90)

from numbers import Number

x = None
LcdOn = None
mqttIntervalMinIndex = None
blueOn = None
ID = None
LcdOffMin = None
mqttIntervalMin = None
mqttIntervalMinList = None
msg = None
tempList = None
humiList = None
presList = None
battList = None
temp = None
humi = None
pres = None
batt = None

def math_median(myList):
  localList = sorted([e for e in myList if isinstance(e, Number)])
  if not localList: return
  if len(localList) % 2 == 0:
    return (localList[len(localList) // 2 - 1] + localList[len(localList) // 2]) / 2.0
  else:
    return localList[(len(localList) - 1) // 2]

def setLcdTimer():
  global x, LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  LcdOffMin = 3
  timerSch.stop('timer1')
  timerSch.run('timer1', (LcdOffMin * (1000 * 60)), 0x00)

def setMqttTimer(x):
  global LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  timerSch.stop('timer2')
  if x:
    timerSch.run('timer2', (mqttIntervalMin * (1000 * 60)), 0x00)


def buttonA_wasReleased():
  global LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, x, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  LcdOn = not LcdOn
  if LcdOn:
    axp.setLDO2Vol(3)
  else:
    axp.setLDO2Vol(0)
  setLcdTimer()
  pass
btnA.wasReleased(buttonA_wasReleased)

def buttonA_pressFor():
  global LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, x, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  setMqttTimer(False)
  ttimer2()
  wait(3)
  setMqttTimer(True)
  setLcdTimer()
  pass
btnA.pressFor(0.8, buttonA_pressFor)

def buttonB_wasReleased():
  global LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, x, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  mqttIntervalMinIndex = 1 + mqttIntervalMinIndex
  if mqttIntervalMinIndex >= 4:
    mqttIntervalMinIndex = mqttIntervalMinIndex - 3
  mqttIntervalMin = mqttIntervalMinList[int(mqttIntervalMinIndex - 1)]
  label4.setText(str((str(mqttIntervalMin) + 'min')))
  setMqttTimer(True)
  setLcdTimer()
  pass
btnB.wasReleased(buttonB_wasReleased)

def buttonB_pressFor():
  global LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, x, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  blueOn = not blueOn
  if blueOn:
    setScreenColor(0x3366ff)
  else:
    setScreenColor(0xff0000)
  axp.setLDO2Vol(3)
  label0.setText('')
  label1.setText('')
  label2.setText('')
  label3.setText('')
  label4.setText('')
  setLcdTimer()
  pass
btnB.pressFor(0.8, buttonB_pressFor)

@timerSch.event('timer1')
def ttimer1():
  global LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, x, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  axp.setLDO2Vol(0)
  LcdOn = False
  pass

@timerSch.event('timer2')
def ttimer2():
  global LcdOn, mqttIntervalMinIndex, blueOn, ID, LcdOffMin, mqttIntervalMin, x, mqttIntervalMinList, msg, tempList, humiList, presList, battList, temp, humi, pres, batt
  M5Led.on()
  msg = temp  + ' ,' + humi + ',' + pres + ',' + batt
  m5mqtt.publish(str('M5StickC'),str(((ID + ((',' + msg))))))
  wait(0.001)
  M5Led.off()
  pass


ID = 'I5001'
m5mqtt.start()
LcdOn = True
axp.setLDO2Vol(3)
blueOn = True
setScreenColor(0x3366ff)
setLcdTimer()
mqttIntervalMinIndex = 3
mqttIntervalMinList = [1, 3, 30]
mqttIntervalMin = mqttIntervalMinList[int(mqttIntervalMinIndex - 1)]
setMqttTimer(True)
while True:
  M5Led.on()
  wait(0.0007)
  M5Led.off()
  tempList = []
  humiList = []
  presList = []
  battList = []
  for count in range(5):
    tempList.append(int(((hat_env0.temperature) * 100)))
    humiList.append(int(((hat_env0.humidity) * 100)))
    presList.append(int(((hat_env0.pressure) * 100)))
    battList.append(int(((axp.getBatVolt()) * 100)))
    wait(0.2)
  temp = (("%.2f"%((math_median(tempList) / 100))) + 'C')
  humi = (("%.2f"%((math_median(humiList) / 100))) + 'pct')
  pres = (("%.2f"%((math_median(presList) / 100))) + 'hPa')
  batt = (("%.2f"%((math_median(battList) / 100))) + 'V')
  label0.setText(str(temp))
  label1.setText(str(humi))
  label2.setText(str(pres))
  label3.setText(str(batt))
  label4.setText(str((str(mqttIntervalMin) + 'min')))
  wait_ms(2)

Informations connexes

M5StickC Quick Start-UIFlow https://docs.m5stack.com/#/ja/quick_start/m5stickc/m5stickc_quick_start_with_uiflow

M5StickC (M5Stack Docs) https://docs.m5stack.com/#/ja/core/m5stickc https://docs.m5stack.com/#/en/uiflow/hardware

m5stack/M5StickC https://github.com/m5stack/M5StickC

Essayez d'utiliser le laboratoire de toiture M5Stack http://itoi.jp/M5Stack.html

Enquête sur la référence japonaise non officielle M5StickC AXP192 https://lang-ship.com/reference/unofficial/M5StickC/Tips/AXP192/

J'ai examiné la fonction supplémentaire AXP192 de M5StickC 0.0.7 https://lang-ship.com/blog/?p=696#_LightSleep

M5Stick C J'ai essayé de démonter pour le moment https://twitter.com/Ghz2000/status/1125058416014176263

BeetleC est arrivé http://gijin77.blog.jp/archives/20843205.html

Déplacez le modèle 3D de M5Stack sur votre ordinateur en fonction du mouvement de M5Stack http://pages.switch-science.com/letsiot/rotateM5Stack/

[Ceci] Je suis allé au siège de M5Stack, qui attire l'attention des créateurs du monde![Je ne peux pas gagner] https://wirelesswire.jp/2019/08/71960/

Adafruit M5Stick-C Pico Mini IoT Development Board https://www.adafruit.com/product/4290

Recommended Posts

Présentation de M5StickC (Mesure de température / humidité et transmission MQTT, UIFlow Python)
Introduction facile de la série python3 et d'OpenCV3
Introduction de Python
[Introduction to Data Scientists] Bases de Python ♬ Fonctions et classes
Mesure FPS simple de python
Installation source et installation de Python
Introduction et astuces de mlflow.
[Introduction à Python] J'ai comparé les conventions de nommage de C # et Python.
[Introduction à Udemy Python3 + Application] 69. Importation du chemin absolu et du chemin relatif
[Introduction à l'application Udemy Python3 +] 12. Indexation et découpage des chaînes de caractères
[Introduction to Data Scientists] Bases de Python ♬ Branchements conditionnels et boucles
[Introduction aux Data Scientists] Bases de Python ♬ Fonctions et fonctions anonymes, etc.
L'histoire de Python et l'histoire de NaN
Installer SciPy et matplotlib (Python)
[Introduction à Python3 Jour 1] Programmation et Python
Introduction et mise en œuvre de la fonction d'activation
Introduction à Hadoop et MapReduce avec Python
Ceci et cela des propriétés python
Introduction du package de dessin python pygal
Coexistence de Python2 et 3 avec CircleCI (1.0)
Enregistrement de l'introduction de Python pour les nouveaux arrivants
Résumé des index et des tranches Python
Réputation des livres Python et des livres de référence
Production d'un système de contrôle de température avec tarte aux framboises et ESP32 (2) Production d'un appareil de transmission