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 ?