/*
Wokwi | general
Celๆ๐ฌ๐ป โ 5/21/24 at 10:10 PM
Project Link: https://wokwi.com/projects/398112200220116993?gh=1
anyone can help to fix my program please?
https://forum.arduino.cc/t/how-to-delete-line-on-lcd/206905/11
*/
#include <LiquidCrystal_I2C.h>
const int ALERT_RANGE = 100;
const int DETECT_RANGE = 200;
const int LOW_NOTE = 440;
const int HIGH_NOTE = 880;
const int INTERVAL = 250; // sample 4 times / second
const int BUZZ_PIN = 3;
const int ECHO_PIN = 11;
const int TRIG_PIN = 12;
const int SAFE_LED_PIN = 5;
const int DETECT_LED_PIN = 6;
const int ALERT_LED_PIN = 7;
unsigned long previousMillis = 0;
bool oldAlertState = false;
bool oldCloseState = false;
bool isNotified = false;
LiquidCrystal_I2C lcd(0x27, 20, 4);
void clearLCDLine(int line) {
lcd.setCursor(0, line);
for (int n = 0; n < 20; n++) { // 16 or 20, depends on LCD
lcd.print(" ");
}
}
long getDuration() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
return duration;
}
void soundBuzzer(int toneVal) {
tone(BUZZ_PIN, toneVal);
}
void setup() {
Serial.begin(9600);
pinMode(SAFE_LED_PIN, OUTPUT);
pinMode(DETECT_LED_PIN, OUTPUT);
pinMode(ALERT_LED_PIN, OUTPUT);
pinMode(BUZZ_PIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(5, 1);
lcd.print("Proximity");
lcd.setCursor(5, 2);
lcd.print("Alert V1.0");
delay(2000);
lcd.clear();
}
void loop() {
char cmBuff[8], inBuff[8];
double cmVal, inVal;
bool isAlertState = false;
bool isCloseState = false;
if (millis() - previousMillis >= INTERVAL) {
previousMillis = millis();
long duration = getDuration();
cmVal = duration * 0.0344 / 2;
inVal = duration * 0.0135 / 2;
cmVal < ALERT_RANGE ?
isAlertState = true : isAlertState = false;
cmVal >= ALERT_RANGE && cmVal < DETECT_RANGE ?
isCloseState = true : isCloseState = false;
if (isAlertState != oldAlertState) {
oldAlertState = isAlertState;
isNotified = false;
if (isAlertState) Serial.println("Proximity alert!");
}
if (isCloseState != oldCloseState) {
oldCloseState = isCloseState;
isNotified = false;
if (isCloseState) Serial.println("Object detected");
}
if (!isNotified) {
clearLCDLine(2);
clearLCDLine(3);
isNotified = true;
}
if (isCloseState) {
digitalWrite(ALERT_LED_PIN, isAlertState);
digitalWrite(DETECT_LED_PIN, isCloseState);
digitalWrite(SAFE_LED_PIN, LOW);
soundBuzzer(LOW_NOTE);
lcd.setCursor(7, 2);
lcd.print("Object");
lcd.setCursor(6, 3);
lcd.print("detected");
}
else if (isAlertState) {
digitalWrite(ALERT_LED_PIN, isAlertState);
digitalWrite(DETECT_LED_PIN, isCloseState);
digitalWrite(SAFE_LED_PIN, LOW);
soundBuzzer(HIGH_NOTE);
lcd.setCursor(6, 2);
lcd.print("Proximity");
lcd.setCursor(7, 3);
lcd.print("alert !");
}
else {
digitalWrite(ALERT_LED_PIN, isAlertState);
digitalWrite(DETECT_LED_PIN, isCloseState);
digitalWrite(SAFE_LED_PIN, HIGH);
noTone(BUZZ_PIN);
}
dtostrf(inVal, 5, 1, inBuff);
dtostrf(cmVal, 5, 1, cmBuff);
lcd.setCursor(2, 0);
lcd.print("Inches");
lcd.setCursor(14, 0);
lcd.print("CM");
lcd.setCursor(2, 1);
lcd.print(inBuff);
lcd.setCursor(13, 1);
lcd.print(cmBuff);
}
}