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
/**
**************************************************
*
* @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:
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 NoneKonstruktor 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
| Tip | Naziv | Opis |
|---|---|---|
| broj pina | rxPin | Pin koji prima, spojen na TX skenera. Primjer koristi 4. |
| broj pina | txPin | Pin koji šalje, spojen na RX skenera. Primjer koristi 5. |
bool | inverse_logic | Invertira smisao signala. Neobavezno, zadano false; primjer ga izostavlja. |
DE2120_Soldered()returns NoneStvara 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 boolPovezuje 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
| Tip | Naziv | Opis |
|---|---|---|
SoftwareSerial & | serialPort | Port 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
| Tip | Naziv | Opis |
|---|---|---|
char * | resultBuffer | Međuspremnik u koji se sprema kod. Primjer koristi 40 bajtova. |
uint8_t | size | Velič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 boolUključuje bijele LED diode osvjetljenja (LAMENA1). Zadano su uključene.
Returnstrue kada je skener potvrdio naredbu.
scanner.lightOff()returns boolIsključuje bijele LED diode osvjetljenja (LAMENA0).
Returnstrue kada je skener potvrdio naredbu.
scanner.reticleOn()returns boolUključuje crveno svjetlo za ciljanje (AIMENA1). Zadano je uključeno.
Returnstrue kada je skener potvrdio naredbu.
scanner.reticleOff()returns boolIsključuje crveno svjetlo za ciljanje (AIMENA0).
Returnstrue kada je skener potvrdio naredbu.
scanner.changeReadingArea(uint8_t percent)returns boolPostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | percent | 100 (puna širina), 80, 60, 40 ili 20. |
scanner.disableMotionSense()returns boolPostavlja 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 boolPostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | repeatInterval | Za 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 boolPostavlja 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
| Tip | Naziv | Opis |
|---|---|---|
uint8_t | sensitivity | 15 (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 boolUključuje dekodiranje svih 1D simbologija (ODCENA).
Returnstrue kada je skener potvrdio naredbu.
scanner.disableAll1D()returns boolIsključuje dekodiranje svih 1D simbologija (ODCDIS).
Returnstrue kada je skener potvrdio naredbu.
scanner.enableAll2D()returns boolUključuje dekodiranje svih 2D simbologija (AQRENA).
Returnstrue kada je skener potvrdio naredbu.
scanner.disableAll2D()returns boolIsključ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.