iButton и LCD дисплей
- Войдите на сайт для отправки комментариев
Ср, 30/09/2015 - 18:58
Добрый день. Я новичек в 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);}}// Задержка
Замени все lcd.println на lcd.print
В HEX выводится точно так же
lcd.print(var, HEX)
Ну и вместо lcd.clear() лучше перезаписывать только нужный участок экрана.
Спасибо, разобрался. Вот что получилось.
#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);}}// ЗадержкаCtrl+T - автоформатирование кода.
Спасибо, буду знать