Ivan_Kornege писал(а): ↑01.09.2018{, 21:13}
Вот этот код работает:
Код: Выделить всё
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <Adafruit_Fingerprint.h>
LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
bool ScanS;
String ScanS_txt;
bool FoundS;
String FoundS_txt;
String PleaseFinger;
bool NotfoundS;
String NotfoundS_txt;
byte N_ID;
//SoftwareSerial mySerial(2, 3); // объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА( RX, TX ); // Можно указывать любые выводы, поддерживающие прерывание PCINTx
SoftwareSerial mySerial( 2, 3); // объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА( RX, TX ); // Можно указывать любые выводы, поддерживающие прерывание PCINTx
Adafruit_Fingerprint finger= Adafruit_Fingerprint(&mySerial); // объявляем объект finger для работы с библиотекой Adafruit_Fingerprint ИМЯ_ОБЪЕКТА = Adafruit_Fingerprint(ПАРАМЕТР);
// ПАРАМЕТР - ссылка на объект для работы с UART к которому подключен модуль, например: &Serial1
int _disp1oldLength = 0;
int _disp3oldLength = 0;
void setup()
{
pinMode(13, OUTPUT);
_lcd1.begin(16, 2);
_lcd1.clear(); // стираем информацию с дисплея
_lcd1.setCursor(0, 0); _lcd1.print("iArduino.ru"); // выводим текст "iArduino.ru"
delay(500); // обязательная задержка перед инициализацией модуля отпечатков пальцев
finger.begin(57600); // инициируем модуль отпечатков пальцев, с подключением через программный UART на скорости 57600 (скорость модуля по умолчанию)
_lcd1.clear(); // стираем информацию с дисплея
_lcd1.setCursor(0, 0); _lcd1.print(F("Scan sensor...")); // выводим текст "Scan sensor..."
_lcd1.setCursor(0, 1); // устанавливаем курсор в позицию: 0 столбец, 1 строка
if(finger.verifyPassword()){_lcd1.print("Found sensor");} // если модуль отпечатков обнаружен, выводим сообщение "сенсор обнаружен"
else {_lcd1.print("Sensor not found"); while(1);} // если модуль отпечатков не обнаружен, выводим сообщение "сенсор не обнаружен" и входим в бесконечный цикл: while(1);
delay(1000); // необязательная задержка, чтоб можно было прочитать сообщение об обнаружении модуля
}
void loop() {
// put your main code here, to run repeatedly:
}
В этом коде while(1); тоже while(true). Т.е. своего рода так делается loop до тех пор пока ,как Andy написал:
" пока функция finger.verifyPassword() не вернула 1".
В данном случае LCD находится в функции void setup() до while(1) и поэтому выводится информация на LCD.
А функция void loop() не начнет выполнятся, пока
" пока функция finger.verifyPassword() не вернула 1".
Ivan_Kornege писал(а): ↑01.09.2018{, 21:13}
А когда я делаю блок и в флпрог получется такой код, то перестает работать:
Код: Выделить всё
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>
#include <Adafruit_Fingerprint.h>
LiquidCrystal _lcd1(8, 9, 4, 5, 6, 7);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;
bool ScanS;
String ScanS_txt;
bool FoundS;
String FoundS_txt;
bool NotfoundS;
String NotfoundS_txt;
String PleaseFinger;
byte N_ID;
//SoftwareSerial mySerial(2, 3); // объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА( RX, TX ); // Можно указывать любые выводы, поддерживающие прерывание PCINTx
SoftwareSerial mySerial( 2, 3); // объявляем объект mySerial для работы с библиотекой SoftwareSerial ИМЯ_ОБЪЕКТА( RX, TX ); // Можно указывать любые выводы, поддерживающие прерывание PCINTx
Adafruit_Fingerprint finger= Adafruit_Fingerprint(&mySerial); // объявляем объект finger для работы с библиотекой Adafruit_Fingerprint ИМЯ_ОБЪЕКТА = Adafruit_Fingerprint(ПАРАМЕТР);
// ПАРАМЕТР - ссылка на объект для работы с UART к которому подключен модуль, например: &Serial1
int _disp1oldLength = 0;
int _disp2oldLength = 0;
int _disp3oldLength = 0;
void setup()
{
pinMode(13, OUTPUT);
_lcd1.begin(16, 2);
delay(500); // обязательная задержка 0,5 сек перед инициализацией модуля отпечатков пальцев
finger.begin(57600); // инициируем модуль отпечатков пальцев, с подключением через программный UART на скорости 57600 (скорость модуля по умолчанию)
ScanS = true; // пока идет поиск сенсора присутствует true
ScanS_txt = ("Scan sensor...") ; // Вывод сообщения "Поиск сенсора" в виде String
if(finger.verifyPassword())
{
FoundS = true; // Если модуль отпечатков обнаружен появится уровень true
FoundS_txt = (String("Found sensor!")) ; // Если модуль отпечатков обнаружен, выводим сообщение "сенсор обнаружен" ввиде String
}
else
{
FoundS = false; // Если модуль отпечатков не обнаружен на выходе FoundS появится уровень false
NotfoundS = true; // Если модуль отпечатков не обнаружен появится уровень true
NotfoundS_txt = ("Sensor not found"); // если модуль отпечатков не обнаружен, выводим сообщение "сенсор не обнаружен"
while(1); // если модуль отпечатков не обнаружен, выводим сообщение "сенсор не обнаружен" и входим в бесконечный цикл: while(1);
}
delay(1000); // необязательная задержка, чтоб можно было прочитать сообщение об обнаружении модуля
}
void loop()
{if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}
//Плата:1
if (NotfoundS) {
_dispTempLength1 = ((NotfoundS_txt)).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(0, 1);
_lcd1.print((NotfoundS_txt));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;}
}
if (FoundS) {
_dispTempLength1 = ((FoundS_txt)).length();
if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((FoundS_txt));
} else {
if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;}
}
digitalWrite(13, ScanS);
if (ScanS) {
_dispTempLength1 = ((ScanS_txt)).length();
if (_disp3oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;}
_disp3oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((ScanS_txt));
} else {
if (_disp3oldLength > 0) {_isNeedClearDisp1 = 1; _disp3oldLength = 0;}
}
}
FlProg не ставит код штатных блоков LCD в функцию void setup(). А заталкивает в void loop().
И соответственно если дактилоскоп не подключен (не найден) , то крутится все что до while(1) , а функция void loop() не исполняется.
Начнет исполнятся void loop() когда дактилоскоп будет определен, тогда и LCD запустится -он же в void loop() находится.
Вот теперь задача - можно ли затолкнуть штатный дисплей в void setup() ?
Я раньше такой возможности не нашел как это можно сделать в FlProg.
Можно конечно сделать блок дисплея код которого, при конвертации, FlProg вставляла в функцию void setup().
Ну как то так теоретически.
Отправлено спустя 7 минут 45 секунд:
kalobyte писал(а): ↑01.09.2018{, 22:43}
неправильно делаеш
отстраивают сначала в коде, там можно добавлять вывод в консоль
как заработает в коде, то можно переносить в блок 100% работающий код
да нечего там отстраивать - производитель дактилоскопа сделал библиотеку и примеры -они рабочие.
Теперь из этого надо перелепить в блок FlProg.
Программа не совсем все делает так как если ручками писать код.
Все правильно Ваня делает -железячники тестируют все в железе.
Отправлено спустя 8 минут 2 секунды:
kalobyte писал(а): ↑01.09.2018{, 22:43}
ну и я бы не использовал софтовый юарт, есть же железный
Просто идет по пути наименьшего сопротивления. Он же делает блок из работающего кода.
Если вы не можете объяснить это просто – значит, вы сами не понимаете этого до конца.
☆Альберт Эйнштейн