πŸ“ 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 */