Skip to main content

Promjena postavki skenera iz Serial Monitora

Što prikazuje ovaj primjer​

Izbornik u Serial Monitoru upravlja skenerom dok radi: pokretanje i zaustavljanje skeniranja, uključivanje i isključivanje bijelog osvjetljenja i crvenog svjetla za ciljanje, odabir koliki se dio kadra kamere pretražuje u potrazi za kodom, odabir ručnog, kontinuiranog ili očitavanja uz detekciju pokreta te uključivanje i isključivanje skupina 1D i 2D simbologija. Kodovi koje skenirate dok izbornik čeka i dalje se ispisuju.

Primjer koristi pin 4 kao RX kontrolera (spojite ga na TX skenera) i pin 5 kao njegov TX (spojite ga na RX skenera); promijenite ta dva broja prema svom spoju. Koristite kontroler od 3,3 V i prvo prebacite skener na UART skeniranjem konfiguracijskog barkoda POR232.

Ovaj primjer koristi i SoftwareSerial, koji nije dio biblioteke Soldered DE2120. Komentar u primjeru navodi da ga možete pronaći u Arduino Library Manageru.

Kôd primjera​

Select Board
SerialSettings.ino
/**
**************************************************
*
* @file SerialSettings.ino
* @brief Interactive configuration and scanning demo for the DE2120
* 1D/2D barcode scanner module over SoftwareSerial.
*
* Presents a Serial Monitor menu to control scanner settings
* at runtime: start/stop scanning, toggle the illumination
* flashlight and aiming reticle, adjust the reading area,
* switch reading modes (manual, continuous, motion), and
* enable or disable 1D/2D symbology groups.
*
* While the menu is displayed the sketch continuously polls
* for barcodes, printing any result to Serial Monitor before
* waiting for the next menu selection.
*
* The scanner must first be put into TTL/RS232 mode by
* scanning the POR232 barcode from the DYScan settings
* manual. Change the SoftwareSerial pin arguments to match
* your wiring before uploading.
*
* Make sure you have SoftwareSerial library installed. It
* can be found in Arduino library manager.
*
* @authors Fran Fodor @ soldered.com
***************************************************/

#include "SoftwareSerial.h"
SoftwareSerial softSerial(4, 5); // change according to your wiring

#include "DE2120-SOLDERED.h"
DE2120_Soldered scanner;

#define BUFFER_LEN 40
char scanBuffer[BUFFER_LEN];

void setup()
{
Serial.begin(115200);
Serial.println("DE2120 Scanner Example");

if (scanner.begin(softSerial) == false)
{
Serial.println("Scanner did not respond. Please check wiring. Did you scan the POR232 barcode? Freezing...");
while (1)
;
}
Serial.println("Scanner online!");
}

void loop()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println();
Serial.println("SparkFun DE2120 Barcode Scanner Library");
Serial.println("-------------------------------------");
Serial.println("1) Start Scan");
Serial.println("2) Stop Scan");
Serial.println("3) Enable/Disable Flashlight");
Serial.println("4) Enable/Disable Aiming Reticle");
Serial.println("5) Set Reading Area");
Serial.println("6) Set Reading Mode");
Serial.println("7) Enable Disable Symbologies");
Serial.println("-------------------------------------");
Serial.println("Select an option number: ");

// Wait for the user to reply but look for barcodes in the meantime
while (Serial.available() == false)
{
if (scanner.readBarcode(scanBuffer, BUFFER_LEN))
{
Serial.println("...");
Serial.print("Code found: ");
for (int i = 0; i < strlen(scanBuffer); i++)
Serial.print(scanBuffer[i]);
Serial.println();
}

delay(200);
}

switch (Serial.read())
{

case '1':
scanner.startScan();
break;

case '2':
scanner.stopScan();
break;

case '3':
flashlight();
break;

case '4':
reticle();
break;

case '5':
readingArea();
break;

case '6':
readingMode();
break;

case '7':
symbologies();
break;

default:
Serial.println("Command not recognized");
break;
}
}

void flashlight()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println();
Serial.println("-------------------------------------");
Serial.println("1) Enable Flashlight");
Serial.println("2) Disable Flashlight");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch (Serial.read())
{
case '1':
Serial.println("White scan light on");
scanner.lightOn();
break;

case '2':
Serial.println("White scan light off");
scanner.lightOff();
break;

default:
Serial.println("Command not recognized");
break;
}
}

void reticle()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println();
Serial.println("-------------------------------------");
Serial.println("1) Enable Reticle");
Serial.println("2) Disable Reticle");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch (Serial.read())
{
case '1':
Serial.println("Red scan reticle on");
scanner.reticleOn();
break;

case '2':
Serial.println("Red scan reticle off");
scanner.reticleOff();
break;

default:
Serial.println("Command not recognized");
break;
}

}

void readingArea()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println("...");
Serial.println("...");
Serial.println("...");
Serial.println("-------------------------------------");
Serial.println("1) Full Width (Default)");
Serial.println("2) Center 80%");
Serial.println("3) Center 60%");
Serial.println("4) Center 40%");
Serial.println("5) Center 20%");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch(Serial.read()){

case '1':
Serial.println("Scanning 100% of frame");
scanner.changeReadingArea(100);
return;

case '2':
Serial.println("Scanning center 80% of frame");
scanner.changeReadingArea(80);
return;

case '3':
Serial.println("Scanning center 60% of frame");
scanner.changeReadingArea(60);
return;

case '4':
Serial.println("Scanning center 40% of frame");
scanner.changeReadingArea(40);
return;

case '5':
Serial.println("Scanning center 20% of frame");
scanner.changeReadingArea(20);
return;

default:
Serial.println("Command not recognized");
return;
}
}

void readingMode()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println("...");
Serial.println("...");
Serial.println("...");
Serial.println("-------------------------------------");
Serial.println("1) Manual Read Mode (Default)");
Serial.println("2) Continuous Read Mode");
Serial.println("3) Motion Sensor Mode");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch(Serial.read()){

case '1':
Serial.println("Manual Trigger Mode enabled");
scanner.disableMotionSense();
return;

case '2':
Serial.println("Continuous Read Mode enabled");
scanner.enableContinuousRead();
return;

case '3':
Serial.println("Motion Trigger Mode enabled");
scanner.enableMotionSense();
return;

default:
Serial.println("Command not recognized");
return;
}
}

void symbologies()
{
flushRx(); // Clear the serial rx buffer to avoid line endings

Serial.println("...");
Serial.println("...");
Serial.println("...");
Serial.println("-------------------------------------");
Serial.println("1) Enable All 1D Symbologies");
Serial.println("2) Disable All 1D Symbologies");
Serial.println("3) Enable All 2D Symbologies");
Serial.println("4) Disable All 2D Symbologies");
Serial.println("-------------------------------------");
Serial.println("Select an option number:");

while (Serial.available() == false)
{
//Wait for user to send char
}

switch(Serial.read()){

case '1':
Serial.println("1D Symbologies enabled");
scanner.enableAll1D();
return;

case '2':
Serial.println("1D Symbologies disabled");
scanner.disableAll1D();
return;

case '3':
Serial.println("2D Symbologies enabled");
scanner.enableAll2D();
return;

case '4':
Serial.println("2D Symbologies disabled");
scanner.disableAll2D();
return;

default:
Serial.println("Command not recognized");
return;
}
}

void flushRx(){
while(Serial.available()){
Serial.read();
delay(1);
}
}

Očekivani rezultat:

Serial MonitorAutoscrollShow timestampNewline115200 baud
Message (Enter to send message to the board)
DE2120 Scanner Example
Scanner online!

SparkFun DE2120 Barcode Scanner Library
-------------------------------------
1) Start Scan
2) Stop Scan
3) Enable/Disable Flashlight
4) Enable/Disable Aiming Reticle
5) Set Reading Area
6) Set Reading Mode
7) Enable Disable Symbologies
-------------------------------------
Select an option number:

Pošaljite broj za odabir opcije. Opcije od 3 do 7 otvaraju drugi izbornik i nakon odabira ispisuju potvrdu, na primjer White scan light on, Scanning center 60% of frame ili Continuous Read Mode enabled; opcije 1 i 2 djeluju odmah bez poruke. Zatim se ponovno prikaže glavni izbornik. Kod skeniran dok glavni izbornik čeka ispisuje se kao ..., a zatim Code found: i sadržaj koda.

Opcija 6, a zatim 3 (Motion Sensor Mode) šalje naredbu POR. Poziva enableMotionSense() sa zadanom vrijednošću 50, što šalje POR50, naredbu iz skupine naredbi za način komunikacije skenera. Što POR50 radi na skeneru nije dokumentirano, a biblioteka upozorava da USB način rada uzrokuje da skener prestane odgovarati preko TTL-a. Pogledajte upozorenje ispod enableMotionSense().

Korištene funkcije​

SoftwareSerial(rxPin, txPin, inverse_logic)returns None

Konstruktor iz biblioteke SoftwareSerial. Stvara serijski port na dva digitalna pina, izveden softverski. Istodobno može primati samo jedan SoftwareSerial port.

ReturnsKonstruktor; nema povratne vrijednosti.

Parametri

TipNazivOpis
broj pinarxPinPin koji prima, spojen na TX skenera. Primjer koristi 4.
broj pinatxPinPin koji šalje, spojen na RX skenera. Primjer koristi 5.
boolinverse_logicInvertira smisao signala. Neobavezno, zadano false; primjer ga izostavlja.
DE2120_Soldered()returns None

Stvara objekt skenera. Za sada ne sadrži nikakve pinove ni port: begin() ga povezuje sa serijskim portom.

ReturnsKonstruktor; nema povratne vrijednosti.

scanner.begin(SoftwareSerial &serialPort)returns bool

Povezuje objekt skenera sa SoftwareSerial portom i provjerava odgovara li skener. Pokreće port na 9600 baud i traži verziju firmwarea. Ako nema odgovora, ponavlja pokušaj na 115200 baud, nalaže skeneru da prijeđe na 9600 baud i ponovno pita. Nakon uspjeha prazni prijemni međuspremnik kako bi se prvo skeniranje čisto pročitalo.

Returnstrue kada je skener odgovorio, false kada nije.

Parametri

TipNazivOpis
SoftwareSerial &serialPortPort na koji je skener spojen, ovdje softSerial.
scanner.readBarcode(char *resultBuffer, uint8_t size)returns bool

Čita bajtove koji čekaju od skenera u resultBuffer. Skeniranje završava znakom za povratak na početak retka (carriage return); kada on stigne, funkcija vraća true, a međuspremnik sadrži kod, carriage return i završnu nulu. Međuspremnik koji već sadrži završeno skeniranje briše se prije sljedećeg.

Returnstrue kada je u međuspremniku potpuno skeniranje, false kada potpuno skeniranje još nije stiglo.

Parametri

TipNazivOpis
char *resultBufferMeđuspremnik u koji se sprema kod. Primjer koristi 40 bajtova.
uint8_tsizeVeličina međuspremnika. Čita se najviše toliko bajtova, pa se dulji kod skraćuje.
scanner.startScan()returns bool

Šalje naredbu SCAN, koja pokreće skeniranje. Namijenjeno ručnom načinu (okidač), koji je zadan.

Returnstrue kada je skener potvrdio naredbu.

scanner.stopScan()returns bool

Šalje naredbu SLEEP, koja zaustavlja skeniranje u tijeku.

Returnstrue kada je skener potvrdio naredbu.

scanner.lightOn()returns bool

Uključuje bijele LED diode osvjetljenja (LAMENA1). Zadano su uključene.

Returnstrue kada je skener potvrdio naredbu.

scanner.lightOff()returns bool

Isključuje bijele LED diode osvjetljenja (LAMENA0).

Returnstrue kada je skener potvrdio naredbu.

scanner.reticleOn()returns bool

Uključuje crveno svjetlo za ciljanje (AIMENA1). Zadano je uključeno.

Returnstrue kada je skener potvrdio naredbu.

scanner.reticleOff()returns bool

Isključuje crveno svjetlo za ciljanje (AIMENA0).

Returnstrue kada je skener potvrdio naredbu.

scanner.changeReadingArea(uint8_t percent)returns bool

Postavlja koliki dio kadra kamere, mjereno od njegova središta, skener pretražuje u potrazi za kodom (IMGREG0 do IMGREG4). Zadano je cijeli kadar.

Returnstrue kada je skener potvrdio naredbu; false za vrijednost koju funkcija ne prihvaća.

Parametri

TipNazivOpis
uint8_tpercent100 (puna širina), 80, 60, 40 ili 20.
scanner.disableMotionSense()returns bool

Postavlja skener u ručni način (okidač), koji je zadan (SCMMAN). Primjer ga koristi za opciju Manual Read Mode.

Returnstrue kada je skener potvrdio naredbu.

scanner.enableContinuousRead(uint8_t repeatInterval = 2)returns bool

Postavlja skener u kontinuirani način (SCMCNT), u kojem čita bez okidača, i određuje koliko često se isti kod ponovno šalje (CNTALW).

Returnstrue kada je skener potvrdio postavku intervala; false za interval 4 ili veći.

Parametri

TipNazivOpis
uint8_trepeatIntervalZa isti kod: 0 izlaz jednom, 1 ponavljanje bez razmaka, 2 svakih 0,5 s, 3 svake 1 s. Primjer ostavlja 2.
scanner.enableMotionSense(uint8_t sensitivity = 50)returns bool

Postavlja skener u način detekcije pokreta (SCMMDH), a zatim šalje osjetljivost. U ovoj verziji biblioteke osjetljivost se šalje iza prefiksa POR umjesto iza MDTTHR, postavke osjetljivosti na pokret skenera, pa povratna vrijednost odražava tu drugu naredbu, a ne promjenu osjetljivosti.

ReturnsOdgovor skenera na naredbu osjetljivosti; false za vrijednost koju funkcija ne prihvaća.

Parametri

TipNazivOpis
uint8_tsensitivity15 (najviša), 20, 30, 50 ili 100 (najniža). Primjer ostavlja 50.

Osjetljivost nema učinka u ovoj verziji biblioteke. Funkcija šalje vrijednost iza POR, prefiksa naredbi skenera za način komunikacije (POR232 je TTL/RS232 način, PORKBD, PORHID i PORVIC su USB načini), a ne iza MDTTHR, pa prosljeđivanje 15 ili 100 ne mijenja osjetljivost na pokret. Što dobivena naredba POR15, POR20, POR30, POR50 ili POR100 radi na skeneru nije dokumentirano: nijedna od njih nije među načinima komunikacije koje biblioteka navodi. Sama biblioteka upozorava da USB način uzrokuje da skener prestane odgovarati preko TTL-a. Za postavljanje osjetljivosti pošaljite je sami naredbom scanner.sendCommand("MDTTHR", "15") (ili 20, 30, 50, 100).

scanner.enableAll1D()returns bool

Uključuje dekodiranje svih 1D simbologija (ODCENA).

Returnstrue kada je skener potvrdio naredbu.

scanner.disableAll1D()returns bool

Isključuje dekodiranje svih 1D simbologija (ODCDIS).

Returnstrue kada je skener potvrdio naredbu.

scanner.enableAll2D()returns bool

Uključuje dekodiranje svih 2D simbologija (AQRENA).

Returnstrue kada je skener potvrdio naredbu.

scanner.disableAll2D()returns bool

Isključuje dekodiranje svih 2D simbologija (AQRDIS).

Returnstrue kada je skener potvrdio naredbu.

Sve zajedno​

Svaka stavka izbornika odgovara jednoj funkciji, a svaka funkcija šalje jednu ili dvije konfiguracijske naredbe skenera i čeka njihovu potvrdu. Skica zanemaruje povratne vrijednosti; u vlastitom kodu provjerite ih kako biste vidjeli je li skener prihvatio postavku.

U kontinuiranom načinu skener čita bez okidača, a repeatInterval određuje koliko često ponovno šalje isti kod. Za očitavanje na zahtjev ostanite u ručnom načinu i pozovite startScan() iz svog koda ili povucite TRIG na nisku razinu.