2016-03-24 15 views
0

Ich versuche ein ESP8266 SoC zu verwenden, um einen Wasserflusssensor zu lesen, der eine Rechteckwelle als Ausgabe erzeugen soll. Ich dachte, es wäre eine einfache Sache, einen GPIO-Port im Interrupt-Modus zu verwenden, um steigende Kantenübergänge zu zählen - und tatsächlich schien das anfänglich zu funktionieren. Dann habe ich die Firmware von 0.96 auf 1.5 hochgerüstet und es hat seitdem aufgehört zu arbeiten, ich sehe keine Übergänge, wenn das Rad nicht mehr dreht.Probleme beim Interpretieren einer Rechteckwelle

Wenn ich jedoch eine Leitung zum Pin [für den GPIO, den ich benutze] führe und ihn kurzzeitig an VCC berühre, wird die Interrupt-Routine wie erwartet aufgerufen, daher weiß ich, dass der Sensor mit dem rechten Pin verdrahtet ist. und die Interruptroutine wird korrekt registriert. Mein Code:

function intCb(level) 
    SpinCount = SpinCount + 1 
    local levelString = "up" 
    if level == gpio.HIGH then 
     levelString = "down" 
    end 
    gpio.trig(pin, levelString, intCb) 
end 
gpio.write(pin, 0) 
gpio.trig(pin, "up", intCb) 
gpio.mode(pin, gpio.INT, gpio.FLOAT) 

Also was vermisse ich? Benötige ich mehr Unterstützung, um eine Rechteckwelle als Eingabe zu lesen? Wenn ja, wie hat es anfangs funktioniert?

Antwort

1

Ich löste dies einen 555 Timer Chip als Schmitt-Trigger mit:

schematics

+0

Froh, dass Sie das behoben haben. –

2

Für alles, was Hardware betrifft, ist es wirklich schwer, hier auf SO eine definitive Antwort zu geben. In den meisten Fällen stützt man sich auf Hinweise (und manchmal auf Ahnungen). Einige Ideen:

  • gpio.FLOAT wahrscheinlich sollte gpio.PULLUP statt (es sei denn Sie einen externen Pull-up-Widerstand haben).
  • Ihr Setup scheint nicht grundlegend anders als z. Verwenden Sie einen Druckknopf oder einen Schalter, um ein Ereignis auszulösen. Daher möchten Sie wahrscheinlich eine Art Entprell- oder Drosselfunktion verwenden.
  • Da scheinen Sie sowohl in steigenden und fallenden Flanken interessiert zu sein (wie Sie zwischen up und down wechseln) können Sie genauso gut hören für both, nicht wahr?

Also, vorausgesetzt, zog ich die richtigen Schlüsse etwas wie das folgende generic skeleton kann sich als nützlich erweisen:

-- inspired by https://github.com/hackhitchin/esp8266-co-uk/blob/master/tutorials/introduction-to-gpio-api.md 
-- and http://www.esp8266.com/viewtopic.php?f=24&t=4833&start=5#p29127 
local pin = 4 --> GPIO2 

function debounce (func) 
    local last = 0 
    local delay = 5000 

    return function (...) 
     local now = tmr.now() 
     local delta = now - last 
     -- if delta < 0 then delta = delta + 2147483647 end; proposed because of delta rolling over 
     if delta < delay then return end; 

     last = now 
     return func(...) 
    end 
end 

function onChange() 
    print('The pin value has changed to '..gpio.read(pin)) 
end 

gpio.mode(pin, gpio.INT, gpio.PULLUP) -- see https://github.com/hackhitchin/esp8266-co-uk/pull/1 
gpio.trig(pin, 'both', debounce(onChange)) 
+0

Danke für die Antwort (wenn ich das sagen darf) das ist interessant, aber ich sehe das gegenteilige Problem: keine Ereignisse überhaupt. Ich habe versucht, Pull-up-Modus, keine Änderung. Dinge, die ich lese, sagen, ich brauche einen "Timer" -Chip. Ich habe LM555 vorher benutzt, aber nur als astable Ausgänge. Die Sache, die mich am meisten verwirrt, ist, dass der Sensor manchmal mit nur dem GPIO arbeitete. Ich habe den Sensor von electrodragon bekommen, sehr wenig Docs kam damit. Ich muss das funktionieren, aber mir sind die Ideen ausgegangen. –

+0

Sie sagten, der Sensor (und Ihr Code) funktionierte gut mit NodeMCU 0.96. Hast du versucht, zum Teufel zurückzugehen? –

+0

Ich tat, aber es gibt etwas über das Brennen der neuen Version, die es schwierig macht, zu dem alten zurückzukehren, ich habe neue auf dem Weg. (übrigens, "beide" scheint überhaupt nicht zu funktionieren.) –