2017-01-08 2 views
5

Ich bin neu bei nodejs und was ich getan habe ist, dass ich LCD Panel und 4x4 Membran Matrix Tastatur an Raspberry Pi angeschlossen habe und ich habe sie mit Node.js programmiert. Was ich erreichen möchte, ist, wenn eine Taste gedrückt wird, sollte es sofort auf dem LCD-Display angezeigt werden und wenn ich # drücke, sollte es keine Eingabe mehr machen.Asynchrone Funktion erzeugt kein sofortiges Ergebnis innerhalb der Schleife

Dazu habe ich Pakete LCD https://www.npmjs.com/package/lcd und RPIO https://github.com/jperkin/node-rpio verwendet und da ich ständig für Benutzereingaben müssen prüfen, habe ich den Code setzen Eingabe für die Aufnahme in while-Schleife & im Inneren, dass ich die print-Anweisung geschrieben haben, und das ist, wo die Problem wird kommen. Das LCD-Feld zeigt kein Zeichen an, wenn ich eine Taste auf der Tastatur drücke, aber wenn ich # drücke, wird das Programm beendet und alle Zeichen werden auf dem LCD-Feld angezeigt.

Der Code, den ich geschrieben habe, ist wie folgt.

var rpio = require('rpio'); 
var Lcd = require('lcd'),//This is asynchronous function 
    lcd = new Lcd({ 
     rs: 18, 
     e: 23, 
     data: [24, 17, 27, 22], 
     cols: 8, 
     rows: 2 
    }); 
var matrix=[[1,2,3,'A'], 
      [4,5,6,'B'], 
      [7,8,9,'C'], 
      ['*',0,'#','D']] 
var row=[37,35,33,31]; 
var col=[29,23,40,38]; 
for (var i = 0; i < 4; i++) { 
    rpio.open(col[i], rpio.OUTPUT, rpio.HIGH); 
} 
for (var i = 0; i < 4; i++) { 
    rpio.open(row[i], rpio.INPUT, rpio.PULL_UP); 
} 
var code=""; 
var comeout=0; 
lcd.on('ready', function() { 
    lcd.setCursor(0, 0); 
    //start of keypad code 
    while(true){ 
     for (var j = 0; j < 4; j++) { 
      rpio.write(col[j],rpio.LOW); 
      for (var i = 0; i < 4; i++) { 
       if(rpio.read(row[i])==0){ 
        console.log(matrix[i][j]); 
        lcd.print(matrix[i][j]); 
        if(matrix[i][j]=='#'){ 
         comeout=1; 
         break; 
        } 
        while(rpio.read(row[i])==0); 
       } 
      } 
      if(comeout==1) 
       break; 
      else 
       rpio.write(col[j],rpio.HIGH); 
     } 
     if(comeout==1) 
      break; 
    } 
    //end of keypad code 
}); 

// If ctrl+c is hit, free resources and exit. 
process.on('SIGINT', function() { 
    lcd.clear(); 
    lcd.close(); 
    process.exit(); 
}); 

Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

+0

Ich würde vorschlagen, deinen Code in kleine Stücke zu brechen und auf das Problem zu konzentrieren. – niry

+0

Sie können 'while (true)' Schleifen in JS nicht verwenden. Aus diesem Grund haben Sie Ereignisse, um zum Beispiel über Tastendrucke bemerkt zu werden. Schau dir 'rpio.poll()' an. Da ich nicht ganz verstehe, wie Ihre beiden for-Schleifen funktionieren und die 'rpio.write()' und 'rpio.read()', die Sie dort verwenden, kann ich Ihren Code nicht umschreiben. – Thomas

+0

Ich vermute das col' und 'row' enthalten irgendeine Art von Bitmasken !? – Thomas

Antwort

0

Nach der Diskussion mit @Thomas oben, würde ich vorschlagen, Sie simulieren die while(true) Schleife mit setImediate Anrufe, in denen Sie die Matrix anfordern und die LCD.print durchführen. Dies liegt daran, dass LCD.print Operationen zur javascript-Ereigniswarteschlange hinzufügt. Die Operationen der Ereigniswarteschlange sind jedoch so lange blockiert, bis der eigentliche Vorgang abgeschlossen ist. Es würde nie abgeschlossen werden, solange Sie in der while(true) Schleife sind.

Sie müssen also die aktive Operation beenden und die Ereignisschleife steuern, die wiederum die Druckbefehle ausführt. Gleichzeitig müssen Sie jedoch sicherstellen, dass Sie die Tastenmatrix erneut scannen, solange Sie nicht die Taste "#" drücken. Hier

ein Beispiel:

lcd.on('ready', function() 
{ 
    lcd.setCursor(0, 0); 
    setImediate(
    function scanMatrix() 
    { 
    for (var j = 0; j < 4; j++) 
    { 
     rpio.write(col[j],rpio.LOW); 
     for (var i = 0; i < 4; i++) 
     { 
     if(rpio.read(row[i])==0) 
     { 
      console.log(matrix[i][j]); 
      lcd.print(matrix[i][j]); 
      if(matrix[i][j]!='#') 
      { 
      setImmediate(scanMatrix); 
      } 
      while(rpio.read(row[i])==0); 
     } 
     } 
     rpio.write(col[j],rpio.HIGH); 
    } 
    }); 
}); 

Der Code ist nicht getestet, weil ich keine Raspi hier haben. Es sollte Ihnen eine Idee geben, wie Sie das Problem lösen können.

Eine wirklich coole ;-) Lösung wäre, einen Mikrocontroller (MSP430, ...) zur Schlüsselmatrix hinzuzufügen. Der MC scannt die Matrix und überträgt Tastendrucke über SPI oder I2C an den Raspi. .... OK, ok, ok, schlag mich nicht ;-)

Verwandte Themen