Arduino + LCD Scrolling Text c Serial.

Life23
Offline
Зарегистрирован: 10.08.2013

Ребят, запутался совсем.. есть Arduino Diecimila (Atmega168), с Serial она получает данные. надо найти строчку с началом "Name:" и продолжение строчки до "/n" вывести на экран LCD. все хорошо, до тех пор, пока строчка не больше 16 символов (у меня LCD 16x2). Хотельсь бы "скрулить" строчку, пока не придет новая строчка с "Next:" и другим продолжением строки в отличии от первичного.

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Скролинг это аппаратная возможность дисплея. Библиотека лишь шлет команду.

lcd.scrollDisplayLeft();
lcd.scrollDisplayRight();

Life23
Offline
Зарегистрирован: 10.08.2013

блин.. где я ошибаюсь?

#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 тормозит все..

Life23
Offline
Зарегистрирован: 10.08.2013

может извращенно, но вроде как получилось:


#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();
} 

только скрулит весь буффер ((