2017-01-08 1 views
5

저는 nodejs에 익숙하지 않습니다. 그리고 LCD 패널과 4x4 멤브레인 매트릭스 키패드를 Raspberry Pi에 연결하고 Node.js를 사용하여 프로그래밍했습니다. 내가 원하는 것은 키를 누를 때마다 즉시 LCD 패널에 표시되어야하고 #을 누르면 입력을 중단해야한다는 것입니다. 이를 위해비동기 함수가 while 루프 내부에서 즉각적인 결과를 생성하지 않습니다.

나는 패키지 LCD https://www.npmjs.com/package/lcd 및 RPIO https://github.com/jperkin/node-rpio을 사용하고 난 계속 사용자 입력을 확인해야하기 때문에 나는 루프 & 그 안에 내가 인쇄 문을 작성 반면에 입력 촬영을 위해 코드를 삽입하고 그 곳이다 문제가오고있다. 키패드의 키를 누를 때 LCD 패널에 문자가 표시되지 않지만 #을 누르면 프로그램이 종료되고 모든 문자가 LCD 패널에 표시됩니다.

작성한 코드는 다음과 같습니다.

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(); 
}); 

모든 도움을 주시면 감사하겠습니다. 고맙습니다.

+0

나는 작은 조각으로 코드를 깨고 문제에 집중할 것을 제안한다. – niry

+0

JS에서는 while (true) 루프를 사용할 수 없습니다. 그렇기 때문에 exfple에 대한 키 누름에주의해야 할 이벤트가 있습니다. 'rpio.poll()'을 확인하십시오. 두 개의 for 반복문이 어떻게 작동하는지,'rpio.write()'와'rpio.read()'가 거기에서 활용되는 방식을 완전히 이해하지 못하기 때문에 코드를 다시 쓸 수 없다. – Thomas

+0

나는' col'과'row'는 어떤 종류의 비트 마스크를 포함합니다! – Thomas

답변

0

위의 @ 토마스와의 토론에 따르면 매트릭스를 요청하고 LCD.print를 수행하는 setImediate 호출로 while(true) 루프를 시뮬레이트하는 것이 좋습니다. 이는 LCD.print가 javascripts 이벤트 대기열에 작업을 추가하기 때문입니다. 그러나 실제 작업이 완료 될 때까지 이벤트 대기열의 작업은 차단됩니다. 루프가 while(true) 일 때만 완료됩니다.

따라서 활성화 된 작업을 끝내고 이벤트 루프 제어를 제공해야합니다. 이벤트 제어는 차례로 인쇄 명령을 실행합니다. 그러나 동시에 "#"키를 누르지 않는 한 키 매트릭스를 다시 스캔해야합니다. 여기에는 raspi이 없기 때문에

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); 
    } 
    }); 
}); 

코드가 테스트되지 않은 : 여기

은 예입니다. 그것은 당신에게 문제를 해결하는 방법에 대한 아이디어를 제공해야합니다.

정말 멋진 솔루션은 키 매트릭스에 마이크로 컨트롤러 (MSP430, ...)를 추가하는 것입니다. MC는 매트릭스를 스캔하고 keypresses를 SPI 또는 I2C를 통해 raspi로 전송합니다. .... OK, ok, 나를 때리지 마라 ;-)

관련 문제