iButton и LCD дисплей

anrywolf
Offline
Зарегистрирован: 30.09.2015

Добрый день. Я новичек в Arduino. Решил попробовать свои силы на считывателе iButton, но застопорился на выводе ID ключа на дисплей. Сам код рабочий, в мониторе порта отображается ID, а на дисплей выводятся кракозябры. Не могу понять, как подправить код. 

#include <OneWire.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
OneWire ds(10);// Определяем пин подключения к ключу
byte addr[8]; // Обозначаем массив из 8 байт
LiquidCrystal_I2C lcd(0x3F,16,2);   /* Задаем адрес и размерность дисплея. 
При использовании LCD I2C модуля с дисплеем 20х04 ничего в коде изменять не требуется, cледует только задать правильную размерность */

void setup()
{
  lcd.begin();                            // Инициализация lcd             
  lcd.backlight();                       // Включаем подсветку
  // Курсор находится в начале 1 строки
  lcd.print("..Initializing..");            // Выводим текст
  lcd.setCursor(0, 1);                   // Устанавливаем курсор в начало 2 строки
  lcd.print("      wait");              // Выводим текст
delay (1000);
Serial.begin(9600);}// Запускаем порт
void loop() {
  lcd.clear(); //Clears LCD
 lcd.setCursor(0, 0);
 lcd.print("  Please Swipe");
 lcd.setCursor(0, 1);
 lcd.print("   Your Card");
 delay (1000);
byte i;
byte present = 0;
byte data[12];
byte addr[8];  
if (ds.search(addr)){// Если устройство подключено - считываем
Serial.print("R=");
for( i = 0; i < 8; i++) {// Запускаем цикл печати данных из массива
if (addr[i] < 16) Serial.print ("0");// Дописываем недостающие нули
Serial.print(addr[i], HEX);// Печатаем нужный байт в шестнадцатиричном виде
Serial.print(" ");}// Печатаем пробел
lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("......Read......");
delay(1000);
lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("      Done");
 lcd.setCursor(0, 1);
 lcd.println(                );
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;} 
if ( addr[0] != 0x01) {
Serial.print("Device is not a DS1990A family device.\n");
return;}

Serial.println();// В конце цикла переводим строку
ds.reset();// Сбрасываем устройство
delay(2000);}}// Задержка

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Замени все lcd.println на lcd.print

В HEX выводится точно так же

lcd.print(var, HEX)

Ну и вместо lcd.clear() лучше перезаписывать только нужный участок экрана.

anrywolf
Offline
Зарегистрирован: 30.09.2015

Спасибо, разобрался. Вот что получилось.

#include <OneWire.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
OneWire ds(10);// Определяем пин подключения к ключу
byte addr[8]; // Обозначаем массив из 8 байт
LiquidCrystal_I2C lcd(0x3F,16,2);   /* Задаем адрес и размерность дисплея. 
При использовании LCD I2C модуля с дисплеем 20х04 ничего в коде изменять не требуется, 
cледует только задать правильную размерность */

void setup(){
  lcd.begin();                           // Инициализация lcd             
  lcd.backlight();                       // Включаем подсветку
                                         // Курсор находится в начале 1 строки
  lcd.print("..Initializing..");         // Выводим текст
  lcd.setCursor(0, 1);                   // Устанавливаем курсор в начало 2 строки
  lcd.print("      wait");               // Выводим текст
delay (1000);
Serial.begin(9600);}                     // Запускаем порт

void loop() {
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("  Please Swipe");
 lcd.setCursor(0, 1);
 lcd.print("   Your Card");
 delay (1000);
byte i;
byte present = 0;
byte data[12];
byte addr[8];  
if (ds.search(addr)){// Если устройство подключено - считываем
Serial.print("ID=");
for( i = 0; i < 8; i++) {// Запускаем цикл печати данных из массива
if (addr[i] < 16) Serial.print ("0");// Дописываем недостающие нули
Serial.print(addr[i], HEX);// Печатаем нужный байт в шестнадцатиричном виде
Serial.print(" ");}// Печатаем пробел
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("......Read......");
delay(1000);
 lcd.clear();
 lcd.setCursor(0, 0);
 lcd.print("    ID  Card");
 lcd.setCursor(0, 1);
 for( i = 0; i < 8; i++) {// Запускаем цикл печати данных из массива
if (addr[i] < 16) lcd.print ("0");// Дописываем недостающие нули
 lcd.print(addr[i], HEX);}
if ( OneWire::crc8( addr, 7) != addr[7]) {
Serial.print("CRC is not valid!\n");
return;} 
if ( addr[0] != 0x01) {
Serial.print("Device is not a DS1990A family device.\n");
return;}
Serial.println();// В конце цикла переводим строку
ds.reset();// Сбрасываем устройство
delay(5000);}}// Задержка
Radjah
Offline
Зарегистрирован: 06.08.2014

Ctrl+T - автоформатирование кода.

anrywolf
Offline
Зарегистрирован: 30.09.2015

Спасибо, буду знать