Programmerbara Tempereringsaggregatet + värmeplatta (5 / 7 steg)
Steg 5: kod
PID-bibliotek
Studsa bibliotek
Rotary Encoder
I2C LC Display
MAX6675
Obs: I "MAX6675.h" måste du ersätta linje 11 (#include "WProgram.h") med
#if defined(ARDUINO) & & ARDUINO > = 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
för att göra det köra på Arduino 1,05
Använd "LiquidCrystal" biblioteket i sub mapp 2004-1.0 kod, ignorera "LiquidCrystal_I2C".
När en temperatur ställs in manuellt eller ett program är markerat från SD-kortet, registeransvarige börjar läsa temperaturen någonsin 0.1 sekunder och beräknar nästa uppvärmning puls längd med PID bibliotek. Vi använder en hel del olika bibliotek använt jag upp mer än 99,5% av alla gratis flash minne på atmega 328 chip. Jag hade värre, att förkorta texten och menyn för LCD-skärmen, som jag slut SRAM. Nästa gång, jag skulle nog använda en atmega 2560 eller byta några strängar i EEPROM.
Olika program har ska sparas som kommaseparerade textfiler med uppräkning filnamn (1.txt... 10.txt) i rotmappen på SD-kortet. Layouten för filerna bör se ut så här:
1. linje: titel (högst 20 tecken)
2. raden: första temperaturen in point, första uppvärmning ränta, första varaktighet
3. fodra: andra temperatur börvärde, andra uppvärmning rate, andra varaktighet
4. line...
Du kan använda till maximalt 10 linjer per fil. Det måste sägas upp med en tom rad.
Jag använde en Arduino UNO ladda upp följande kod till Atmega:
Tempereringsaggregatet
#include < MAX6675.h >
LCD
#include < Wire.h >
#include < LCD.h >
#include < LiquidCrystal_I2C.h >
#include < SD.h >
#include < PID_v1.h >
Rotary Encoder
#include < Encoder.h >
Encoder roundEnc (2, 3);
Tryckknapp på vridomkopplaren
#include < Bounce.h >
Studsa tryckknapp = Bounce (4, 5);
#define I2C_ADDR 0x3F / / definiera I2C adress där LCD-skärmen är
#define BACKLIGHT_PIN 3
#define En_pin 2
#define Rw_pin 1
#define Rs_pin 0
#define D4_pin 4
#define D5_pin 5
#define D6_pin 6
#define D7_pin 7
LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
Temperatursensor
int tCS = 7. CS stift på MAX6675
int tSO = 9. SÅ pin av MAX6675
int tSCK = 8. SCK pin i MAX6675
int enheter = 1; Enheter till avläsning temp (0 = rå, 1 = ˚C, 2 = ˚F)
int TCError = 0; ErrorFlag - TC fel
int tempVal = 0; Faktiska Temperatur
Displayen
osignerade långa lastMeas = 0; Senaste temperaturmätning
osignerade långa lastDisp = 0; Sista visningen förändring
osignerade långa lastTempDisp = 0; Senaste temperatur uppdatering på displayen
osignerade långa lastLog = 0; Senaste Logstate
osignerade långa logTime = 0;
int lastDispTemp = -1;
int dispOn = 0; Blink
int cPosX = -1; x-position (markören) på displayen
int cPosY = -1; y-position på displayen
String emptyString = "";
osignerade långa lastDispPrg = 0; Zeit seit letztem uppdatering des Programm-displayer
Knappen på rotary encoder har tryckt?
0 = Nej
1 = Ja
2 = Ja, mer än 2 sekunder
int buttonPressed = 0;
Roterande pulsgivare
0 = inte ändrade
1 = medurs
2 = motsols
int rotationState = 0;
int rotationNumber = 0;
int lastRotationNumber = 0;
int rotationBigLeap = 0; var rotationl kodaren flyttade mer än ~ 20°
int oldRotState = 0;
Programmet staten
0: ingen program
1: manuell Setpoint
2: belastningen från SD
3: inte används
4: kör program
int progState = 0;
int subProgState = 0;
int lastProgState = -1;
int lastSubProgState = -1;
Program från SD-kort
int progCount = 0;
byte progLnCount = 0;
byte progTSp [10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
byte progSprr [10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
ordet progTime [10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Vilken typ av program som körs just nu?
-1 = 0;
0 = single-Point
> 1 = SD-kort
int progRun = -1;
int runLine = -1; Faktiska subprogram av SDCard
osignerade långa runTime = 0; Hur länge är det steget körs redan
osignerade långa stepTime = 0; Hur mycket tid att öka rampen
osignerade långa lastPuls = 0; Senaste uppvärmning puls
int minutesPast = 0;
booleska SDOpen = false;
int aTsp = 0;
int tsk = 120; SetPoint ° C
int MaxT = 190; Maximal T ° C
byte Sprr = 15. Rate ° C/m
byte MaxR = 20; Maximale Ramp
int TAlert = 200. Shutown temperatur
int Tdig1 = tsk/100. Siffror i tsk
int Tdig2 = (Tsp%100)/10;
int Tdig3 = tsk % 10.
int Rdig1 = Sprr/10. Siffror för Rp
int Rdig2 = Sprr % 10.
Starta MAX6675 biblioteket för våra chip
Setup Serial output och LED stift
MAX6675 bibliotek anger redan pin lägen för MAX6675 chip!
MAX6675 temp(tCS,tSO,tSCK,units);
PID parametrar
dubbla Setpoint, ingång, utgång;
PID myPID (& Input, Output & Setpoint, 2, 5, 1, direkt);
void setup() {
Serial.BEGIN(9600);
LCD.BEGIN (20,4);
Slå på bakgrundsbelysningen
lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
lcd.setBacklight(HIGH);
lcd.noBlink();
LCD.Clear ();
pinMode (10, OUTPUT); SC-Pin SD-kort
pinMode (53, OUTPUT); SC-Pin SD-Karte - Arduino mega
digitalWrite (53, hög);
pinMode (6, OUTPUT); uppvärmning pin
}
void loop() {
Inaktivera uppvärmning
digitalWrite (6, låg).
få användarindata
getButtonState();
getRotState();
Ändra visning
setState();
Uppdatera visningen
displayState();
Uppdatera temperatur
Snabbare mätning när programmet körs. I planeringen scenen LCD lag-grupperna
om (progState == 4) {
getTemp();
updateProgram();
Input = tempVal;
SetPoint = aTsp;
myPID.Compute();
heatingPuls();
om ((lastLog + 1000) < millis()) {
updateLog();
lastLog = millis();
}
}
annars om ((lastMeas + 10000) < millis()) {
getTemp();
lastMeas = millis();
}
om ((tempVal > TAlert) || (TCError == 1)) {stopProgram(); delay(5000);}
}
void getButtonState() {
osignerade långa pushTime = pushButton.duration();
pushButton.update();
Hur länge var knappen intryckt - avbryta?
Boolean sköt = pushButton.fallingEdge();
om ((pushed == true) & & (pushTime < 1500)) {
buttonPressed = 1;
}
annars om ((pushed == true) & & (pushTime > = 1500)) {
buttonPressed = 2;
}
annat {
buttonPressed = 0;
}
}
void getRotState() {
int roataionState = 0;
int rotationNumber = 0; -Skala 0-10
lång tempState = roundEnc.read();
om (tempState > oldRotState)
{
rotationState = 1;
rotationNumber = (tempState%100)/10;
int tempRotationNumber = (tempState%100)/10;
om (tempRotationNumber! = rotationNumber) {
rotationBigLeap = 1;
}
rotationNumber = tempRotationNumber;
om (rotationNumber < 0) {
rotationNumber = 10 + rotationNumber;
}
oldRotState = (tempState % 100);
roundEnc.write(oldRotState);
}
annars om (tempState < oldRotState)
{
rotationState = 2;
rotationNumber = (tempState%100)/10;
int tempRotationNumber = (tempState%100)/10;
om (tempRotationNumber! = rotationNumber) {
rotationBigLeap = 1;
}
rotationNumber = tempRotationNumber;
om (rotationNumber < 0) {
rotationNumber = 10 + rotationNumber;
}
oldRotState = (tempState % 100);
roundEnc.write(oldRotState);
}
annat {
rotationState = 0;
rotationBigLeap = 0;
}
}
void resetRotState (int tecken) {
För att ange siffror i LCD
rotationNumber = siffran.
Failsave
om ((rotationNumber > 10) || (rotationNumber < 0)) {
rotationNumber = 0;
}
oldRotState = digit * 10;
roundEnc.write(oldRotState);
}
Verarbeite Eingaben är Display
void setState() {
Rotationstate 1 = höger
Rotationstate 2 = vänster
Att trycka på länge: avbryta
om ((progState! = 0) & & (buttonPressed == 2)) {
stopProgram();
buttonPressed = 0;
hemkomst.
}
undermenyn 0,1
om ((progState == 0) & & (rotationState! = 0)) {
int Välj = rotationNumber %2 + 1.
subProgState = Markera;
displayState();
hemkomst.
}
Välj menyn intrade
manuell setpoint
om ((progState == 0) & & (buttonPressed == 1)) {
om (subProgState == 1) {
progState = 1;
subProgState = 0;
displayState();
buttonPressed = 0;
hemkomst.
}
SD-kort
om (subProgState == 2) {
progState = 2;
subProgState = 0;
displayState();
buttonPressed = 0;
hemkomst.
}
}
Submenue 0,1 - manuellt läge
om ((progState == 1) & & (subProgState < 4) & & (rotationState == 1) & & (rotationBigLeap == 1)) {
subProgState = subProgState + 1.
om (subProgState > 3) {
subProgState = 0;
}
displayState();
rotationBigLeap = 0;
hemkomst.
}
om ((progState == 1) & & (subProgState < 4) & & (rotationState == 2) & & (rotationBigLeap == 1)) {
subProgState = subProgState - 1;
om (subProgState < 0) {
subProgState = 3;
}
displayState();
rotationBigLeap = 0;
hemkomst.
}
Tillbaka, Start tsk, Rp, i manuellt läge
om ((progState == 1) & & (subProgState == 0) & & (buttonPressed == 1)) {
stopProgram();
buttonPressed = 0;
hemkomst.
}
om ((progState == 1) & & (subProgState == 1) & & (buttonPressed == 1)) {
subProgState = 11;
buttonPressed = 0;
hemkomst.
}
om ((progState == 1) & & (subProgState == 2) & & (buttonPressed == 1)) {
subProgState = 21;
buttonPressed = 0;
hemkomst.
}
om ((progState == 1) & & (subProgState == 3) & & (buttonPressed == 1)) {
startProgram(0);
buttonPressed = 0;
hemkomst.
}
1., 2., 3. Siffriga T-Setpoint
om ((progState == 1) & & (subProgState == 11) & & (buttonPressed == 1)) {
subProgState = 12;
buttonPressed = 0;
hemkomst.
}
om ((progState == 1) & & (subProgState == 12) & & (buttonPressed == 1)) {
subProgState = 13.
buttonPressed = 0;
hemkomst.
}
om ((progState == 1) & & (subProgState == 13) & & (buttonPressed == 1)) {
Sista siffran
subProgState = 1;
Tsk = Tdig1 * 100 + Tdig2 * 10 + Tdig3;
om (tsk > MaxT) {
Tsk = MaxT;
} //Maximal temperatur
Tdig1 = tsk/100. Siffror i tsk
Tdig2 = (Tsp%100)/10;
Tdig3 = tsk % 10.
buttonPressed = 0;
hemkomst.
}
1., 2. Siffriga ramp
om ((progState == 1) & & (subProgState == 21) & & (buttonPressed == 1)) {
subProgState = 22.
buttonPressed = 0;
hemkomst.
}
om ((progState == 1) & & (subProgState == 22) & & (buttonPressed == 1)) {
Sista siffran
subProgState = 2;
Sprr = Rdig1 * 10 + Rdig2;
om (Sprr > MaxR) {
Sprr = MaxR;
} //Maximal/minimal ramp
om (Sprr < 1) {
Sprr = 1;
}
Rdig1 = Sprr/10. Siffror för Rp
Rdig2 = Sprr % 10.
buttonPressed = 0;
hemkomst.
}
Undermenyn 1,1 - SD-Programm
om ((progState == 2) & & (subProgState < 11) & & (rotationState == 1) & & (rotationBigLeap == 1)) {
subProgState = subProgState + 1.
om (subProgState > progCount) {
subProgState = 1;
}
displayState();
rotationBigLeap = 0;
hemkomst.
}
om ((progState == 2) & & (subProgState < 11) & & (rotationState == 2) & & (rotationBigLeap == 1)) {
subProgState = subProgState - 1;
om (subProgState < 1) {
subProgState = progCount;
}
displayState();
rotationBigLeap = 0;
hemkomst.
}
om ((progState == 2) & & (subProgState < 11) & & (buttonPressed == 1)) {
startProgram(subProgState);
buttonPressed = 0;
hemkomst.
}
}
void stopProgram() {
progState = 0;
subProgState = 0;
progRun = -1;
runLine = -1;
lastSubProgState = -1;
lastProgState = -1;
displayState();
myPID.SetMode(MANUAL);
}
Annullera startProgram (int runType) {
progRun = runType;
aTsp = tempVal;
Längd = millis();
runLine = 0;
progState = 4;
myPID.SetMode(AUTOMATIC);
logTime = millis();
}
void updateProgram()
{
SD-kort
progLnCount
runline
minutesPast = 1,0 * ((millis()-runTime) / 60000.0);
om (progRun > 0) {
Tsk = progTSp [runLine];
Sprr = progSprr [runLine];
Ladda nya program?
om (minutesPast > = progTime[runLine])
{
runLine ++;
om (runLine > progLnCount) {stopProgram(); återvänder;}
Längd = millis();
}
}
Ramp
långa tidssteget = (1000.0 * 60,0) / (dubbel) Sprr;
om ((stepTime + tidssteget < millis()) & & (aTsp < tsk)) {aTsp ++; stepTime=millis();}
annars om ((stepTime + tidssteget < millis()) & & (aTsp > tsk)) {aTsp--; stepTime=millis();}
}
void heatingPuls() {
puls varje 0,1 s
om ((lastPuls + 100) < millis()) {
digitalWrite (6, hög).
int dly = utgång * 1;
begränsa makt
om (dly > 1000) {dly = 1000;}
annars om (dly < 0) {dly = 0;}
Serial.println(DLY);
Delay(DLY);
digitalWrite (6, låg).
lastPuls = millis();
}
}
void getTemp() {
Läs temp från MAX6675
float loop_temperature [2].
för (int ii = 0; ii < 2; ii ++)
{
loop_temperature [ii] = temp.read_temp();
om (loop_temperature [ii] < 0) {
TCError = 1;
}
Delay(50);
}
tempVal = (int) ((loop_temperature [0] + loop_temperature [1]) / 2 + 0,5);
}
void updateTemp (booleskt kraft = false, int lastPosX = -1, int lastPosY = -1) {
om (((millis() > (lastTempDisp + 1000)) & & (tempVal! = lastDispTemp)) || (Force == true))
{
lcd.setCursor (0, 3);
LCD.Print ("T:");
lcd.setCursor (3, 3);
LCD.Print(tempVal);
LCD.Print((Char)223);
LCD.Print ("C").
lastTempDisp = millis();
lastDispTemp = tempVal;
om ((lastPosX! = -1) || (lastPosY! = -1)) {
lcd.setCursor (lastPosX, lastPosY);
}
}
}
void fillNumber3 (int nummer, sträng & dest3) {
om (antal < -9) {dest3 += String(number);}
annars om (nummer < 0) {dest3 = "0", dest3 += String(number);}
annars om (nummer < 10) {dest3 = "00"; dest3 += String(number);}
annars om (nummer < 100) {dest3 = "0", dest3 += String(number);}
annat {
dest3 = String(number);
}
}
void fillNumber2 (int nummer, sträng & dest2) {
om (nummer < 10) {
dest2 = "0";
dest2 += String(number);
}
annat {
dest2 = String(number);
}
}
void printProgLine (byte nummer, sträng och line) {
rad = (String)(number);
linje += ":";
linje += (String)(progTSp[number]);
linje += ",";
linje += (String)(progSprr[number]);
linje += ",";
linje += (String)(progTime[number]);
linje += "";
}
void printProcessLine (sträng och line) {
Sträng saSP;
fillNumber3 (aTsp, saSP);
Sträng st;
fillNumber3 (minutesPast, st);
linje = "TaSp:";
linje += saSP;
linje += (char) 223;
linje += "C".
linje += "t:"; linje += st;
}
void printSingleLine (sträng och line) {
Sträng sTsp;
Sträng sSprr;
fillNumber3 (Tsp, sTsp);
fillNumber2 (Sprr, sSprr);
linje = "Tsp:";
linje += sTsp;
linje += (char) 223;
linje += "C".
linje += "Rp:";
linje += sSprr;
linje += (char) 223;
linje += "/ m";
}
Uppdatera visningen
void displayState() {
om (progState == 0) {
display0();
}
om (progState == 1) {
display1();
}
om (progState == 2) {
Display2();
}
om (progState == 4) {
display4();
}
}
void display0() {
om (lastProgState! = 0) {
cPosX = -1;
cPosY = -1;
lcd.noBlink();
LCD.Clear (); Gå hem
LCD.Print("program"); programmet avslutades
lastProgState = 0;
lastSubProgState = -1; Återställa
updateTemp(true); Uppdatera temperatur
}
Uppdatering varje sekund
om ((subProgState == 0) & & (millis() > (lastDisp + 1000)) & & (dispOn == 0))
{
lcd.setCursor (0, 1); gå till den 2: a raden
LCD.Print("-");
lastDisp = millis();
dispOn = 1;
}
annars om ((subProgState == 0) & & (millis() > (lastDisp + 1000))) {
lcd.setCursor (0, 1); gå till den 2: a raden
LCD.Print(emptyString);
lastDisp = millis();
dispOn = 0;
}
annars om ((subProgState == 1) & & (lastSubProgState! = 1)) {
lcd.setCursor (0, 1);
LCD.Print("SetPoint");
lastSubProgState = 1;
updateTemp(true);
}
annars om ((subProgState == 2) & & (lastSubProgState! = 2)) {
lcd.setCursor (0, 1);
LCD.Print ("SDCard");
lastSubProgState = 2;
updateTemp(true);
}
updateTemp();
}
Manuell setpoint
void display1() {
om (lastProgState! = 1) {
cPosX = -1;
cPosY = -1;
lcd.noBlink();
LCD.Clear (); Gå hem
LCD.Print("SetPoint");
lcd.setCursor (0, 1);
Sträng linje;
printSingleLine(line);
LCD.Print(Line);
lastProgState = 1;
lastSubProgState = -1;
updateTemp(true);
}
0. Tillbaka
om ((subProgState == 0) & & (lastSubProgState! = 0)) {
lcd.noBlink();
lcd.setCursor (0, 2);
LCD.Print ("tillbaka");
}
1. Ställa in Temp
om ((subProgState == 1) & & (lastSubProgState! = 1)) {
lcd.noBlink();
lcd.setCursor (0, 1);
Sträng linje;
printSingleLine(line);
LCD.Print(Line);
lcd.setCursor (0, 2);
LCD.Print ("TSp");
lastSubProgState = 1;
}
2. Ställ in Ramp
om ((subProgState == 2) & & (lastSubProgState! = 2)) {
lcd.noBlink();
lcd.setCursor (0, 1);
Sträng linje;
printSingleLine(line);
LCD.Print(Line);
lcd.setCursor (0, 2);
LCD.Print ("Rp");
lastSubProgState = 2;
}
3. Start
om ((subProgState == 3) & & (lastSubProgState! = 3)) {
lcd.noBlink();
lcd.setCursor (0, 2);
LCD.Print("Start");
lastSubProgState = 3;
}
4. Ändra T 1. Siffriga
om ((subProgState == 11) & & (lastSubProgState! = 11)) {
1. Siffran cPosX = 1, cPosY = 1
cPosX = 5;
cPosY = 1;
LCD.Blink();
resetRotState(Tdig1);
lcd.setCursor (cPosX, cPosY);
LCD.Print(Tdig1);
lcd.setCursor (cPosX, cPosY);
lastSubProgState = 11;
}
annat if (subProgState == 11) {
lcd.setCursor (cPosX, cPosY);
Tdig1 = rotationNumber;
LCD.Print(Tdig1);
lcd.setCursor (cPosX, cPosY);
}
5. Ändra T 2. Siffriga
om ((subProgState == 12) & & (lastSubProgState! = 12)) {
2. Siffran cPosX = 6, cPosY = 1
cPosX = 6;
cPosY = 1;
LCD.Blink();
resetRotState(Tdig2);
lcd.setCursor (cPosX, cPosY);
LCD.Print(Tdig2);
lcd.setCursor (cPosX, cPosY);
lastSubProgState = 12;
}
annat if (subProgState == 12) {
lcd.setCursor (cPosX, cPosY);
Tdig2 = rotationNumber;
LCD.Print(Tdig2);
lcd.setCursor (cPosX, cPosY);
}
6. Ändra T 3. Siffriga
om ((subProgState == 13) & & (lastSubProgState! = 13)) {
3. Siffran cPosX = 7, cPosY = 1
cPosX = 7.
cPosY = 1;
LCD.Blink();
resetRotState(Tdig3);
lcd.setCursor (cPosX, cPosY);
LCD.Print(Tdig3);
lcd.setCursor (cPosX, cPosY);
lastSubProgState = 13.
}
annat if (subProgState == 13) {
lcd.setCursor (cPosX, cPosY);
Tdig3 = rotationNumber;
LCD.Print(Tdig3);
lcd.setCursor (cPosX, cPosY);
}
4. Ändra Ramp 1. Siffriga
om ((subProgState == 21) & & (lastSubProgState! = 21)) {
1. Siffran cPosX = 15, cPosY = 1
cPosX = 15.
cPosY = 1;
LCD.Blink();
resetRotState(Rdig1);
lcd.setCursor (cPosX, cPosY);
LCD.Print(Rdig1);
lcd.setCursor (cPosX, cPosY);
lastSubProgState = 21;
}
annat if (subProgState == 21) {
lcd.setCursor (cPosX, cPosY);
Rdig1 = rotationNumber;
LCD.Print(Rdig1);
lcd.setCursor (cPosX, cPosY);
}
5. Ändra Ramp 2. Siffriga
om ((subProgState == 22) & & (lastSubProgState! = 22)) {
2. Siffran cPosX = 16, cPosY = 1
cPosX = 16.
cPosY = 1;
LCD.Blink();
resetRotState(Rdig2);
lcd.setCursor (cPosX, cPosY);
LCD.Print(Rdig2);
lcd.setCursor (cPosX, cPosY);
lastSubProgState = 22.
}
annat if (subProgState == 22) {
lcd.setCursor (cPosX, cPosY);
Rdig2 = rotationNumber;
LCD.Print(Rdig2);
lcd.setCursor (cPosX, cPosY);
}
updateTemp (falskt, cPosX, cPosY);
}
void display2() {
om (lastProgState! = 2) {
lcd.noBlink();
LCD.Clear (); Gå hem
LCD.Print("SDCard");
lcd.setCursor (0, 1);
om (SDOpen! = sant) {
IF (!. SD.begin(10)) {stopProgram(); återvänder;}
}
SDOpen = sant;
progCount = 0;
för (int ii = 1; ii < 10; ii ++) {
Sträng fname = String(ii);
fname += ".txt";
char fnamec [6].
fname.toCharArray (fnamec, 6);
Fil MinFil = SD.open (fnamec, FILE_READ);
om (MinFil) {
progCount ++;
}
myFile.close();
}
om (progCount == 0) {
stopProgram();
hemkomst.
}
lastProgState = 2;
subProgState = 1;
lastSubProgState = -1;
updateTemp(true);
}
om ((subProgState < 10) & & (lastSubProgState! = subProgState))
{
Sträng fname = String(subProgState);
fname += ".txt";
char fnamec [6].
fname.toCharArray (fnamec, 6);
Fil MinFil = SD.open (fnamec, FILE_READ);
om (! MinFil) {
stopProgram();
}
byte line = 0;
byte Slength = 0;
char tempString [1].
Sträng HeadLine = "";
String ProgLine = "";
för (byte ii = 0; ii < 10; ii ++)
{
progTSp [ii] = 0;
progSprr [ii] = 0;
progTime [ii] = 0;
}
samtidigt (myFile.available()) {
tempString [1] = myFile.read();
om (tempString [1] == '\r') {
}
annars om (tempString [1]! = '\n') {
ProgLine += tempString [1].
Slength ++;
}
annat {
om (linje == 0) {HeadLine = ProgLine; ProgLine = ""; Slength = 0; linje ++; }
annat {
om ((line > 10) || (Slength > 20)) {
stopProgram();
hemkomst.
}
char * ack. avskr;
char buffer [Slength + 1];
ProgLine.toCharArray (buffert, Slength + 1);
CONST char sep [] = ",";
progTSp [line-1] = atoi (strtok_r (buffert, sep, och ack. avskr));
om (progTSp [line-1] > MaxT) {
progTSp [line-1] = MaxT;
}
progSprr [line-1] = atoi (strtok_r (NULL, sep, och ack. avskr));
om (progSprr [line-1] > MaxR) {
progSprr [line-1] = MaxR;
};
om (progSprr [line-1] < 1) {
progSprr [line-1] = 1;
}
progTime [line-1] = atoi (strtok_r (NULL, sep, och ack. avskr));
progLnCount = line - 1. 0-antal-1
Slength = 0;
linje ++;
ProgLine = "";
//
}
}
}
myFile.close();
lcd.setCursor (0, 1);
LCD.Print(emptyString);
lcd.setCursor (0, 1);
LCD.Print(HeadLine);
printProgLine (0, ProgLine);
lcd.setCursor (0, 2);
LCD.Print(emptyString);
lcd.setCursor (0, 2);
LCD.Print(ProgLine);
resetRotState(0);
lastSubProgState = subProgState;
}
updateTemp();
}
void display4() {
om ((lastDispPrg + 1000) > millis()) {återvänder;}
om (lastProgState! = 4) {
lcd.noBlink();
LCD.Clear ();
updateTemp(true);
lastProgState = 4;
}
om (progRun == 0)
{
lcd.setCursor (0, 0);
Sträng linje; printProcessLine(line);
LCD.Print(Line);
lcd.setCursor (0, 1);
printSingleLine(line);
LCD.Print(Line);
}
om (progRun > 0)
{
lcd.setCursor (0, 0);
Sträng linje; printProcessLine(line);
LCD.Print(Line);
lcd.setCursor (0, 1);
printProgLine (runLine, linje);
LCD.Print(Line);
om (runLine! = progLnCount) {
lcd.setCursor (0, 2);
printProgLine (runLine + 1, linje);
LCD.Print(Line);
}
annat {
lcd.setCursor (0, 2);
LCD.Print(emptyString);
}
}
updateTemp();
}
void updateLog() {
om (SDOpen! = sant) {
IF (!. SD.begin(10)) {återvänder;}
}
SDOpen = sant;
Fil MinFil = SD.open ("T.log", FILE_WRITE);
om (! MinFil) {return;}
myFile.print(millis() - logTime);
myFile.print (",");
myFile.print(aTsp);
myFile.print (",");
myFile.println(tempVal);
myFile.close();
}
Som ni kan se på bilden, efter en första (och inte optimerad) prova är detta mycket trevligt resultat. Ett riktigt fiffiga sätt att förbättra systemet ännu mer skulle vara att implementera ett autotunig bibliotek (t.ex. här), men det skulle behöva mer utrymme än vad som finns på atmega328. En andra optimering skulle vara att använda en mer exakt termoelement controller.