Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
B
brew
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
João Lino
brew
Commits
bd440b67
Commit
bd440b67
authored
Nov 22, 2014
by
service-config
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Mixer
parent
919194c6
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
347 additions
and
204 deletions
+347
-204
brew.ino
brew.ino
+347
-204
No files found.
brew.ino
View file @
bd440b67
...
...
@@ -7,22 +7,30 @@
//#define DHTPIN 2 // What pin we're connected to
//#define DHTTYPE DHT11 // DHT 11
#define ponto1 A4//
#define ponto2 A5//
#define R1 462.0
#define R2 460.0
#define R3 460.0
#define calibragem 3.8515352672
//#define ponto2 A5//
//#define R1 99.45
//#define R2 100.2
//#define R3 100.05
//#define calibragem 12.709066573
float
amostra1
;
//
float
amostra2
;
//
float
diferenca
;
float
temperatura
,
temperatura1
;
//
float
tabela
[]
=
{
100.00
,
100.39
,
100.78
,
101.17
,
101.56
,
101.95
,
102.34
,
102.73
,
103.12
,
103.51
,
103.90
,
104.29
,
104.68
,
105.07
,
105.46
,
105.85
,
106.24
,
106.63
,
107.02
,
107.40
,
107.79
,
108.18
,
108.57
,
108.96
,
109.35
,
109.73
,
110.12
,
110.51
,
110.90
,
111.29
,
111.67
,
112.06
,
112.45
,
112.83
,
113.22
,
113.61
,
114.00
,
114.38
,
114.77
,
115.15
,
115.54
,
115.93
,
116.31
,
116.70
,
117.08
,
117.47
,
117.86
,
118.24
,
118.63
,
119.01
,
119.40
,
119.78
,
120.17
,
120.55
,
120.94
,
121.32
,
121.71
,
122.09
,
122.47
,
122.86
,
123.24
,
123.63
,
124.01
,
124.39
,
124.78
,
125.16
,
125.54
,
125.93
,
126.31
,
126.69
,
127.08
,
127.46
,
127.84
,
128.22
,
128.61
,
128.99
,
129.37
,
129.75
,
130.13
,
130.52
,
130.90
,
131.28
,
131.66
,
132.04
,
132.42
,
132.80
,
133.18
,
133.57
,
133.95
,
134.33
,
134.71
,
135.09
,
135.47
,
135.85
,
136.23
,
136.61
,
136.99
,
137.37
,
137.75
,
138.13
,
138.51
,
138.88
,
139.26
,
139.64
,
140.02
,
140.40
,
140.78
,
141.16
,
141.54
,
141.91
,
142.29
,
142.67
,
143.05
,
143.43
,
143.80
,
144.18
,
144.56
,
144.94
,
145.31
,
145.69
,
146.07
,
146.44
,
146.82
,
147.20
,
147.57
,
147.95
,
148.33
,
148.70
,
149.08
,
149.46
,
149.83
,
150.21
,
150.58
,
150.96
,
151.33
,
151.71
,
152.08
,
152.46
,
152.83
,
153.21
,
153.58
,
153.96
,
154.33
,
154.71
,
155.08
,
155.46
,
155.83
,
156.20
,
156.58
,
156.95
,
157.33
,
157.70
,
158.07
,
158.45
,
158.82
,
159.19
,
159.56
,
159.94
,
160.31
,
160.68
,
150.00
,
160.00
,
161.05
,
161.43
,
161.80
,
162.17
,
162.54
,
162.91
,
163.29
,
163.66
,
164.03
,
164.40
,
164.77
,
165.14
,
165.51
,
165.89
,
166.26
,
166.63
,
167.00
,
167.37
,
167.74
,
168.11
,
168.48
,
168.85
,
169.22
,
169.59
,
169.96
,
170.33
,
170.70
,
171.07
,
171.43
,
171.80
,
172.17
,
172.54
,
172.91
,
173.28
,
173.65
,
174.02
,
174.38
,
174.75
,
175.12
,
175.49
,
175.86
,
176.22
,
176.59
,
176.96
,
177.33
,
177.69
,
178.06
,
178.43
,
178.79
,
179.16
};
//float amostras[] = {630.00,630.00,630.00}; //,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00,630.00};
float
Va
;
float
Rx
;
/*
float amostra2;//
float diferenca;
float tensaoPorAmostra;
float Vg;
float Vs;
float a;
float Rx;
*/
// ++++++++++++++++++++++++ Library - DHT ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Library - LiquidCrystal_I2C ++++++++++++++++++++++++
#include <Wire.h>
...
...
@@ -44,6 +52,15 @@ float Rx;
#include <PID_v1.h>
#define HEATING_ELEMENT 24
// ++++++++++++++++++++++++ Heating Element Relay ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Temperature ++++++++++++++++++++++++
#define TEMPERATURE_MAX_POSITION 120
// ++++++++++++++++++++++++ Temperature ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Mixer ++++++++++++++++++++++++
#define MIXER_PIN 12
#define MIXER_MAX_POSITION 255
const
int
mixerPin
=
12
;
const
int
mixerMaxSpeed
=
255
;
// ++++++++++++++++++++++++ Mixer ++++++++++++++++++++++++
// ++++++++++++++++++++++++ State Machine ++++++++++++++++++++++++
#define SETTING_WELCOME_TIMEOUT 2000
#define MENU_MAX_DEPTH 10
...
...
@@ -61,8 +78,8 @@ int n = 1;
LiquidCrystal_I2C
lcd
(
LCD_I2C_ADDR
,
En_pin
,
Rw_pin
,
Rs_pin
,
D4_pin
,
D5_pin
,
D6_pin
,
D7_pin
);
// ++++++++++++++++++++++++ Library - LiquidCrystal_I2C ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Rotary Encoder ++++++++++++++++++++++++
volatile
int
v
irtualPosition
=
0
;
volatile
int
m
axPosition
=
120
;
volatile
int
rotaryEncoderV
irtualPosition
=
0
;
//volatile int rotaryEncoderM
axPosition = 120;
volatile
int
menuSize
=
2
;
const
int
PinCLK
=
3
;
// Used for generating interrupts using CLK signal
const
int
PinDT
=
22
;
// Used for reading DT signal
...
...
@@ -76,12 +93,16 @@ double Setpoint, Input, Output;
float
Kp
=
200
;
float
Ki
=
50
;
float
Kd
=
0
;
PID
myPID
(
&
Input
,
&
Output
,
&
Setpoint
,
Kp
,
Ki
,
Kd
,
DIRECT
);
//
PID myPID(&Input, &Output, &Setpoint,Kp,Ki,Kd, DIRECT);
//PID myPID(&Input, &Output, &Setpoint,1000,50,0, DIRECT);
PID
myPID
(
&
Input
,
&
Output
,
&
Setpoint
,
200
,
50
,
0
,
DIRECT
);
int
WindowSize
=
5
000
;
int
WindowSize
=
1
000
;
unsigned
long
windowStartTime
;
// ++++++++++++++++++++++++ Heating Element Relay ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Mixer ++++++++++++++++++++++++
//const int mixerSpeed = 130;
// ++++++++++++++++++++++++ Mixer ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Error ++++++++++++++++++++++++
enum
sys_error
{
no_error
,
...
...
@@ -92,6 +113,7 @@ enum sys_error {
sys_error
error
=
no_error
;
// ++++++++++++++++++++++++ Error ++++++++++++++++++++++++
// ++++++++++++++++++++++++ State Machine ++++++++++++++++++++++++
// global
enum
state_machine
{
state_welcome
,
...
...
@@ -99,9 +121,11 @@ enum state_machine {
state_manual_time
,
state_manual_temperature
,
state_manual_mode
,
state_manual_mixer
,
state_error
};
state_machine
state
=
state_welcome
;
// menu
enum
main_menu_list
{
main_manual
,
...
...
@@ -120,16 +144,16 @@ enum auto_menu_list {
auto_back
};
int
menu_position
[
MENU_MAX_DEPTH
]
=
{
MENU_INIT_VALUES
};
// cooking
//int cookTime = 600;
//int cookTemperature = 100;
int
cookTime
=
3600
;
int
cookTemperature
=
70
;
enum
cook_mode_list
{
quick_start
,
start_at_temperature
};
int
cookTime
=
3600
;
int
cookTemperature
=
36
;
cook_mode_list
cookMode
=
quick_start
;
int
cookMixerSpeed
=
130
;
// ++++++++++++++++++++++++ State Machine ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Global Variables ++++++++++++++++++++++++
//float currentTemperatureCelsius;
...
...
@@ -146,76 +170,109 @@ void isr () { // Interrupt service routine is executed when
// If interrupts come faster than 5ms, assume it's a bounce and ignore
if
((
interruptTime
-
lastInterruptTime
)
>
5
)
{
switch
(
state
)
{
// Input of rotay encoder controling menus
case
state_manual_mode
:
case
state_menu
:
{
if
(
!
digitalRead
(
PinDT
))
{
virtualPosition
=
(
v
irtualPosition
+
1
);
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
+
1
);
}
else
{
virtualPosition
=
v
irtualPosition
-
1
;
rotaryEncoderVirtualPosition
=
rotaryEncoderV
irtualPosition
-
1
;
}
if
(
v
irtualPosition
>=
menuSize
)
{
v
irtualPosition
=
0
;
if
(
rotaryEncoderV
irtualPosition
>=
menuSize
)
{
rotaryEncoderV
irtualPosition
=
0
;
}
if
(
v
irtualPosition
<
0
)
{
v
irtualPosition
=
menuSize
-
1
;
if
(
rotaryEncoderV
irtualPosition
<
0
)
{
rotaryEncoderV
irtualPosition
=
menuSize
-
1
;
}
break
;
}
// Input of rotay encoder controling time variables
case
state_manual_time
:
{
if
(
!
digitalRead
(
PinDT
))
{
if
(
v
irtualPosition
>=
60
)
{
virtualPosition
=
(
v
irtualPosition
+
30
);
if
(
rotaryEncoderV
irtualPosition
>=
60
)
{
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
+
30
);
}
else
{
virtualPosition
=
(
v
irtualPosition
+
1
);
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
+
1
);
}
}
else
{
if
(
v
irtualPosition
==
0
)
{
virtualPosition
=
(
v
irtualPosition
+
60
);
if
(
rotaryEncoderV
irtualPosition
==
0
)
{
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
+
60
);
}
else
{
if
(
v
irtualPosition
>=
90
)
{
virtualPosition
=
(
v
irtualPosition
-
30
);
if
(
rotaryEncoderV
irtualPosition
>=
90
)
{
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
-
30
);
}
else
{
virtualPosition
=
v
irtualPosition
-
1
;
rotaryEncoderVirtualPosition
=
rotaryEncoderV
irtualPosition
-
1
;
}
}
}
if
(
v
irtualPosition
>
7200
)
{
v
irtualPosition
=
7200
;
if
(
rotaryEncoderV
irtualPosition
>
7200
)
{
rotaryEncoderV
irtualPosition
=
7200
;
}
if
(
v
irtualPosition
<
0
)
{
v
irtualPosition
=
0
;
if
(
rotaryEncoderV
irtualPosition
<
0
)
{
rotaryEncoderV
irtualPosition
=
0
;
}
break
;
}
// Input of rotay encoder controling integer variables within a range between 0 and rotaryEncoderMaxPosition
case
state_manual_mixer
:
case
state_manual_temperature
:
{
if
(
!
digitalRead
(
PinDT
))
{
if
((
interruptTime
-
lastInterruptTime
)
<
10
)
{
virtualPosition
=
(
virtualPosition
+
5
);
rotaryEncoderVirtualPosition
=
(
rotaryEncoderVirtualPosition
+
5
);
}
else
{
rotaryEncoderVirtualPosition
=
(
rotaryEncoderVirtualPosition
+
1
);
}
}
else
{
if
((
interruptTime
-
lastInterruptTime
)
<
10
)
{
rotaryEncoderVirtualPosition
=
(
rotaryEncoderVirtualPosition
-
5
);
}
else
{
rotaryEncoderVirtualPosition
=
(
rotaryEncoderVirtualPosition
-
1
);
}
}
if
(
rotaryEncoderVirtualPosition
>
rotaryEncoderMaxPosition
)
{
rotaryEncoderVirtualPosition
=
rotaryEncoderMaxPosition
;
}
if
(
rotaryEncoderVirtualPosition
<
0
)
{
rotaryEncoderVirtualPosition
=
0
;
}
break
;
}
case
state_manual_mixer
:
{
if
(
!
digitalRead
(
PinDT
))
{
if
((
interruptTime
-
lastInterruptTime
)
<
10
)
{
rotaryEncoderVirtualPosition
=
(
rotaryEncoderVirtualPosition
+
5
);
}
else
{
virtualPosition
=
(
v
irtualPosition
+
1
);
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
+
1
);
}
}
else
{
if
((
interruptTime
-
lastInterruptTime
)
<
10
)
{
virtualPosition
=
(
v
irtualPosition
-
5
);
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
-
5
);
}
else
{
virtualPosition
=
(
v
irtualPosition
-
1
);
rotaryEncoderVirtualPosition
=
(
rotaryEncoderV
irtualPosition
-
1
);
}
}
if
(
virtualPosition
>
maxPosition
)
{
virtualPosition
=
maxPosition
;
if
(
rotaryEncoderVirtualPosition
>
mixerMaxSpeed
)
{
rotaryEncoderVirtualPosition
=
mixerMaxSpeed
;
}
if
(
v
irtualPosition
<
0
)
{
v
irtualPosition
=
0
;
if
(
rotaryEncoderV
irtualPosition
<
0
)
{
rotaryEncoderV
irtualPosition
=
0
;
}
break
;
...
...
@@ -262,6 +319,13 @@ void setup() {
//turn the PID on
myPID
.
SetMode
(
AUTOMATIC
);
// ++++++++++++++++++++++++ Heating Element Relay ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Mixer ++++++++++++++++++++++++
pinMode
(
mixerPin
,
OUTPUT
);
analogWrite
(
mixerPin
,
mixerSpeed
);
// ++++++++++++++++++++++++ Mixer ++++++++++++++++++++++++
// ++++++++++++++++++++++++ Temperature Sensor PT100 ++++++++++++++++++++++++
analogReference
(
EXTERNAL
);
// ++++++++++++++++++++++++ Temperature Sensor PT100 ++++++++++++++++++++++++
Serial
.
begin
(
9600
);
Serial
.
println
(
"Let's start Brewing!"
);
}
...
...
@@ -279,7 +343,7 @@ void loop() {
break
;
}
case
state_manual_time
:
{
/*
case state_manual_time: {
//runManualTime();
break;
...
...
@@ -289,6 +353,11 @@ void loop() {
break;
}
case state_manual_mixer: {
//runManualTemp();
break;
}*/
case
state_error
:
{
runError
();
...
...
@@ -312,8 +381,6 @@ void runWelcome() {
delay
(
SETTING_WELCOME_TIMEOUT
);
//state = state_manual_temp;
//state = state_manual_time;
state
=
state_menu
;
}
...
...
@@ -328,7 +395,7 @@ void runMenu() {
cookTemperature
=
getTemperature
(
cookTemperature
);
menu_position
[
1
]
=
-
1
;
v
irtualPosition
=
manual_temperature
;
rotaryEncoderV
irtualPosition
=
manual_temperature
;
break
;
}
...
...
@@ -337,7 +404,7 @@ void runMenu() {
cookTime
=
getTimer
(
cookTime
);
menu_position
[
1
]
=
-
1
;
v
irtualPosition
=
manual_time
;
rotaryEncoderV
irtualPosition
=
manual_time
;
break
;
}
...
...
@@ -360,7 +427,16 @@ void runMenu() {
}
menu_position
[
1
]
=
-
1
;
virtualPosition
=
manual_mode
;
rotaryEncoderVirtualPosition
=
manual_mode
;
break
;
}
case
manual_mixer
:
{
// do work
cookMixerSpeed
=
getMixerSpeed
(
cookMixerSpeed
);
menu_position
[
1
]
=
-
1
;
rotaryEncoderVirtualPosition
=
manual_time
;
break
;
}
...
...
@@ -369,7 +445,7 @@ void runMenu() {
runStart
();
menu_position
[
1
]
=
-
1
;
v
irtualPosition
=
manual_start
;
rotaryEncoderV
irtualPosition
=
manual_start
;
break
;
}
...
...
@@ -377,14 +453,13 @@ void runMenu() {
menu_position
[
0
]
=
-
1
;
menu_position
[
1
]
=
-
1
;
v
irtualPosition
=
manual_back
;
rotaryEncoderV
irtualPosition
=
manual_back
;
break
;
}
default:
{
// reset menu variables
//virtualPosition = 0;
menuSize
=
5
;
menuSize
=
6
;
// display menu
lcd
.
clear
();
...
...
@@ -392,7 +467,7 @@ void runMenu() {
lcd
.
print
(
"Manual Menu"
);
while
(
true
)
{
switch
(
v
irtualPosition
)
{
switch
(
rotaryEncoderV
irtualPosition
)
{
case
manual_temperature
:
{
lcd
.
setCursor
(
0
,
1
);
// go to start of 2nd line
lcd
.
print
(
"-> Temperature "
);
...
...
@@ -411,6 +486,12 @@ void runMenu() {
delay
(
100
);
break
;
}
case
manual_mixer
:
{
lcd
.
setCursor
(
0
,
1
);
// go to start of 2nd line
lcd
.
print
(
"-> Mixer Speed "
);
delay
(
100
);
break
;
}
case
manual_start
:
{
lcd
.
setCursor
(
0
,
1
);
// go to start of 2nd line
lcd
.
print
(
"-> Start "
);
...
...
@@ -426,12 +507,12 @@ void runMenu() {
default:
{
//lcd.setCursor (0,1); // go to start of 2nd line
//lcd.print("*** Error ***");
v
irtualPosition
=
0
;
rotaryEncoderV
irtualPosition
=
0
;
}
}
if
(
!
(
digitalRead
(
PinSW
)))
{
// check if pushbutton is pressed
menu_position
[
1
]
=
v
irtualPosition
;
menu_position
[
1
]
=
rotaryEncoderV
irtualPosition
;
while
(
!
digitalRead
(
PinSW
))
{}
// wait til switch is released
delay
(
10
);
// debounce
break
;
...
...
@@ -447,7 +528,7 @@ void runMenu() {
// do work
menu_position
[
1
]
=
-
1
;
v
irtualPosition
=
auto_recipe
;
rotaryEncoderV
irtualPosition
=
auto_recipe
;
break
;
}
...
...
@@ -455,7 +536,7 @@ void runMenu() {
// do work
menu_position
[
1
]
=
-
1
;
v
irtualPosition
=
auto_start
;
rotaryEncoderV
irtualPosition
=
auto_start
;
break
;
}
...
...
@@ -465,13 +546,13 @@ void runMenu() {
menu_position
[
1
]
=
-
1
;
// set menu position
v
irtualPosition
=
main_auto
;
rotaryEncoderV
irtualPosition
=
main_auto
;
break
;
}
default:
{
// reset menu variables
//
v
irtualPosition = 0;
//
rotaryEncoderV
irtualPosition = 0;
menuSize
=
3
;
// display menu
...
...
@@ -480,7 +561,7 @@ void runMenu() {
lcd
.
print
(
"Automatic Menu"
);
while
(
true
)
{
switch
(
v
irtualPosition
)
{
switch
(
rotaryEncoderV
irtualPosition
)
{
case
auto_recipe
:
{
lcd
.
setCursor
(
0
,
1
);
// go to start of 2nd line
lcd
.
print
(
"-> Recipe "
);
...
...
@@ -502,12 +583,12 @@ void runMenu() {
default:
{
//lcd.setCursor (0,1); // go to start of 2nd line
//lcd.print("*** Error ***");
v
irtualPosition
=
0
;
rotaryEncoderV
irtualPosition
=
0
;
}
}
if
(
!
(
digitalRead
(
PinSW
)))
{
// check if pushbutton is pressed
menu_position
[
1
]
=
v
irtualPosition
;
menu_position
[
1
]
=
rotaryEncoderV
irtualPosition
;
while
(
!
digitalRead
(
PinSW
))
{}
// wait til switch is released
delay
(
10
);
// debounce
break
;
...
...
@@ -519,7 +600,7 @@ void runMenu() {
}
default:
{
// reset menu variables
//
v
irtualPosition = 0;
//
rotaryEncoderV
irtualPosition = 0;
menuSize
=
2
;
// display menu
...
...
@@ -528,7 +609,7 @@ void runMenu() {
lcd
.
print
(
"Main Menu"
);
while
(
true
)
{
switch
(
v
irtualPosition
)
{
switch
(
rotaryEncoderV
irtualPosition
)
{
case
main_manual
:
{
lcd
.
setCursor
(
0
,
1
);
// go to start of 2nd line
lcd
.
print
(
"-> Manual "
);
...
...
@@ -544,12 +625,12 @@ void runMenu() {
default:
{
//lcd.setCursor (0,1); // go to start of 2nd line
//lcd.print("*** Error ***");
v
irtualPosition
=
0
;
rotaryEncoderV
irtualPosition
=
0
;
}
}
if
(
!
(
digitalRead
(
PinSW
)))
{
// check if pushbutton is pressed
menu_position
[
0
]
=
v
irtualPosition
;
menu_position
[
0
]
=
rotaryEncoderV
irtualPosition
;
while
(
!
digitalRead
(
PinSW
))
{}
// wait til switch is released
delay
(
10
);
// debounce
break
;
...
...
@@ -564,10 +645,10 @@ int getTimer(int init) {
// set operation state
state
=
state_manual_time
;
v
irtualPosition
=
init
;
rotaryEncoderV
irtualPosition
=
init
;
// initialize variables
int
lastCount
=
0
;
int
rotaryEncoderPreviousPosition
=
0
;
int
minutes
=
0
;
int
seconds
=
0
;
...
...
@@ -587,10 +668,10 @@ int getTimer(int init) {
}
// display current timer
if
(
virtualPosition
!=
lastCount
)
{
lastCount
=
v
irtualPosition
;
minutes
=
v
irtualPosition
/
60
;
seconds
=
v
irtualPosition
-
minutes
*
60
;
if
(
rotaryEncoderVirtualPosition
!=
rotaryEncoderPreviousPosition
)
{
rotaryEncoderPreviousPosition
=
rotaryEncoderV
irtualPosition
;
minutes
=
rotaryEncoderV
irtualPosition
/
60
;
seconds
=
rotaryEncoderV
irtualPosition
-
minutes
*
60
;
lcd
.
setCursor
(
0
,
LCD_Y
-
1
);
lcd
.
print
(
" "
);
...
...
@@ -605,7 +686,7 @@ int getTimer(int init) {
}
state
=
initialState
;
return
v
irtualPosition
;
return
rotaryEncoderV
irtualPosition
;
}
int
getTemperature
(
int
init
)
{
...
...
@@ -613,10 +694,10 @@ int getTemperature(int init) {
// set operation state
state
=
state_manual_temperature
;
v
irtualPosition
=
init
;
rotaryEncoderV
irtualPosition
=
init
;
// initialize variables
int
lastCount
=
0
;
int
rotaryEncoderPreviousPosition
=
0
;
// Setup Screen
lcd
.
clear
();
...
...
@@ -625,6 +706,8 @@ int getTemperature(int init) {
lcd
.
setCursor
(
0
,
LCD_Y
-
1
);
lcd
.
print
(
" 0 *C"
);
rotaryEncoderMaxPosition
=
TEMPERATURE_MAX_POSITION
;
while
(
true
)
{
// Check for timer set
if
(
!
(
digitalRead
(
PinSW
)))
{
// check if pushbutton is pressed
...
...
@@ -634,27 +717,27 @@ int getTemperature(int init) {
}
// display current timer
if
(
virtualPosition
!=
lastCount
)
{
lastCount
=
v
irtualPosition
;
if
(
rotaryEncoderVirtualPosition
!=
rotaryEncoderPreviousPosition
)
{
rotaryEncoderPreviousPosition
=
rotaryEncoderV
irtualPosition
;
lcd
.
setCursor
(
0
,
LCD_Y
-
1
);
lcd
.
print
(
" "
);
if
(
v
irtualPosition
<
10
)
{
if
(
rotaryEncoderV
irtualPosition
<
10
)
{
lcd
.
print
(
" "
);
}
else
{
if
(
v
irtualPosition
<
100
)
{
if
(
rotaryEncoderV
irtualPosition
<
100
)
{
lcd
.
print
(
" "
);
}
}
lcd
.
print
(
v
irtualPosition
);
lcd
.
print
(
rotaryEncoderV
irtualPosition
);
lcd
.
print
(
" *C"
);
lcd
.
println
(
" "
);
}
}
state
=
initialState
;
return
v
irtualPosition
;
return
rotaryEncoderV
irtualPosition
;
}
int
getMode
()
{
...
...
@@ -664,10 +747,10 @@ int getMode() {
// set operation state
state
=
state_manual_mode
;
menuSize
=
2
;
v
irtualPosition
=
cookMode
;
rotaryEncoderV
irtualPosition
=
cookMode
;
// initialize variables
int
lastCount
=
0
;
int
rotaryEncoderPreviousPosition
=
0
;
// Setup Screen
lcd
.
clear
();
...
...
@@ -685,12 +768,12 @@ int getMode() {
}
// display current timer
if
(
virtualPosition
!=
lastCount
)
{
lastCount
=
v
irtualPosition
;
if
(
rotaryEncoderVirtualPosition
!=
rotaryEncoderPreviousPosition
)
{
rotaryEncoderPreviousPosition
=
rotaryEncoderV
irtualPosition
;
lcd
.
setCursor
(
0
,
LCD_Y
-
1
);
switch
(
v
irtualPosition
)
{
switch
(
rotaryEncoderV
irtualPosition
)
{
case
quick_start
:
{
lcd
.
print
(
" Quick Start "
);
...
...
@@ -711,28 +794,87 @@ int getMode() {
state
=
initialState
;
menuSize
=
initialMenuSize
;
return
virtualPosition
;
return
rotaryEncoderVirtualPosition
;
}
int
getMixerSpeed
(
int
init
)
{
state_machine
initialState
=
state
;
// set operation state
state
=
state_manual_mixer
;
rotaryEncoderVirtualPosition
=
init
;
// initialize variables
int
rotaryEncoderPreviousPosition
=
0
;
int
mixerSpeed
=
0
;
// Setup Screen
lcd
.
clear
();
lcd
.
home
();
lcd
.
print
(
"Set Mixer Speed"
);
lcd
.
setCursor
(
0
,
LCD_Y
-
1
);
lcd
.
print
(
" 000"
);
rotaryEncoderMaxPosition
=
MIXER_MAX_POSITION
;
while
(
true
)
{
// Check for timer set
if
(
!
(
digitalRead
(
PinSW
)))
{
// check if pushbutton is pressed
while
(
!
digitalRead
(
PinSW
))
{}
// wait til switch is released
delay
(
10
);
// debounce
break
;
}
// display current timer
if
(
rotaryEncoderVirtualPosition
!=
rotaryEncoderPreviousPosition
)
{
rotaryEncoderPreviousPosition
=
rotaryEncoderVirtualPosition
;
lcd
.
setCursor
(
0
,
LCD_Y
-
1
);
lcd
.
print
(
" "
);
//lcd.print(minutes);
//lcd.print(":");
if
(
rotaryEncoderVirtualPosition
<
100
)
{
lcd
.
print
(
"0"
);
if
(
rotaryEncoderVirtualPosition
<
10
)
{
lcd
.
print
(
"0"
);
}
}
lcd
.
print
(
rotaryEncoderVirtualPosition
);
lcd
.
println
(
" "
);
}
}
state
=
initialState
;
return
rotaryEncoderVirtualPosition
;
}
void
runStart
()
{
// Configure environment
long
runCurrentTemperature
;
// Working environment variables
float
runCurrentTemperature
;
long
runTargetTemperature
;
unsigned
long
runStartTime
;
unsigned
long
runTargetTime
;
cook_mode_list
runCurrentMode
;
// Configure environment
boolean
clockStart
=
false
;
boolean
clockEnd
=
false
;
// Iterative work
while
(
true
)
{
// Build Instructions
switch
(
menu_position
[
0
])
{
case
main_manual
:
{
// everything is set, lets run!
// whenever changes are made to the cook variables, they must be applied to the running variables
runTargetTemperature
=
cookTemperature
;
runTargetTime
=
cookTime
;
runCurrentMode
=
cookMode
;
runMixerSpeed
=
cookMixerSpeed
;
// check if time ended and is time to stop and return to menu
if
(
clockStart
&&
clockEnd
)
{
delay
(
1000
);
return
;
...
...
@@ -741,7 +883,26 @@ void runStart() {
break
;
}
case
main_auto
:
{
// set the next instruction
// get the next instruction
// if it's time for a new instruction
// if human interaction is required
// display message
// sound buzzer
// check if rotary encoder press to continue
// check what variables are afected
// check what the new values are
// apply the values
// if it's NOT time for a new instruction
//delay(1000);
break
;
}
...
...
@@ -753,7 +914,8 @@ void runStart() {
}
}
// Run Instructions
// ************ Run Instructions ************
// Setup LCD
lcd
.
clear
();
lcd
.
home
();
...
...
@@ -770,56 +932,24 @@ void runStart() {
lcd
.
print
(
"Wait 00:00"
);
}
//int lastCount = 0;
while
(
true
)
{
//Serial.println("From second while");
// Wait a few seconds between measurements.
//delay(100);
/* Read temperature from sensor
runCurrentTemperature = dht.readTemperature(); // Reading temperature
if (isnan(runCurrentTemperature)) { // Check if any reads failed and exit early (to try again).
// Got an error
state = state_error;
error = catastrofic_failure_sensor_temperature;
return;
}
*/
amostra1
=
analogRead
(
ponto1
);
amostra2
=
analogRead
(
ponto2
);
Serial
.
print
(
"O valor das entradas sao: ["
);
Serial
.
print
(
amostra1
);
Serial
.
print
(
", "
);
Serial
.
print
(
amostra2
);
Serial
.
println
(
"]"
);
amostra1
=
analogRead
(
ponto1
);
float
Vs
=
4.965
;
//4.9345;
float
Vin
=
8.84
;
//8.8345;
float
adcStepCount
=
1024.0
;
float
R1
=
149.3
;
float
Rl
=
3.37
;
float
R_OpTemp
=
19.7
;
//21.597; //24.37;
diferenca
=
amostra2
-
amostra1
;
Serial
.
print
(
"diferenca: ["
);
Serial
.
print
(
diferenca
,
6
);
tensaoPorAmostra
=
5.0
/
1024.0
;
Serial
.
print
(
"] tensao por amortra: ["
);
Serial
.
print
(
tensaoPorAmostra
,
6
);
Vg
=
(
diferenca
)
*
tensaoPorAmostra
;
Serial
.
print
(
"] Vg: ["
);
Serial
.
print
(
Vg
,
6
);
Vs
=
5.0
;
Serial
.
print
(
"] Vs: ["
);
Serial
.
print
(
Vs
);
a
=
R2
/
(
R1
+
R2
)
-
Vg
/
Vs
;
Serial
.
print
(
"] a: ["
);
Serial
.
print
(
a
,
6
);
Rx
=
(
a
*
R3
)
/
(
1
-
a
);
Serial
.
print
(
"] Rx: ["
);
Serial
.
print
(
Rx
,
6
);
Va
=
amostra1
*
Vs
/
adcStepCount
;
//Rx = 151.5 * Va / ( 11.01 - Va ) - 30;
Rx
=
Rx
-
calibragem
;
Rx
=
R1
/
(
Vin
/
Va
-
1.0
)
-
Rl
-
R_OpTemp
;
int
i
;
float
i_f
;
int
tabelaSize
=
sizeof
(
tabela
)
/
sizeof
(
float
);
for
(
i
=
0
;
i
<=
tabelaSize
;
i
++
)
{
for
(
i
=
0
,
i_f
=
0.0
;
i
<=
tabelaSize
;
i
++
,
i_f
++
)
{
if
((
tabela
[
i
])
>
Rx
)
{
if
(
i
==
0
)
{
runCurrentTemperature
=
-
1.0
;
...
...
@@ -829,9 +959,7 @@ void runStart() {
runCurrentTemperature
=
210.0
;
}
else
{
runCurrentTemperature
=
(
i
-
1
)
+
((
Rx
-
tabela
[
i
-
1
])
/
(
tabela
[
i
]
-
tabela
[
i
-
1
]));
//temperatura = map(Rx, tabela[i-1], tabela[i], i-1, i);
runCurrentTemperature
=
(
i_f
-
1.0
)
+
((
Rx
-
tabela
[
i
-
1
])
/
(
tabela
[
i
]
-
tabela
[
i
-
1
]));
}
}
...
...
@@ -839,80 +967,93 @@ void runStart() {
}
}
/* Initialize target temperature with current temperature
if(runTargetTemperature<0) {
runTargetTemperature = runCurrentTemperature;
virtualPosition = runCurrentTemperature;
}*/
/* Read push button from the rotary encoder
if (!(digitalRead(PinSW))) { // check if pushbutton is pressed
virtualPosition = currentTemperatureCelsius; // if YES, then reset counter to ZERO
while (!digitalRead(PinSW)) {} // wait til switch is released
delay(10); // debounce
Serial.println("Reset"); // Using the word RESET instead of COUNT here to find out a buggy encoder
}*/
/* Read target temperature from the rotary encoder
if (virtualPosition != lastCount) {
lastCount = virtualPosition;
runTargetTemperature = virtualPosition;
Serial.print("Count: ");
Serial.println(virtualPosition);
}*/
/*
Serial.print("O valor das entradas sao: [");
Serial.print(amostra1);
Serial.print(", ");
Serial.print(amostra2);
Serial.print("]");
Serial.print("diferenca: [");
Serial.print(diferenca, 6);
Serial.print("] tensao por amortra: [");
Serial.print(tensaoPorAmostra, 6);
Serial.print("] Vg: [");
Serial.print(Vg, 6);
Serial.print("] Vs: [");
Serial.print(Vs);
Serial.print("] a: [");
Serial.print(a, 6);
Serial.print("] Rx: [");
Serial.print(Rx, 6);
*/
// Operate the heating element
Input
=
runCurrentTemperature
;
Setpoint
=
runTargetTemperature
;
myPID
.
Compute
();
/************************************************
* turn the output pin on/off based on pid output
************************************************/
// Get time and use as "date" of the sensor readings
unsigned
long
now
=
millis
();
// Check if it's time to vary the pulse width modulation and if so do it by shifting the "Relay in ON" Window
if
(
now
-
windowStartTime
>
WindowSize
)
{
//time to shift the Relay Window
{
windowStartTime
+=
WindowSize
;
}
// Check if the "date" is inside the "Relay ON" window and turn it ON; if not, turn it OFF
if
(
Output
>
now
-
windowStartTime
)
{
digitalWrite
(
HEATING_ELEMENT
,
HIGH
);
if
(
Output
!=
0
)
{
/*
Serial
.
print
(
"O valor das entradas sao: ["
);
Serial
.
print
(
amostra1
);
Serial
.
print
(
"] Va["
);
Serial
.
print
(
Va
,
6
);
Serial
.
print
(
"] Rx["
);
Serial
.
print
(
Rx
,
6
);
Serial
.
print
(
"] Temperature["
);
Serial
.
print
(
runCurrentTemperature
,
6
);
Serial
.
print
(
"] "
);
Serial
.
print
(
"+++ Diff: "
);
Serial
.
print
(
now
-
windowStartTime
);
Serial
.
print
(
" | Output: "
);
Serial
.
println
(
Output
);
*/
}
}
else
{
digitalWrite
(
HEATING_ELEMENT
,
LOW
);
if
(
Output
!=
0
)
{
/*
Serial
.
print
(
"O valor das entradas sao: ["
);
Serial
.
print
(
amostra1
);
Serial
.
print
(
"] Va["
);
Serial
.
print
(
Va
,
6
);
Serial
.
print
(
"] Rx["
);
Serial
.
print
(
Rx
,
6
);
Serial
.
print
(
"] Temperature["
);
Serial
.
print
(
runCurrentTemperature
,
6
);
Serial
.
print
(
"] "
);
Serial
.
print
(
"--- Diff: "
);
Serial
.
print
(
now
-
windowStartTime
);
Serial
.
print
(
" | Output: "
);
Serial
.
println
(
Output
);
*/
}
else
{
Serial
.
print
(
"O valor das entradas sao: ["
);
Serial
.
print
(
amostra1
);
Serial
.
print
(
"] Va["
);
Serial
.
print
(
Va
,
6
);
Serial
.
print
(
"] Rx["
);
Serial
.
print
(
Rx
,
6
);
Serial
.
print
(
"] Temperature["
);
Serial
.
print
(
runCurrentTemperature
,
6
);
Serial
.
println
(
"]"
);
}
// Print status to serial connection
//Serial.print("[Temperature Sensor] ");
//Serial.print("Temperature: ");
//Serial.print(runCurrentTemperature);
//Serial.print("*C | ");
//Serial.print(runTargetTemperature);
//Serial.println("*C ");
if
(
runCurrentMode
==
start_at_temperature
)
{
}
// Print status to LCD
...
...
@@ -925,7 +1066,7 @@ void runStart() {
lcd
.
print
(
" "
);
}
}
lcd
.
print
(
runCurrentTemperature
);
lcd
.
print
(
runCurrentTemperature
,
1
);
lcd
.
setCursor
(
11
,
0
);
if
(
runTargetTemperature
<
10
)
{
...
...
@@ -938,12 +1079,13 @@ void runStart() {
}
lcd
.
print
(
runTargetTemperature
);
// Display time
// Start the clock for "wait" mode
// Check if the target temperature has been reached so the clock can move forward.
if
(
runCurrentTemperature
==
runTargetTemperature
&&
clockStart
==
false
)
{
clockStart
=
true
;
runStartTime
=
now
;
}
// If the clock can move forward, calculate it's display time; if not, set it to the total cooking time
int
displayTime
=
0
;
if
(
clockStart
)
{
displayTime
=
runTargetTime
-
((
now
-
runStartTime
)
/
1000
);
...
...
@@ -958,9 +1100,10 @@ void runStart() {
else
{
displayTime
=
runTargetTime
;
}
// Print the clock to the LCD
int
minutes
=
displayTime
/
60
;
int
seconds
=
displayTime
-
minutes
*
60
;
lcd
.
setCursor
(
10
,
1
);
//lcd.print(" ");
if
(
minutes
<
10
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment