// LCD1602 and Pi Pico!
#include <LiquidCrystal.h>
#include <OneWire.h>
#include <DallasTemperature.h>
const int powerButton = 2;
const int startStop = 3;
const int stepPin = 16;
const int dirPin = 17;
const int buzzerPin = 14;
int oldValuePower = LOW;
int oldValueStart = LOW;
String programs[] = {"ECO", "Fast", "Regular"};
int durations[] = {200, 100, 150};
OneWire oneWire(28);
DallasTemperature sensors(&oneWire);
LiquidCrystal lcd(12, 11, 10, 9, 8, 7);
int pos = 0;
void setup() {
lcd.begin(20, 4);
resetLcd();
pinMode(powerButton, INPUT);
pinMode(startStop, INPUT);
pinMode(stepPin, OUTPUT);
pinMode(dirPin, OUTPUT);
pinMode(buzzerPin, OUTPUT);
digitalWrite(stepPin, LOW);
sensors.begin();
delay(20);
}
void buttonPressed() {
int numPrograms = 3;
pos++;
if (pos >= numPrograms) {
pos = 0;
}
if (pos < 0) {
pos = numPrograms - 1;
}
sensors.requestTemperatures();
writeLcd(programs[pos], 0, 1);
writeLcd(String(durations[pos]) + " ms", 0, 2);
writeLcd(String(sensors.getTempCByIndex(0)), 0, 3);
}
void loop() {
int newValuePower = digitalRead(powerButton);
if(newValuePower != oldValuePower)
{
if(newValuePower == HIGH)
{
buttonPressed();
}
// Remember the value for the next time.
oldValuePower = newValuePower;
}
int newValueStart = digitalRead(startStop);
if(newValueStart != oldValueStart)
{
if(newValueStart == HIGH)
{
runProgram();
}
// Remember the value for the next time.
oldValueStart = newValueStart;
}
delay(10); // Adding a delay() here speeds up the simulation
}
void runProgram(){
int duration = durations[pos];
writeLcd("Running program:", 0, 0);
writeLcd(String(durations[pos]) + "/" + String(durations[pos]) + " ms", 0, 2);
digitalWrite(dirPin, HIGH);
for (int i = 0; i < duration; i++) {
digitalWrite(stepPin, HIGH);
digitalWrite(stepPin, LOW);
int remainingTime = duration - (i + 1);
String padding = "";
if (remainingTime < 100){
padding += "0";
}
if (remainingTime < 10){
padding += "0";
}
lcd.setCursor(0, 2);
lcd.print(padding + String(remainingTime));
delay(5);
}
writeLcd("Finished program:", 0, 0);
delay(30);
for (int j = 0; j < 3; j++){
tone(buzzerPin, 1760, 20);
delay(200);
}
resetLcd();
}
void writeLcd(String msg, int column, int row){
lcd.setCursor(column, row);
for(int n = column; n < 20; n++) // 20 indicates symbols in line.
{
lcd.print(" ");
}
lcd.setCursor(column, row);
lcd.print(msg);
}
void printBlanks(int amount){
for (int i = 0; i < amount; i++){
lcd.print(" ");
}
}
void resetLcd(){
writeLcd("Select program:", 0, 0);
writeLcd(programs[pos], 0, 1);
writeLcd(String(durations[pos]) + " ms", 0, 2);
}