Mit QR Code ein Event auslösen oder Befehl absetzen

Begonnen von TomLee, 08 November 2022, 11:28:57

Vorheriges Thema - Nächstes Thema

Otto123

nochmal nachgefragt: ist pres z.B. leer wenn kein qr code erkannt wurde? Oder gibt es ein anderes Ergebnis wenn in der Schleife kein qr Code erkannt wurde?

Wenn ja würde ich diesen Teil abfragen und dann erstmal verzögern. Nach einer Zeit wieder in den Teil der Schleife wo der erste qr Code gewinnt.
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Zitatnochmal nachgefragt: ist pres z.B. leer wenn kein qr code erkannt wurde? Oder gibt es ein anderes Ergebnis wenn in der Schleife kein qr Code erkannt wurde?

'nicht-erkannt' Ereignisse gibts nicht, pres ist solange der alte QR Code bis irgendein anderer erkannt wird.

ZitatWenn ja würde ich diesen Teil abfragen und dann erstmal verzögern. Nach einer Zeit wieder in den Teil der Schleife wo der erste qr Code gewinnt.

Brauch jetzt erstmal vermutlich was im Bauch, dann schau ich nochmal ob ich versteh wie das gemeint ist, nach dem if prev == pres: hab ich auf jedenfall auch schonmal probiert.

Otto123

aber wenn Du pres vor der Zeile pres = obj.data mit etwas anderem bestückst, wird es dann von obj.data nur überschrieben wenn qr erkannt oder immer mit dem letzten erkannten?
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

TomLee

Erst was essen, dann schau ich vlt. nochmal heute, wann nicht, morgen.

TomLee

Hab mir eben mal den Sketch angesehen:

https://www.makeuseof.com/scanning-qr-codes-with-esp32-cam/

Hier wird auch ständig/solange der Code ausgelesen wie man ihn vor die Kamera hält.

Payload: https://www.makeuseof.com/author/marcio-teixeira/

Found QRCode
Invalid: ECC failure

Found QRCode
Payload: https://www.makeuseof.com/author/marcio-teixeira/

Found QRCode
Invalid: ECC failure

Found QRCode
Payload: https://www.makeuseof.com/author/marcio-teixeira/

Found QRCode
Payload: https://www.makeuseof.com/author/marcio-teixeira/

Found QRCode
Invalid: ECC failure


Mir gefällt das aber, alles mit nur einem Sketch umzusetzen, statt zusätzlich noch ein Pythonscript zu bemühen zum auswerten.
Allerdings ist die Erkennung besser bei der Lösung mit OpenCV.
Hier muss man schon in bestimmtem Abstand zur Kamera den Code hinhalten.
Schau jetzt mal ob ich das mit pubsubclient hinbekomme die Daten dann direkt via MQTT zu übertragen. Wenn das klappt dann ist das halt für ein paar Sekunden so das es viel "Verkehr" gibt, soviel ist es ja auch nicht, etwas mehr wie einmal pro Sekunde und ich lös das mit event-min-interval.




TomLee

#50
Also der Ansatz es nur mit dem zuletzt verlinkten Sketch umzusetzen gefällt mir zwar, die Auswertung ist aber Sch...

Das hat was von der Self-Checkout-Kasse bei uns im Hornbach, da stellt man seit Monaten eine Mitarbeiterin an die Ausgangsschranke (die sich nur mit dem auf dem Kassenzettel befindlichen Barcode öffnet), weil nur sie genau weiß wie der Barcode auf den Scanner zu legen ist damit sich die Schranke sofort öffnet.

Ich bin wieder bei dem OpenCV-Python-Script, da klappt das auslesen im Abstand von ca. 10-50 cm einwandfrei, egal wie man das Handy hält oder der Code auf der falschen Seite liegt.

#!/usr/bin/python3

import cv2
import numpy as np
import pyzbar.pyzbar as pyzbar
import urllib.request
import time
import paho.mqtt.client as mqtt

# MQTT
broker = 'bli'
port = 1883
clientid = 'doorpen'
username = 'bla'
password = 'blub'


url = 'ble'


prev = ""
pres = ""
while True:
    img_resp = urllib.request.urlopen(url+'cam-hi.jpg')
    imgnp = np.array(bytearray(img_resp.read()), dtype=np.uint8)
    frame = cv2.imdecode(imgnp, -1)
    #_, frame = cap.read()

    decodedObjects = pyzbar.decode(frame)
    for obj in decodedObjects:
        pres = obj.data
        if prev == pres:
            pass
        else:
            print("Data: ", obj.data)
            # MQTT Connection
            client1 = mqtt.Client(clientid)
            client1.username_pw_set(username, password)
            client1.connect(broker, port)
            client1.loop_start()
            client1.publish("house/qrcode", obj.data)
            client1.disconnect()
            client1.loop_stop()


Ich lass das prev = pres am Ende einfach weg , die Schleife irgendwie zu verzögern ist glaub ich der falsche Ansatz, hab das noch nicht ganz geblickt aber vermute doch mal das die while Schleife while True:
    img_resp = urllib.request.urlopen(url+'cam-hi.jpg')
dafür verantwortlich ist wie oft die for Schleife durchgegangen wird. Was ist denn wahr was den URL-Aufruf verursacht ? Müsste man in dem Sketch vlt. die Zeiten anpassen wie oft ein Bild bereitgestellt wird ? Damit werd ich mich jetzt mal beschäftigen.

#include <WebServer.h>
#include <WiFi.h>
#include <esp32cam.h>

// Add here ssid and pwd
const char* WIFI_SSID = "<ssid>";
const char* WIFI_PASS = "<pwd>";

WebServer server(80);


static auto loRes = esp32cam::Resolution::find(320, 240);
static auto midRes = esp32cam::Resolution::find(350, 530);
static auto hiRes = esp32cam::Resolution::find(800, 600);
void serveJpg()
{
  auto frame = esp32cam::capture();
  if (frame == nullptr) {
    Serial.println("CAPTURE FAIL");
    server.send(503, "", "");
    return;
  }
  Serial.printf("CAPTURE OK %dx%d %db\n", frame->getWidth(), frame->getHeight(),
                static_cast<int>(frame->size()));

  server.setContentLength(frame->size());
  server.send(200, "image/jpeg");
  WiFiClient client = server.client();
  frame->writeTo(client);
}

void handleJpgLo()
{
  if (!esp32cam::Camera.changeResolution(loRes)) {
    Serial.println("SET-LO-RES FAIL");
  }
  serveJpg();
}

void handleJpgHi()
{
  if (!esp32cam::Camera.changeResolution(hiRes)) {
    Serial.println("SET-HI-RES FAIL");
  }
  serveJpg();
}

void handleJpgMid()
{
  if (!esp32cam::Camera.changeResolution(midRes)) {
    Serial.println("SET-MID-RES FAIL");
  }
  serveJpg();
}


void  setup(){
  Serial.begin(115200);
  Serial.println();
  {
    using namespace esp32cam;
    Config cfg;
    cfg.setPins(pins::AiThinker);
    cfg.setResolution(hiRes);
    cfg.setBufferCount(2);
    cfg.setJpeg(80);

    bool ok = Camera.begin(cfg);
    Serial.println(ok ? "CAMERA OK" : "CAMERA FAIL");
  }
  WiFi.persistent(false);
  WiFi.mode(WIFI_STA);
  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  Serial.print("http://");
  Serial.println(WiFi.localIP());
  Serial.println("  /cam-lo.jpg");
  Serial.println("  /cam-hi.jpg");
  Serial.println("  /cam-mid.jpg");

  server.on("/cam-lo.jpg", handleJpgLo);
  server.on("/cam-hi.jpg", handleJpgHi);
  server.on("/cam-mid.jpg", handleJpgMid);

  server.begin();
}

void loop()
{
  server.handleClient();
}


Ein weiteres Problem ist das das Pythonscript sich beendet wenn der Webserver nach einer Zeit nicht mehr erreichbar ist, ein paar Sekunden spannungsfreier ESP geht aber, da weiß ich nicht weiter, zu wenig bisher Erfahrung damit, da muss dann wohl eine weitere Schleife in dem Python-Script vorkommen die das verhindert ?



Wernieman

- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html