This commit is contained in:
Stefan 2020-10-14 00:09:12 +02:00
parent 6ab1458705
commit 2decfb37cc
6 changed files with 238 additions and 0 deletions

View File

@ -0,0 +1,10 @@
const int buzzer = 5;
void Buzzer_Init(void) {
pinMode(buzzer, OUTPUT);
tone(buzzer, 8000, 200);
}
void Buzzer_Task(void) {
}

View File

@ -0,0 +1,37 @@
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif
//U8G2_ST7920_128X64_1_HW_SPI(rotation, cs [, reset]) [page buffer, size = 128 bytes]
//U8G2_ST7920_128X64_2_HW_SPI(rotation, cs [, reset]) [page buffer, size = 256 bytes]
//U8G2_ST7920_128X64_F_HW_SPI(rotation, cs [, reset]) [full framebuffer, size = 1024 bytes]
U8G2_ST7920_128X64_2_HW_SPI u8g2(U8G2_R0, /* CS=*/ 10, /* reset=*/ 8);
void Display_Init(void) {
u8g2.begin();
}
void Display_Task(void) {
char text[10] = {0};
u8g2.firstPage();
do {
u8g2.drawLine(0,15,128,15); // horizontale oben
u8g2.drawLine(64,16,64,48); // senkrechte mitte
u8g2.drawLine(0,49,128,49); // horizontale unten
u8g2.setFont(u8g2_font_ncenB10_tf);
u8g2.drawStr(1,12,process.title);
u8g2.setFont(u8g2_font_ncenB14_tf);
sprintf(text,"%3d C",round(process.temp));
u8g2.drawStr(0,31,text);
sprintf(text,"%3d C",round(oven_temp));
u8g2.drawStr(0,47,text);
sprintf(text,"%02d:%02d",process.timer / 60, process.timer % 60);
u8g2.drawStr(66,31,text);
sprintf(text,"%02d:%02d",process.countdown / 60, process.countdown % 60);
u8g2.drawStr(66,47,text);
} while ( u8g2.nextPage() );
}

View File

@ -0,0 +1,18 @@
Encoder rotEncoder(2, 3);
void Encoder_Init(void) {
Serial.print("Encoder position: ");
Serial.println(EncPos);
}
void Encoder_Task(void) {
long newEncPos;
newEncPos = rotEncoder.read();
if (newEncPos != EncPos) {
Serial.print("Encoder position = ");
Serial.print(newEncPos);
Serial.println();
EncPos = newEncPos;
}
}

View File

@ -0,0 +1,91 @@
void Reflow_Init(void) {
profile[0].preheat_rate = 1;
profile[0].preheat_temp = 130;
profile[0].preheat_time = 20;
profile[0].reflow_rate = 0.5;
profile[0].reflow_temp = 235;
profile[0].reflow_time = 40;
process.profile = profile[0];
process.phase = 0;
process.timer = 0;
process.countdown = 5;
process.temp = 0;
sprintf(process.title,"Ready");
}
void Reflow_Task(void) {
switch (process.phase) {
case 0: // standby
if (process.countdown > 0) {
process.countdown--;
if (process.countdown == 0) {
process.phase = 1;
sprintf(process.title,"1/4 PreHeat");
process.temp = process.profile.preheat_temp;
process.countdown = 10;
}
}
break;
case 1: // preheat aufheizen
process.timer++;
if (process.countdown > 0) {
process.countdown--;
if (process.countdown == 0) {
process.phase = 2;
sprintf(process.title,"2/4 PreHeat");
process.countdown = 10;
}
}
break;
case 2: // preheat temp halten
process.timer++;
if (process.countdown > 0) {
process.countdown--;
if (process.countdown == 0) {
process.phase = 3;
sprintf(process.title,"3/4 Reflow");
process.temp = process.profile.reflow_temp;
process.countdown = 10;
}
}
break;
case 3: // reflow aufheizen
process.timer++;
if (process.countdown > 0) {
process.countdown--;
if (process.countdown == 0) {
process.phase = 4;
sprintf(process.title,"4/4 Reflow");
process.countdown = 10;
}
}
break;
case 4: // reflow temp halten
process.timer++;
if (process.countdown > 0) {
process.countdown--;
if (process.countdown == 0) {
process.phase = 5;
sprintf(process.title,"Cooldown");
process.temp = 0;
process.countdown = 10;
tone(buzzer, 2000, 1000);
}
}
break;
case 5: // auskühlen
if (process.countdown > 0) {
process.countdown--;
if (process.countdown == 0) {
process.phase = 0;
process.timer = 0;
sprintf(process.title,"Ready");
process.countdown = 0;
}
}
break;
default:
process.phase = 0;
}
}

View File

@ -0,0 +1,69 @@
#include <Arduino.h>
#include <U8g2lib.h>
#include <Encoder.h>
//#include "Adafruit_MAX31855.h"
#include "max6675.h"
struct reflow_profile
{
float preheat_rate;
float preheat_temp;
int preheat_time;
float reflow_rate;
float reflow_temp;
float reflow_time;
} profile[4];
struct reflow_process
{
reflow_profile profile;
int phase; // 0 = standby, 1 = heizen, 2 = preheat, 3 = heizen, 4 = reflow, 5 = cooldown
int countdown; // timer
int timer;
char title[20];
float temp; // zieltemperatur
} process;
float oven_temp = 0.0;
long EncPos = 0;
unsigned long timer100 = 0;
unsigned long timer500 = 0;
unsigned long timer1000 = 0;
void setup() {
Serial.begin(9600);
Serial.println("Reflow Controller v00.01");
Encoder_Init();
Buzzer_Init();
Display_Init();
Thermo_Init();
Reflow_Init();
}
void loop() {
Encoder_Task();
if (millis() > 100 + timer100) { // alle 100ms
timer100 = millis();
Buzzer_Task();
}
if (millis() > 500 + timer500) { // alle 500ms
timer500 = millis();
Thermo_Task();
}
if (millis() > 1000 + timer1000) { // alle 1s
timer1000 = millis();
Reflow_Task();
}
Display_Task(); // so oft wie möglich
}

View File

@ -0,0 +1,13 @@
#define MAXDO 7
#define MAXCS 8
#define MAXCLK 9
MAX6675 thermocouple(MAXCLK, MAXCS, MAXDO);
void Thermo_Init(void) {
}
void Thermo_Task(void) {
oven_temp = thermocouple.readCelsius();
}