π Full Firmware & Library Listing
Expand any module below to review its fullyβcommented source. All sketches compile under Arduino IDE 2.x using the default AVR toolβchain.
BlinkingCursor.ino
// LCD cursor blink demonstration
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Cursor blink");
lcd.setCursor(0, 1);
lcd.blink();
}
void loop() {
// nothing needed β hardware cursor handles blink timing
}
CustomChars.ino
// Demonstrates userβdefined characters on 16Γ2 I2C LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
byte smiley[8] = {
B00000,
B01010,
B01010,
B00000,
B10001,
B01110,
B00000,
};
void setup() {
lcd.init();
lcd.createChar(0, smiley);
lcd.backlight();
lcd.home();
lcd.write(byte(0));
lcd.print(" Custom chars!");
}
void loop() {}
HelloWorld.ino
// Classic I2C LCD βHello, world!β
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
lcd.init();
lcd.backlight();
lcd.print("Hello, world!");
}
void loop() {}
Orientation.ino
// MPUβ9250 β complementary filter for pitch/roll
#include <Wire.h>
#include <MPU9250.h>
MPU9250 imu(Wire, 0x68);
void setup() {
Serial.begin(115200);
imu.begin();
}
void loop() {
imu.readSensor();
float pitch = atan2(imu.getAccY_mss(), imu.getAccZ_mss()) * 57.3;
float roll = atan2(-imu.getAccX_mss(), imu.getAccZ_mss()) * 57.3;
Serial.print(pitch); Serial.print(',');
Serial.println(roll);
delay(50);
}
SerialDisplay.ino
// Mirror serial input to I2C LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
Serial.begin(9600);
lcd.init(); lcd.backlight();
}
void loop() {
if (Serial.available()) {
String msg = Serial.readStringUntil('\n');
lcd.clear();
lcd.print(msg);
}
}
task3-6.ino
// Fieldβtask demo: obstacle alert + water detect + thermal release
#include <NewPing.h>
#include <Servo.h>
const int trig = 10, echo = 11;
NewPing sonar(trig, echo, 200);
Servo release;
const int waterPin = A0;
const int thermPin = A1;
const float releaseTempC = 55.0;
void setup() {
Serial.begin(9600);
release.attach(5);
release.write(0); // closed
}
void loop() {
// 1) Obstacle alert
if (sonar.ping_cm() < 30) Serial.println("Obstacle!");
// 2) Water sensor
if (analogRead(waterPin) > 600) Serial.println("Water!");
// 3) Thermal release
float tempC = analogRead(thermPin) * 0.488f;
if (tempC > releaseTempC) release.write(90);
delay(250);
}
TiltAngle.ino
// Display tilt angle on LCD
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <MPU9250.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
MPU9250 imu(Wire, 0x68);
void setup() {
lcd.init(); lcd.backlight();
imu.begin();
}
void loop() {
imu.readSensor();
float pitch = atan2(imu.getAccY_mss(), imu.getAccZ_mss()) * 57.3;
lcd.setCursor(0, 0);
lcd.print("Pitch: "); lcd.print(pitch, 1);
lcd.print((char)223); lcd.print(' '); // degree symbol
delay(200);
}
LiquidCrystal_I2C.cpp
/**** Minimal LCD driver (excerpt) ****/
#include "LiquidCrystal_I2C.h"
#include <Wire.h>
void LiquidCrystal_I2C::init() {
Wire.begin();
_expanderWrite(0x00);
delay(50);
// 4βbit init sequence β¦
}
void LiquidCrystal_I2C::backlight() { _backlightval = 0x08; _expanderWrite(0); }
void LiquidCrystal_I2C::noBacklight() { _backlightval = 0x00; _expanderWrite(0); }
// [ full implementation continues β¦ ]
LiquidCrystal_I2C.h
#pragma once
#include <Print.h>
class LiquidCrystal_I2C : public Print {
public:
LiquidCrystal_I2C(uint8_t addr, uint8_t cols, uint8_t rows);
void init();
void backlight();
void noBacklight();
// β¦ other API
private:
uint8_t _addr, _cols, _rows, _backlightval;
void _expanderWrite(uint8_t);
};
/* EOF */