Programmerbara Tempereringsaggregatet + värmeplatta (5 / 7 steg)

Steg 5: kod



Kan du hitta koden i de bifogade filerna. Jag genomfört följande externa bibliotek:
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.

Se Steg
Relaterade Ämnen

Sous Vide Tempereringsaggregatet för $50-$100

uppdatera 6 juni: extra steg för att använda en hink värmare och svalare.Uppdatering 8 mars: jag lagt till bilder för säkringen och bytte till att använda en SSR.Detta kommer att visa dig hur man bygger ditt eget korrekta Tempereringsaggregatet för m...

En Nybörjarguide till programmerbara logiska enheter

Jag sammanställt detta instructable efter märker att det verkligen inte finns något på webbplatsen om programmerbara utom för en fråga och en instructable om programmerare (se länkar nedan).Så i ett försök att försöka hjälpa alla förstå vad en progra...

Programmerbara ljus upp Fairy Wings

skapa lätta mönster på din fairy vingar med en mikrokontroller som kallas smida planer. Detta är ett enkelt exempel med 10 Lightboards; de smida planer kan driva upp till 20. Du kan också få en annan komponent som kallas Max som låter dig lägga till...

Guy-Manuel Daft Punk hjälm med programmerbar LED-belysning

I detta Instructable, kommer du att bygga en Guy-Manuel de Homem-Christo Daft Punk hjälm med programmerbar LED belysning. Det är en lång projekt som kommer att ta flera tiotals timmar av arbete. Kompetensområden som kommer att hjälpa till med detta b...

EXTREMA Snap kretsar programmerbar Robot!

i detta Instructable kommer du lära dig hur man bygger en extrem Snap kretsar programmerbar Robot. Först lär du dig att installera PICAXE programmering Editor (PICAXE är mikrokontroller eller datorn hjärnan för din programmerbara Snap kretsar robot)....

Gör en enkel Snap kretsar programmerbar Robot

i detta Instructable kommer du lära dig hur man bygger en enkel Snap kretsar programmerbar robot. Först kommer du lära dig hur man bygger en enkel krets med Snap kretsar för att förstå hur lätt det är att bygga elektroniska kretsar. Du kommer därefte...

Antika grekiska programmerbara "Robot"

denna enkla, lätt att göra roboten ritades i antikens Grekland, och det anses vara den första programmerbara anordning. Med några bitar av trä, sträng och en tegelsten kan du bygga din egen! Det använder en tegelsten hängande från en bit snöre för de...

3D tryckt klämmor för programmerbara symaskiner

Dator styrs cykeln maskiner, eller mer allmänt känd som programmerbar symaskiner är avgörande för någon klippa och sy anläggning eller textilproducenten. De vidta åtgärder för komplexa långsam sömnad och förvandla dem till snabb, korrekt och repetiti...

Värmeplatta lödning resultat

detta är resultatet av ett experiment jag gjorde, med hjälp av en värmeplatta och en bit av aluminium för lödning. Dess lättare än du tror, och ganska enkelt. Tricket är dock att "måla" kretsen innan handen med en lödkolv och lite lödtenn (jag h...

Värmeplatta lödning med låg temperatur löda

Detta är en guide om hur man monterar SMT enheter på en flexibel billiga PET PCB. Vi använder en värmeplatta för att löda SMT enheter till PET substrat med låg temperatur Tin vismut löda.Lödning komponenter på PET substrat måste göras med låg tempera...

DIY en programmerbar akryl övervaka stativ

Som en software engineer spenderar jag mer än 12 timmar framför datorn. Och jag vet att det är mer att 80% av programvaruingenjör har vissa problem med deras livmoderhalscancer, inkludera mig.Så jag tror en bildskärmsställ till högre behövs för bilds...

XBee programmerbara Christmas Lights

genom att följa dessa steg, kommer du att kunna styra en del av 50 trefärgs julbelysning trådlöst via en programmerbar XBee.Min familj har alltid varit julbelysning och skapa egna dekorationer, så när jag läser denna blog post på hur till hacka GE fä...

Programmerbara Wearable bågreaktorn

Detta Instructable härrör från en annan som jag gjorde när jag behövde en snabb och billig halloween-kostym. Det var en enkel krets av en knapp cell och lysdioder i ett papper hölje. Du hittar mer på den på. Sedan dess jag började leka med NeoPixels...

Att göra en kraftfull programmerbara tangentbord för mindre än $30.

Produkter som X-nycklar programmerbara knappsats är en bra följeslagare för alla som använder snabbtangenten tunga programvara som PhotoShop. De tillåter dig att lägga ut alla snabbknapparna på en liten styrelse komplett med etiketter och med ett try...

Totalt Armageddon USB programmerbara döda växla

för dagar när klickande igenom menyn börja stänga min dator är bara för tråkigt, jag byggde en USB kill switch med en mycket tjusig söker säkerhet Vippbrytare från RadioShack och modet i en gammal USB-mus. Med några enkla lödning, USB-växeln är progr...

(Programmerbara) Mekaniska tangentbord

Jag wanteed att göra ett tangentbord för makro nyckel, eftersom windows möjliggör flera tangentbord ingångar, jag tänkte jag skulle göra en extra knappsatsen att använda förutom min vanliga tangentbord.Avsikten var att göra det programmerbara och arb...

Programmerbara elektriska vehicle(Arduino+TAMIYA)

kombinera TAMIYA BULLDOZER och arduino, kan du bygga en programmerbara elbil.Steg 1: Bygga upp TAMIYA BULLDOZER KIT Steg 2: DC Motor H-Bridge förare ombord Steg 3: Ansluta och programvara Programvara:Motorn är design för 3V makt.Detta projekt med ett...

Ta bort funktionen värme från en Corning PC420 värmeplatta omrörare

detta instructable innebär ändring av ett laboratorium instrument drivs av huvudspänning. Om du väljer att göra dessa ändringar, kommer att ni stödja det fulla ansvaret för dessa ändringar. De instruktioner som beskrivs här kommer troligen inte garan...

Dansa dansa Roverbot! Bygga en ljus aktiveras dans Snap kretsar programmerbar Robot.

i detta Instructable du lära dig hur man bygger en ljus aktiveras dansande Snap kretsar programmerbar robot. Först lär du dig att installera PICAXE programmering Editor (PICAXE är mikrokontroller eller datorn hjärnan för din dans dans Roverbot). Däre...