Hello,
I have a question about using the USB Host Library 2.0 Bellow is the code. What i’m trying to do is when i scan a barcode to light a led, then wait until a switch is pressed to make it go off. The problem is when i scan the code, the scanner beeps 3 times and the red light comes up with error, like the buffer is not empty or something like that. I don’t know how to make the program to wait until the switch is pressed without the scanner entering in error mode.
Anyone can help? Thanks for your time.
/*
Portable barcode scanner. Uses USB HID barcode scanner, Arduino Board, USB Host Shield and HD44780-compatible LCD display
The circuit:
* LCD RS pin to digital pin 7
* LCD Enable pin to digital pin 6
* LCD D4 pin to digital pin 5
* LCD D5 pin to digital pin 4
* LCD D6 pin to digital pin 3
* LCD D7 pin to digital pin 2
* LCD R/W pin to ground
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/
#include <string.h>
#include <SPP.h>
#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
#include <SPI.h>
//#include <avrpins.h>
//#include <max3421e.h>
//#include <usbhost.h>
//#include <usb_ch9.h>
#include <Usb.h>
#include <usbhub.h>
#include <avr/pgmspace.h>
//#include <address.h>
#include <hidboot.h>
#include <hid.h>
#include <hiduniversal.h>
//#include <printhex.h>
//#include <message.h>
//#include <hexdump.h>
//#include <parsetools.h>
#define DISPLAY_WIDTH 16
const int button1 = 32;
const int button2 = 48;
const int ledPin1 = 8;
const int ledPin2 = 44;
String myString;
int val;
// initialize the LCD library with the numbers of the interface pins
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
USB Usb;
USBHub Hub(&Usb);
HIDUniversal Hid(&Usb);
HIDBoot<HID_PROTOCOL_KEYBOARD> Keyboard(&Usb);
class KbdRptParser : public KeyboardReportParser
{
void PrintKey(uint8_t mod, uint8_t key);
protected:
virtual void OnKeyDown (uint8_t mod, uint8_t key);
virtual void OnKeyPressed(uint8_t key);
};
void KbdRptParser::OnKeyDown(uint8_t mod, uint8_t key)
{
uint8_t c = OemToAscii(mod, key);
if (c)
OnKeyPressed(c);
}
/* what to do when symbol arrives */
void KbdRptParser::OnKeyPressed(uint8_t key)
{
static uint32_t next_time = 0; //watchdog
static uint8_t current_cursor = 0; //tracks current cursor position
if( millis() > next_time ) {
lcd.clear();
current_cursor = 0;
delay( 5 ); //LCD-specific
lcd.setCursor( 0,0 );
}//if( millis() > next_time ...
next_time = millis() + 200; //reset watchdog
if( current_cursor++ == ( DISPLAY_WIDTH + 1 )) { //switch to second line if cursor outside the screen
lcd.setCursor( 0,1 );
}
val += key;
myString += char(key);
//Serial.print(char(key));
//Serial.println(key);
if (key==19){
Serial.println(myString);
Serial.println(val);
switch (val) {
case 274:
digitalWrite(ledPin1,HIGH);
myString="";
val=0;
do {}
while (digitalRead(button1)==HIGH);
digitalWrite(ledPin1,LOW);
break;
case 530:
digitalWrite(ledPin2,HIGH);
myString="";
val=0;
do {}
while (digitalRead(button2)==HIGH);
digitalWrite(ledPin2,LOW);
break;
default:
myString="";
val=0;
break;
}
}
lcd.print( char(key) );
};
KbdRptParser Prs;
void setup()
{
Serial.begin( 115200 );
Serial.println("Start");
if (Usb.Init() == -1) {
Serial.println("OSC did not start.");
}
delay( 200 );
Hid.SetReportParser(0, (HIDReportParser*)&Prs);
// set up the LCD's number of columns and rows:
lcd.begin(DISPLAY_WIDTH, 2);
lcd.clear();
lcd.noAutoscroll();
lcd.print("Ready");
delay( 200 );
pinMode(ledPin1,OUTPUT);
pinMode(ledPin2,OUTPUT);
pinMode(button1,INPUT_PULLUP);
pinMode(button2,INPUT_PULLUP);
}
void loop()
{
Usb.Task();
}