Skip to content
lcd_i2c.ino 2.53 KiB
Newer Older
/****************************************************************************
* Author : Victor Dubois
****************************************************************************/

Victor Dubois's avatar
Victor Dubois committed
#include <ros.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <std_msgs/UInt16.h>
#include <std_msgs/Duration.h>
#include <math.h>
Victor Dubois's avatar
Victor Dubois committed

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
Victor Dubois's avatar
Victor Dubois committed
ros::NodeHandle nh;
bool stopped = true;
uint16_t current_score;
uint16_t remaining_time;
int loopId = 0;
Victor Dubois's avatar
Victor Dubois committed

void timeCb( const std_msgs::Duration& a_remaining_time){
    remaining_time = a_remaining_time.data.toSec();
}
Victor Dubois's avatar
Victor Dubois committed

void scoreCb( const std_msgs::UInt16& score){
    current_score = score.data;
Victor Dubois's avatar
Victor Dubois committed
}

ros::Subscriber<std_msgs::UInt16> score_sub("score", &scoreCb);
ros::Subscriber<std_msgs::Duration> time_sub("remainingTime", &timeCb);

void drawLCD()
{
    // Print a message to the LCD.
    lcd.setCursor(7,1);
Victor Dubois's avatar
Victor Dubois committed
    lcd.print("Score:");
    print_with_padding(current_score);
    lcd.setCursor(0,1);
Victor Dubois's avatar
Victor Dubois committed
    lcd.print("T");
    print_with_padding(remaining_time);
    lcd.print("s");
}
Victor Dubois's avatar
Victor Dubois committed

void print_with_padding(uint16_t number)
{
    uint16_t hundreds = (number%1000 - number%100)/100;
    uint16_t units = number%10;
    uint16_t tens = (number%1000 - hundreds*100 - units)/10;
    if(hundreds == 0)
    {
        lcd.print(" ");
    }
    else
    {
        lcd.print(hundreds);
    };
    if(tens == 0 && hundreds == 0)
    {
        lcd.print(" ");
    }
    else
    {
        lcd.print(tens);
    };
    lcd.print(units);
Victor Dubois's avatar
Victor Dubois committed
}

Victor Dubois's avatar
Victor Dubois committed
void createCrab()
{
    byte Crab1[8] = {
        0b01000,
        0b11001,
        0b00110,
        0b01110,
        0b01110,
        0b00110,
        0b11001,
        0b01000
    };
    byte Crab2[8] = {
        0b01000,
        0b11001,
        0b00110,
        0b01111,
        0b01111,
        0b00110,
        0b11001,
        0b01000
    };
    lcd.createChar(0, Crab1);
    lcd.createChar(1, Crab2);
}

void setup()
{ 
    current_score = 0;
    loopId = 255;
    remaining_time = 100;
    
    nh.initNode();
    nh.subscribe(score_sub);
    nh.subscribe(time_sub);

    lcd.init();                      // initialize the lcd 
    lcd.backlight();
Victor Dubois's avatar
Victor Dubois committed
    createCrab();
    lcd.setCursor(0,0);
lcd.write(byte(0));
lcd.write(byte(0));
lcd.write(byte(0));
    
    lcd.setCursor(4,0);
    lcd.print("Kraboss");
    lcd.setCursor(13,0);
lcd.write(byte(0));
lcd.write(byte(1));
lcd.write(byte(0));
    
Victor Dubois's avatar
Victor Dubois committed

void loop()
{
    nh.spinOnce();
    if(loopId == 0)
    {
        loopId = 1024;
        drawLCD();
    }
    loopId--;
Victor Dubois's avatar
Victor Dubois committed
}