#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6 // Data wire is plugged into pin 6 on the Arduino
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
int trigPin = 9; // Sensor Trip pin connected to Arduino pin 9
int echoPin = 7; // Sensor Echo pin connected to Arduino pin 7
float pingTime; // time for ping to travel from the sensor to the target and return
float targetDistance; // Distance to Target in Centimeters
float speedOfSound = 776.5; // Speed of sound in miles per hour
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Initialize the LCD
lcd.init();
// Turn on the backlight
lcd.backlight();
// Print a message to the LCD
lcd.print("Distance:");
sensors.begin(); // Start up the library
pinMode(8, OUTPUT); // pin 8, 10, 13 output pins
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(trigPin, LOW); // Set trigger pin low
delayMicroseconds(2000); // Let signal settle
digitalWrite(trigPin, HIGH); // Set trigPin high
delayMicroseconds(15); // Delay in high state
digitalWrite(trigPin, LOW); // ping has now been sent
delayMicroseconds(10); // Delay in high state
pingTime = pulseIn(echoPin, HIGH); // pingTime in microseconds
pingTime = pingTime / 1000000; // convert pingTime to seconds by dividing by 1000000 (microseconds in a second)
pingTime = pingTime / 3600; // convert pingtime to hours by dividing by 3600 (seconds in an hour)
targetDistance = speedOfSound * pingTime; // This will be in miles, since we declared the speed of sound as kilometers per hour; although we're going to convert it back to centimeters
targetDistance = targetDistance / 2; // Remember ping travels to the target and back from the target, so you must divide by 2 for actual target distance.
targetDistance = targetDistance * 160934.4; // Convert miles to centimeters by multiplying by 160934.4
sensors.requestTemperatures(); // Send the command to get temperature readings
lcd.setCursor(10, 0); // Set the cursor to the tenth column of the first row
lcd.print(" "); // Print blanks to clear the row
lcd.setCursor(10, 0); // Set Cursor again to the tenth column of the first row
lcd.print((int)(targetDistance + 0.5)); // Print measured distance
lcd.print("cm "); // Print your units
lcd.setCursor(0, 1); // Set the cursor to the first column of the second row
lcd.print(" "); // Print blanks to clear the row
lcd.setCursor(0, 1); // Set Cursor again to the first column of the second row
if (targetDistance > 40) {
lcd.print("LEV LOW ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print((char)223);
lcd.print ("C");
} else if (targetDistance <= 40 && targetDistance > 20) { // Corrected condition
lcd.print("LEV MED ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print((char)223);
lcd.print ("C");
} else {
lcd.print ("LEV HIGH ");
lcd.print(sensors.getTempCByIndex(0));
lcd.print((char)223);
lcd.print ("C");
}
delay(2000);
if (targetDistance > 40) {
digitalWrite (13, HIGH); // Green LED ON
} else {
digitalWrite(13, LOW); // Green LED OFF
}
if (targetDistance <= 40 && targetDistance > 20) {
digitalWrite (8, HIGH); // Yellow LED ON
} else {
digitalWrite(8, LOW); // Yellow LED OFF
}
if (targetDistance <= 20) { // Corrected condition
digitalWrite(10, HIGH); // Red LED ON
delay(2000);
digitalWrite(10, LOW); // Red LED OFF
} else {
digitalWrite(10, LOW); // Red LED OFF
}
}
Loading
ds18b20
ds18b20