/*
TOT NU TOE GEDAAN:
1 menu opgebouwd (Handbediening,Puur Distilleren,Pot Distilleren,
Alleen Handbediening is nu in gebruik. de rest is nog leeg.
Na de vraag van Is de ketel gevuld word de SSR aangezet door pin 13 op hoog te zetten.
Dit is er voor dat het element niet verbrand als er geen vloeistof aanwezig is.
Begonnen met het menu op te bouwen Handbediend.
3 temp sensors toegevoegd
opmerking nog doen
eerst het scherm wissen dan naar volgend menu gaan.
Anders knippert het beeld zie is er een vloeistof in de ketel dat nog veranderen.
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6 // one wire op ingang 6
#include <Wire.h> // Library for I2C communication
#include <hd44780.h>
#include <hd44780ioClass/hd44780_I2Cexp.h> // include i/o class header
#include <AccelStepper.h>
#include <Adafruit_BMP085.h> // Adafruit BMP085 library
#define HALFSTEP 8
hd44780_I2Cexp lcd; // declare lcd object: auto locate & config display for hd44780 chip
OneWire oneWire(ONE_WIRE_BUS); // Pass address of our oneWire instance to Dallas Temperature.
DallasTemperature sensors(&oneWire); // dallas temp op onewire
DeviceAddress Probe01 = { 0x28, 0x78, 0x9D, 0xCA, 0x04, 0x00, 0x00, 0xC0 }; // Interne adres van ds18b20 probe 1
DeviceAddress Probe02 = { 0x28, 0x6C, 0x74, 0xCB, 0x04, 0x00, 0x00, 0xE1 }; // Interne adres van ds18b20 probe 2
DeviceAddress Probe03 = { 0x28, 0x2C, 0x09, 0x01, 0x05, 0x00, 0x00, 0x9C }; // Interne adres van ds18b20 probe 3
float Tin;
float Tkw;
float Temp;
float readPressure; //luchtdruk
float EtOH;
Adafruit_BMP085 bmp;
int Min=10;
int Sec=10;
long previousMillis = 0;
long interval = 999;
int Tekst;
int OPWARMEN;
int relay =10;
int ssr = 13; // Hier word ssr aangemaakt voor de solit state relay op digitale uitgang 9
int adc_key_val[5] ={50, 200, 400, 600, 800 }; // Ingangs waarden van mijn toetsen.
int mm = 1; // Zet menu mode op 1.
int NUM_KEYS = 5; // geeft volgens mij aan het aantal knoppen dat er gebruikt word voor input. >> Klopt, en is nodig voor het tellen straks
int adc_key_in;
int key=-1; // Vult alvast een toetswaarde in; -1 betekent nog geen toets gedrukt.
int KeyDet=-1; // Houd bij dat er een toets druk geregistreerd werd .
int oldkey=-1; // Houd bij welke toets het laatst gedrukt werd.
int i=0; // i word gebruikt als teller later, moet bij 0 beginnen inplaats van 1
int Pijl=126; // code voor de "pijl" symbool
int Item = 1; // Zet menu item op de eerste, zodat dit na een reset al goed staat
int x=0; // x coordinaat voor setCursor.
int y=0; // y coordinaat voor setCursor.
float nieuwWaarde; // Gebruiken float omdat we met variable willen werken met achter de punt bv: 78.50
float oudWaarde;
float TempV=78.5; // Hier word TempV niet alleen aangemaakt, maar ook gelijk met een beginwaarde gevuld
float TempE=99.00; // Hier word TempE niet alleen aangemaakt, maar ook gelijk met een beginwaarde gevuld
float TempT=00.30;
int Stijd=15;
int nieuwTijd;
int oudTijd;
const int Rechts=0;
const int Omlaag=2;
const int Omhoog=1;
const int Esc =3;
const int OK=4;
#include <AccelStepper.h>
#define HALFSTEP 8
// Motor pin definitions
#define motorPin1 8 // IN1 on the ULN2003 driver 1
#define motorPin2 9 // IN2 on the ULN2003 driver 1
#define motorPin3 10 // IN3 on the ULN2003 driver 1
#define motorPin4 11 // IN4 on the ULN2003 driver 1
AccelStepper stepper1(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4); // gebruik deze volgorde IN1-IN3-IN2-IN4 voor gebruik met AccelStepper met 28BYJ-48 stappenmotor
#define home_switch 4 // digital Pin 4 connected to Home Switch (MicroSwitch)
int move_finished=1; // Used to check if move is completed
long initial_homing=-1; // Used to Home Stepper at startup
//////////////////////////////////////////////////////////////// setup ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void setup()
{ // Begin setup // Begin setup deze doorloopt hij alleen bij opstarten of reset
Serial.begin(9600); // opent de seriele poort en zet data verkeer op 9600 bps.
sensors.begin();
sensors.setResolution(Probe01, 12); // Zet de resolutie op 12 bit (kan zijn 9 to 12 .. lager is sneller)
sensors.setResolution(Probe02, 12); // Zet de resolutie op 12 bit (kan zijn 9 to 12 .. lager is sneller)
sensors.setResolution(Probe03, 12); // Zet de resolutie op 12 bit (kan zijn 9 to 12 .. lager is sneller)
pinMode(ssr, OUTPUT); // Hier maakt hij een digitale uitgang van ssr digitale pen 13 dus
digitalWrite (ssr, LOW); // Hier maak ik digitaal pen 13 laag. zodat ssr relay uitstaat voor beveiliging verwarmingselement
pinMode(relay,OUTPUT);
lcd.begin(20, 4); // geeft aan dat het om een 20x4 lcd gaat.
lcd.init();
lcd.backlight();
lcd.clear(); // maakt het lcd scherm leeg.
lcd.setCursor(0,0); // zet de cursor neer op rij 1 op positie 1.
lcd.print(" WELKOM"); // zet tekst neer "WELKOM"
delay (1000); // wacht 1 sec.
lcd.setCursor(0,1); // Zet de cursor neer op rij 2 op positie 1.
lcd.print(" VEEL PLEZIER MET"); // Zet tekst neer "VEEL PLEZIER MET".
delay (1000); // wacht 1 sec.
lcd.setCursor(0,2); // Zet de cursor neer op rij 3 op positie 1.
lcd.print(" DISTILLEREN!"); // Zet tekst neer "DISTILLEREN!".
delay (1000); // Wacht 1 sec.
lcd.clear(); // Maakt het lcd scherm weer leeg.
lcd.setCursor(0,1); // Zet de cursor op rij 2 positie 1.
lcd.print(" AUTOMATIC STILL!"); // Zet tekst neer "AUTOMATIC STILL!".
lcd.setCursor(0,2); // Zet de cursor neer op rij 3 op positie 1.
lcd.print(" ROLF KOEDAM"); // Zet tekst neer "Rolf Koedam".
delay (2000); // Wacht 2 sec.
////////////////////////////////////////////////////////////// Homing ///////////////////////////////////////////////////////////////
pinMode(home_switch, INPUT_PULLUP);
// Set Max Speed and Acceleration of each Steppers at startup for homing
stepper1.setMaxSpeed(300.0); // Set Max Speed of Stepper (Slower to get better accuracy)
stepper1.setAcceleration(300.0); // Set Acceleration of Stepper
lcd.clear(); // Maakt het lcd scherm weer leeg.
lcd.setCursor(0,2); // Zet de cursor neer op rij 3 op positie 1.
lcd.print(" NAALDKRAAN HOMING."); // Zet tekst neer " NAALDKRAAN HOMING.".
while (digitalRead(home_switch)) { // Make the Stepper move CW until the switch is activated
stepper1.moveTo(initial_homing); // Set the position to move to
initial_homing++; // Decrease by 1 for next move if needed
stepper1.run(); // Start moving the stepper
delay(2);
}
stepper1.setCurrentPosition(0); // Set the current position as zero for now
stepper1.setMaxSpeed(100.0); // Set Max Speed of Stepper (Slower to get better accuracy)
stepper1.setAcceleration(100.0); // Set Acceleration of Stepper
initial_homing=1;
while (!digitalRead(home_switch)) { // Make the Stepper move CCW until the switch is deactivated
stepper1.moveTo(initial_homing);
stepper1.run();
initial_homing--;
delay(1);
}
stepper1.setCurrentPosition(0);
lcd.clear(); // Maakt het lcd scherm weer leeg.
lcd.setCursor(0,2); // Zet de cursor neer op rij 3 op positie 1.
lcd.print(" HOMING KOMPLEET!"); // Zet tekst neer " HOMING KOMPLEET!".
stepper1.setMaxSpeed(1000.0); // Set Max Speed of Stepper (Faster for regular movements)
stepper1.setAcceleration(1000.0); // Set Acceleration of Stepper
delay (2000); // Wacht 1 sec.
lcd.clear(); // Maakt het lcd scherm weer leeg.
lcd.setCursor(0,1); // Zet de cursor op rij 4 op positie 1.
lcd.print(" VERSIE. 25-07-21 ");
lcd.setCursor(0,2); // Zet de cursor op rij 4 op positie 1.
lcd.print(" Press<OK>");
} // Eind Setup // << Sluit de setup af.
////////////////////////////////////////////////////////////// LOOP //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() // Hier begint het hoofdprogramma te lopen.
{ // Begin void loop //
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
previousMillis = currentMillis;
key = (analogRead (0)); // lees analoge ingang op pin 0
if (key != oldkey) // Waneer een druktoets word gebruikt "!=" betekent niet gelijk
delay(50); // Wacht voor 0,05 sec
adc_key_in = analogRead(0); // Lees de waarde op de analoge ingang 0
key = get_key(adc_key_in); // Zet deze waarde in een toets om
if (key != oldkey) // Wanneer de toets anders is als de laatste keer (dit werd eerder ook al gecontroleerd, maar kan geen kwaad)
{ // 2
KeyDet = 1; // We hebben een geldige toetsdruk gezien
oldkey = key;
} // -- Sluit != oldkey --
else KeyDet = 0; // toetswaarde is dezelfde als de vorige keer, dus er is geen nieuwe toets gedrukt
if ((mm==1)&&(key ==OK)) // Waneer toets 4 "OK" gedetecteerd werd en menu is 1
{ // 3
KeyDet = 0;
mm = 2; // ga naar menu 2
lcd.clear(); // maak het lcd scherm leeg oftewel wis het vorige menu
} // Einde 3; Deze stond eerst verderop maar hier past ie beter
//////////////////////////////////////////////////////////////// MENU 2 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (mm ==2) // Zitten we in menu 2 ?
{ // 1 We gaan het menu afbeelden
lcd.clear(); // Wis het display zodat we klaar zijn voor het normale scherm
lcd.setCursor(0,0); // Ik ben er niet helemaal zeker van dat we die cursor echt al terug moeten zetten
lcd.print("1) -MENU-");
lcd.setCursor(1,1); // Tweede regel, tweede positie
lcd.print(" HANDBEDIENING ");
lcd.setCursor(0,3); // Derde regel, tweede positie
lcd.print(" <+/-> <OK>");
mm = 3; // Het menu is gemaakt, nu gaan we naar de volgende stap, namelijk bediening ervan
} // Sluit MM 2; het menu is gemaakt
if (mm ==3)
{
if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
KeyDet = 0; // We gaan nu een nieuwe toetsdruk verwerken, dus deze nieuwe toetsdruk kan nu als eerste gewist worden zodat we niets dubbel doen
if (key ==OK) { // Waneer toets (4) OK werd geduwd
Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
mm = 12; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
} // Sluit Instellingen OK
// Einde 3; Deze stond eerst verderop maar hier past ie beter
if (key ==Omlaag) // Wanneer Omlaag gedetecteerd werd ga dan naar menu 2
{ // 3.b
mm = 4; // zie hierboven: ga naar menu modus 8
} // Einde 3.b
} // -- Sluit KeyDet --
// -- Sluit mm 5 --
}
/////////////////////////////////////////////////////////////// MENU 3 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (mm ==4) // Zitten we in menu mode 8 ?
{ // We gaan het menu afbeelden
lcd.clear(); // Wis het display zodat we klaar zijn voor het normale scherm
lcd.setCursor(0,0); // Ik ben er niet helemaal zeker van dat we die cursor echt al terug moeten zetten
lcd.print("2) -MENU-");
lcd.setCursor(1,1); // Tweede regel, tweede positie
lcd.print(" PUUR DISTILLEREN");
lcd.setCursor(0,3); // Derde regel, tweede positie
lcd.print(" <+/-> <OK>");
mm = 5; // Het menu is gemaakt, nu gaan we naar de volgende stap, namelijk bediening ervan
} // Sluit MM 8; het menu is gemaakt
if (mm ==5)
{
if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
KeyDet = 0; // We gaan nu een nieuwe toetsdruk verwerken, dus deze nieuwe toetsdruk kan nu als eerste gewist worden zodat we niets dubbel doen
// if (key ==OK) { // Waneer toets (4) OK werd geduwd
// Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
// mm = 30; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
//key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
//} // Sluit Instellingen OK
if (key ==Omlaag) // Wanneer Omlaag gedetecteerd werd ga dan naar menu 10
{ // 7.b
mm = 6; // zie hierboven: ga naar menu modus 12
} // Einde 7.b
if (key ==Omhoog) // Waneer toets 1 "omhoog" gedetecteerd werd ga dan naar menu 4
{ // 8
mm = 2; // zie hierboven: ga naar menu modus 4
lcd.clear(); // maak het lcd scherm leeg oftewel wis het vorige menu
} // Einde 8; Deze stond eerst verderop maar hier past ie beter
} // -- Sluit KeyDet --
} // -- Sluit mm 9 --
/////////////////////////////////////////////////////////////// MENU 4 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (mm ==6) // Zitten we in menu mode 8 ?
{ // We gaan het menu afbeelden
lcd.clear(); // Wis het display zodat we klaar zijn voor het normale scherm
lcd.setCursor(0,0); // Ik ben er niet helemaal zeker van dat we die cursor echt al terug moeten zetten
lcd.print("3) -MENU-");
lcd.setCursor(1,1); // Tweede regel, tweede positie
lcd.print(" POT DISTILLEREN");
lcd.setCursor(0,3); // Derde regel, tweede positie
lcd.print(" <+/-> <OK>");
mm = 7; // Het menu is gemaakt, nu gaan we naar de volgende stap, namelijk bediening ervan
} // Sluit MM 8; het menu is gemaakt
if (mm ==7)
{
if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
KeyDet = 0; // We gaan nu een nieuwe toetsdruk verwerken, dus deze nieuwe toetsdruk kan nu als eerste gewist worden zodat we niets dubbel doen if (key ==OK) { // Waneer toets (4) OK werd geduwd
//Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
//mm = 40; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
// key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
// } // Sluit Instellingen OK
// Einde 7.b
if (key ==Omhoog) // Waneer toets 1 "omhoog" gedetecteerd werd ga dan naar menu 4
{ // 8
mm = 4; // zie hierboven: ga naar menu modus 4
lcd.clear(); // maak het lcd scherm leeg oftewel wis het vorige menu
// Einde 8; Deze stond eerst verderop maar hier past ie beter
} // -- Sluit KeyDet --
}
}
//////////////////////////////////////////////////////////////// MENU 4 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (mm ==12) // Zitten we in menu mode 4 ?
{ // We gaan het menu afbeelden
lcd.clear(); // Wis het display zodat we klaar zijn voor het normale scherm
lcd.setCursor(0,0); // Ik ben er niet helemaal zeker van dat we die cursor echt al terug moeten zetten
lcd.print(" !! LET OP !! ");
lcd.setCursor(1,1); // Tweede regel, tweede positie
lcd.print("IS DE KETEL GEVULD?");
lcd.setCursor(0,3); // Derde regel, tweede positie
lcd.print("<Esc> <OK>");
mm = 13; // Het menu is gemaakt, nu gaan we naar de volgende stap, namelijk bediening ervan
} // Sluit MM 4; het menu is gemaakt
if (mm ==13)
{
if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
KeyDet = 0; // We gaan nu een nieuwe toetsdruk verwerken, dus deze nieuwe toetsdruk kan nu als eerste gewist worden zodat we niets dubbel doen
if (key ==OK) { // Waneer toets (4) OK werd geduwd
Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
mm = 15; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
lcd.clear();
} // Sluit Instellingen OK
if (key ==Esc) // Waneer toets 3 "Esc" gedetecteerd werd ga dan naar menu 2
{ // 3
mm = 2; // zie hierboven: ga naar menu modus 2
// maak het lcd scherm leeg oftewel wis het vorige menu
} // Einde 3; Deze stond eerst verderop maar hier past ie beter
// Einde 3.b
} // -- Sluit KeyDet --
} // -- Sluit mm 5 --
//////////////////////////////////////////////////////////////// MENU 4 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
if (mm ==15) // Zitten we in menu mode 4 ?
{ // We gaan het menu afbeelden
// Zend een commando om de temperatuuren te krijgen
digitalWrite (ssr, HIGH);
// EtOH = (bmp.readPressure()/ 1013 * 78.1 / 100);
sensors.requestTemperatures();
Tin = sensors.getTempC(Probe01);
Tkw = sensors.getTempC(Probe02);
Temp = sensors.getTempC(Probe03);
// lcd.clear(); // Wis het display zodat we klaar zijn voor het normale scherm
lcd.setCursor(0,0); // Tweede regel, tweede positie
lcd.print("Temp.Uit:");
lcd.print(Temp); // Zet de variable Temp neer
lcd.setCursor(0,1); // Derde regel, tweede positie
lcd.print("Temp.in: ");
lcd.print(Tin); // Zet de variable Tin neer
lcd.setCursor(0,2); // Derde regel, tweede positie
lcd.print("Temp.Kw: ");
lcd.print(Tkw); // Zet de variable Tkw neer
lcd.setCursor(0,3); // Ik ben er niet helemaal zeker van dat we die cursor echt al terug moeten zetten
lcd.print("OPENING: ");
lcd.setCursor(10,3); // Zet de cursor op de vierde regel op de 12 positie.
lcd.print("T-az: "); // Zet de tekst neer: "T-az:"
// lcd.print( EtOH,2);
// mm = 16; // Het menu is gemaakt, nu gaan we naar de volgende stap, namelijk bediening ervan
} // Sluit MM 4; het menu is gemaakt
// if (mm ==16)
// {
// if (KeyDet){ // Het volgende word uitgevoerd omdat we een nieuwe toets hebben gezien, anders overgeslagen
// KeyDet = 0; // We gaan nu een nieuwe toetsdruk verwerken, dus deze nieuwe toetsdruk kan nu als eerste gewist worden zodat we niets dubbel doen
// if (key ==OK) { // Waneer toets (4) OK werd geduwd
// Item = 1; // Zet Item terug, anders zouden we per ongeluk het menu de voelgnde keer op de verkeerde plaats binnenkomen en er gelijk weer uit raken voor we er goed en wel in zijn.
// mm = 15; // Zet menu mode terug zodat we het volgende "rondje" het menu hebben verlaten
// key = -1; // Wis key waarde ( -1 is geen key geregistreerd) zodat ie niet de volgende ronde nog blijft hangen.
// } // Sluit Instellingen OK
//if (key ==Esc) // Waneer toets 3 "Esc" gedetecteerd werd ga dan naar menu 2
// { // 3
// mm = 2; // zie hierboven: ga naar menu modus 2
// } // -- Sluit KeyDet --
// -- Sluit mm 5 --
}
//////////////////////////////////////////////////////////////// ZET SPANNING OM IN TOETS NUMMER /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int get_key(unsigned int input)
{ // 1
int k;
for (k = 0; k < NUM_KEYS; k++) // We gaan tellen
{ // 2
if (input < adc_key_val[k]) // Zou meer betrouwbaar moeten zijn omdat het naar bereiken kijkt in plaats van naar vaste waardes.
{ // 3
return k; // Zorgt er voor dat de for loop beëdigd word
} // sluit 3
} // sluit 2
if (k >= NUM_KEYS)k = -1; // Er is geen geldige toets gedrukt
return k; // Dus beëindig de loop en wacht een volgdende toetsdruk af
} // sluit 1
////////////////////////////////////////////////////////////////// Weergave van de temperatuur sensoren ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////// EINDE PROGRAMMA //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Nu het volgende hierbij heb ik jullie hulp nodig.
op de foto zie je het menu zoals die er staat tijdens het distilleren op handbediening.
ik wil nu met de pijl omhoog en pijl omlaag de stappenmotor bedienen.
ik begin dus met 0 = naaldkraan dicht en met pijltje omhoog 2 dan 3 enz tot 20 en met het pijltje omlaag weer terug bv 20 dan 19 enz.
Ik zou die 20 stappen zelf willen invullen met steps.
bv 1 is 10 steps open 2 is 30 steps open 3 is 35 open enz.
Waarom niet in gelijke stappen zul je zeggen ?
omdat bij het stoken vaak met druppels word afgenomen dus ik wil eerst kleine stappen nemen en hoe hoger dan iets grotere stappen.
Haha moeilijk uit te leggen. hoop dat jullie het begrijpen.
dus met de function map zal dit niet lukken denk ik .
ook zou ik dan achter opening aan willen geven welke opening dan is geselecteerd.
ik kan natuurlijk elke keer een menu opbouwen.
maar dan moet ik er 20 maken.
volgens mij moet dit makkelijker kunnen.
De knoppen werken al zoals het moet in het programma
zoals je kunt zien in de code.
Ik ga nu aan het lezen en proberen.
Wacht met ongeduld op een idee van jullie haha.