Arduino + LCD Scrolling Text c Serial.
- Войдите на сайт для отправки комментариев
Сб, 28/09/2013 - 01:38
Ребят, запутался совсем.. есть Arduino Diecimila (Atmega168), с Serial она получает данные. надо найти строчку с началом "Name:" и продолжение строчки до "/n" вывести на экран LCD. все хорошо, до тех пор, пока строчка не больше 16 символов (у меня LCD 16x2). Хотельсь бы "скрулить" строчку, пока не придет новая строчка с "Next:" и другим продолжением строки в отличии от первичного.
Скролинг это аппаратная возможность дисплея. Библиотека лишь шлет команду.
lcd.scrollDisplayLeft();
lcd.scrollDisplayRight();
блин.. где я ошибаюсь?
#define INPUT_BUF_SIZE 20 // размер входного буфера char input_buff[INPUT_BUF_SIZE+1]; // место под хранение входящих из GPRS данных byte inputBuffIndex=0; #define SERIAL_SPEED 9600 #define GPRS Serial #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { Serial.begin(SERIAL_SPEED); lcd.begin(16,2); // columns, rows. size of display } void loop() { if (isLineReady()){ printLcd(input_buff); } lcd.setCursor(16,0); // set the cursor outside the display count lcd.autoscroll(); // set the display to automatically scroll: lcd.print(" "); // print empty character delay(900); } bool isLineReady(){ if (GPRS.available()){ byte t = GPRS.read(); switch(t){ case '\n': input_buff[inputBuffIndex] = 0; inputBuffIndex=0; return true; break; case '\r': break; default: if (inputBuffIndex < INPUT_BUF_SIZE){ input_buff[inputBuffIndex] = t; inputBuffIndex++; } } } return false; } void printLcd(char* text){ lcd.noAutoscroll(); lcd.clear(); lcd.setCursor(16,0); lcd.print(text); }после прихода "конца строки"(/n) надо что бы тексты "написало" в начале первой строки. и скрулило до тех пор, пока не придет с сериала повторно /n
update
блин.. первая ошибка .. delay тормозит все..
может извращенно, но вроде как получилось:
#define INPUT_BUF_SIZE 30 // размер входного буфера char input_buff[INPUT_BUF_SIZE+1]; // место под хранение входящих из Serial данных byte inputBuffIndex=0; #include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7); long previousMillis = 0; // храним время последнего "сдвига" текста long interval = 500; // интервал между "сдвига" текста unsigned long currentMillis = millis(); void setup() { Serial.begin(9600); lcd.begin(16,2); // columns, rows. size of display } void loop() { if (isLineReady()){ printLcd(input_buff); } unsigned long currentMillis = millis(); if(currentMillis - previousMillis > interval) { previousMillis = currentMillis; scrollLine(); } } bool isLineReady(){ if (Serial.available()){ byte t = Serial.read(); switch(t){ case '\n': input_buff[inputBuffIndex] = 0; inputBuffIndex=0; return true; break; case '\r': break; default: if (inputBuffIndex < INPUT_BUF_SIZE){ input_buff[inputBuffIndex] = t; inputBuffIndex++; } } } return false; } void printLcd(char* text){ lcd.clear(); lcd.setCursor(16,0); lcd.print(text); } bool scrollLine(){ lcd.setCursor(16,0); // set the cursor outside the display count lcd.scrollDisplayLeft(); }только скрулит весь буффер ((