Working version

Dependencies:   mbed mbed-rtos SDFileSystem EthernetInterface DS1820

Files at this revision

API Documentation at this revision

Comitter:
soren51929277
Date:
Fri Nov 22 09:05:25 2019 +0000
Parent:
0:ad2d0aa4726b
Commit message:
tTEM working

Changed in this revision

DS1820.lib Show annotated file Show diff for this revision Revisions of this file
DS18B20_1wire.lib Show diff for this revision Revisions of this file
PID.lib Show diff for this revision Revisions of this file
SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DS1820.lib	Fri Nov 22 09:05:25 2019 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/Sissors/code/DS1820/#c591209285e9
--- a/DS18B20_1wire.lib	Tue Feb 02 14:42:29 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://developer.mbed.org/users/richardlane/code/DS18B20_1wire/#00972ed59ba3
--- a/PID.lib	Tue Feb 02 14:42:29 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-http://mbed.org/users/aberk/code/PID/#6e12a3e5af19
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Fri Nov 22 09:05:25 2019 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/SDFileSystem/#8db0d3b02cec
--- a/main.cpp	Tue Feb 02 14:42:29 2016 +0000
+++ b/main.cpp	Fri Nov 22 09:05:25 2019 +0000
@@ -1,154 +1,610 @@
+/*Current regulator software----------------------------------------------------
+Project: TTEM2 current regulator
+Date: 16/05-17
+Name: Søren Møller Dath
+Target: NXP FRDM-K64F rev E3 MBED platform
+Description: 
+Input: temperature, voltage from PAPC program thrugh UDP protocol
+Input: Setup file through UDP protocol send from PC. Values are stored on 
+microSD card and read at startup
+Output: Spi signal controlling digital potentiometer for changing gate voltage 
+for a MOSFET controlling the current for the TTEM2 TX system
+Output: PWM control of fan and pump for cooling system, and buzzer alarm for low 
+voltage and high temperature.
+Output: Debug information through terminal
+------------------------------------------------------------------------------*/
+/*
+mbed
+PWM ALARM OG FAN SKAL BYTTES OM
+Nyt pin til ds1822 temp sensor
+*/
+
+//INCLUDES----------------------------------------------------------------------
 #include "mbed.h"
+#include "EthernetInterface.h"
+#include "SDFileSystem.h"
+#include "DS1820.h"
 #include <stdint.h>
-#include "DS18B20.h"
-#include "PID.h"
-#include "EthernetInterface.h"
+
+//DEFINES-----------------------------------------------------------------------
+#define Debug 0         //Set to 1 for debug mode, 0 for normal
+
+//CONSTANTS---------------------------------------------------------------------
+const int board_PORT = 20;
+const int pc_PORT = 30;
+
+
+static const char* SERVER_IP = "192.168.1.5"; //IP of server (pc)
+static const char* CLIENT_IP = "192.168.1.4"; //IP of client (MBED board) 0.102
+static const char* MASK = "255.255.255.0";    //mask
+static const char* GATEWAY = "192.168.1.1";   //gateway
 
-#define RATE 1
-#define SensorOffset 1.2 //Its about this that they show to must.
+//STRUCTS-----------------------------------------------------------------------
+typedef struct {                                    //Data received from PAPC through UDP Ethernet
+    char CtrlType;                                  //Must be 1
+    float Temperature;                              //Measured temperature for MOSFETs
+    float SetOutput;                                //output from controller (Not used)
+    float Error;                                    //Error between Iset and Current (Not used)
+    float Iset;                                     //Setpoint value for current (Not used)
+    float Voltage;                                  //Measured voltage over the H-bridge for thr coil
+    float Current;                                  //Measured current through the H-bridge
+}  __attribute__ ((packed)) Setting1;
+Setting1 status;
 
-char* SERVER_ADDRESS = "172.31.2.3";
-const int SERVER_PORT = 2222;
-
-typedef struct {
- char MeassageID;
- float Kp,tauI,tauD;   
-}  __attribute__ ((packed)) TPID;    
+typedef struct {                                    //Data from tTEM regulator application on pc to microcontroller board
+    char CtrlType;                                  //Must be 2
+    float SetCurrent;                               //Setpoint value for current (same as Iset)
+    float SetTemp;                                  //Setpoint value for temperature
+    float SetSmallCurrentStepsize;                  //Current small stepsize for proportional regulator
+    float SetLargeCurrentStepsize;                  //Current large stepsize for proportional regulator
+    float SetStartupCurrentAbove50;                 //Startup current if temperature above 50 deg
+    float SetStartupCurrent35to50;                  //Startup current if temperature between 35-50 deg   
+    float SetStartupCurrent25to35;                  //Startup current if temperature between 25-35 deg
+    float SetStartupCurrent15to25;                  //Startup current if temperature between 15-25 deg
+    float SetStartupCurrent5to15;                   //Startup current if temperature between  5-15 deg
+    float SetStartupCurrentBelow5;                  //Startup current if temperature below 5 deg
+    float SetLowVoltAlarm;                          //Define when the alarm will sound
+    float SetHighTempAlarm;                         //Define when the alarm will sound
+    float SetPumpLowSpeed;                          //Lowest possible pump speed
+    float SetPumpHighSpeed;                         //Highest possible pump speed
+    float SetFanLowSpeed;                           //Fixed speed for then fan
+    float SetFanMidSpeed;                           //Fixed speed for then fan
+    float SetFanHighSpeed;                          //Fixed speed for then fan
+    float SetStartupTime;                           //Number of seconds for startup
+    float SetLowMoment;                             //Current above this value is defined as High Moment and regulator is only active if above                      
+    float SetLowestCurrent;                         //The lowest value the current can be set to 0-1023
+    float SetResetCurrentTime;                      //Reset setupCurrent if no data has been received from PAPC within this time
+    float PumpUpdateValue;                          //How much should the pump PWM value be changed pr interval                      
+    float PumpUpdateInterval;                       //How often should the pump PWM value be change
+    float PumpTempTolerance;                        //Temp tolerance for changing between regulator state and high/low state 
+    
+   }  __attribute__ ((packed)) Setting2; 
+Setting2 setup;
 
 typedef struct {
- char CtrlType;
- float tempeture;     //nuværende temperatur
- float setpoint; //Hvad temperatur vi skal nå.
- float pump;     //Stilling af pumpen
- char mode;      //0: Auto; 1: manuel
- float PWM;      //Manuel power 
-}  __attribute__ ((packed)) Tsetting;
+    float Temperature;                              //Measured voltage over the H-bridge for thr coil
+    float Voltage;                                  
+    float Current; 
+    float RegTemp;                                  //Measured temperature for MOSFETs
+    bool DataReceived;
+    int CurrentStep;
+}  __attribute__ ((packed)) Data;
+Data reply;
+
+//INITS-------------------------------------------------------------------------
+Serial pc(USBTX, USBRX);        //create PC interface for terminal
+EthernetInterface eth;          //create ethernet
+UDPSocket server, sock;         //creat Ethernet socket
+Endpoint DataIn, pserver;       //create endpoint
+
+DigitalOut red(LED_RED);        //debug led
+DigitalOut statusGreen(PTC10);  //Lights up when active regulating NOT USED
+DigitalOut statusRed(PTC11);    //Lights up when reatch upper limit for a while NOT USED
+SPI spi(PTD2, NC, PTD1);        //mosi, miso(not used), sclk (reset+rdy not used) for DAC
+DigitalOut cs(PTC12);           //SYNC SPI
+SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // mosi, miso, sclk, cs, name
+AnalogIn BattVolt(A0);          //ADC for the battery voltage resistordivider = 10k/(36k+10k) = 0.217. Measered voltage = (BattVolt*3.3V)/0.217
+AnalogIn CoilVolt(A1);          //ADC for the coil voltage. Measered voltage = (CoilVolt*3.3V)/0.217 NOT USED
+AnalogIn Current(A2);           //ADC for the current measurement. Measered current = ((Current/3)-(9/2))/(0.05*N) Number of turns of wire throuth current sensor. NOT USED
+DS1820 probe(D15);            //PTE24 Data from DS1822+ digital temp. sensor TJEK AT DEN VIRKER PÅ DENNE NYE PLACERING I STEDET FOR A3
+DigitalIn FillWater(D2);        //Input for pushbutton for filling water on to the system
+PwmOut PwmSpare(D3);            //Extra PWM output NOT USED
+PwmOut PwmAlarm(D7);            //PWM for the alarm output set value = 1 for 100% PWM signal NOT USED
+PwmOut PwmPump(D6);             //PWM output for pump
+PwmOut PwmFan(D5);              //PWM output for fan
+
+Timer t, PumpTimer, DataReceivedTimer;             //Timer for resetting startup current and pump
 
-DigitalOut led(LED_GREEN); //Varmelegme
-DigitalOut Heat(A3); //Varmelegme
-PwmOut Pump(A4);
+float SetValue = 0.0f;          //Set value for the current regulator
+float tempProbe = 0.0f;
+bool firstRun = 0;              //Just to check if data has been received for the first time
+float PumpValue = 0.0f;
+
+enum states { 
+    PUMP_HIGH,
+    PUMP_LOW,
+    PUMP_REG
+};
+enum states state = PUMP_REG;
+
+//Char arrays for storing ini variables on SD card
+char A[50], B[50], C[50], D[50], E[50], F[50], G[50], H[50], I[50], J[50], K[50], L[50], M[50], N[50], O[50], P[50], Q[50], R[50], S[50], T[50], U[50], V[50], W[50], X[50];
 
- 
-Serial pc(USBTX, USBRX);     // serial comms over usb back to console
-DS18B20 thermom(A5, DS18B20::RES_12_BIT); // Dallas 1-wire
-float SetTemp;
+//FUNCTION DECLARATIONS---------------------------------------------------------
+void InitUSB(void);
+void InitEth(void);
+void ReadFile(void); //For SD card
+void WriteFile(void); //For SD card
+float Map(float, float, float, float, float);
+void InitPot(void);
+void SetPot(int);
+float GetBattVolt(void);
+//float GetCoilVolt(void);
+//float GetCurrent(void);
+void Alarm(void);
+void UpdateTemp(void);
+void UpdateStartupCurrent(void);
+void UpdateCurrent(void);
+void ReadSocketDate(void const *args);
+void ReturnUDPData(void);
+int main(void);
+
+//InitUSB-----------------------------------------------------------------------TESTED
+void InitUSB(void) //UART is only used for debug with a terminal
+{
+    pc.baud(9600);    //baud
+}
 
-PID controller(10.0, 0.02, 5.0, RATE);
-Timeout TurnOffHeat;
-Tsetting status;
-EthernetInterface eth;
-UDPSocket server,sock;;    //Denne server. Modtager data fra PC sock er til at sende data
-Endpoint process_server, DataIn;
-TPID PidFactors;
+//InitEth-----------------------------------------------------------------------TESTED
+void InitEth(void)
+{    
+    if (Debug) 
+        eth.init();
+    else    
+        eth.init(CLIENT_IP, MASK, GATEWAY);                                     //set up IP
+    eth.connect(60000);                                                         //connect ethernet timeout = 60s
+    pc.printf("\nBoard IP Address is %s\r\n", eth.getIPAddress());              //get client IP address
+    pc.printf("\nBoard Gateway Address is %s\r\n", eth.getGateway());
+    pc.printf("\nBoard Network Mask is %s\r\n", eth.getNetworkMask());
+    pc.printf("\nBoard MAC address is %s\r\n", eth.getMACAddress());
+    sock.init();
+    server.bind(board_PORT);
+    pserver.set_address(SERVER_IP,pc_PORT);
+}  
+//ReadFile----------------------------------------------------------------------TESTED
+void ReadFile (void) {
+    FILE *set = fopen("/sd/ini.txt", "r");  // Open "ini.txt" on the SD file system for read
+    fscanf(set,"%s %f",A,&setup.SetCurrent);
+    fscanf(set,"%s %f",B,&setup.SetTemp);   
+    fscanf(set,"%s %f",C,&setup.SetSmallCurrentStepsize);   
+    fscanf(set,"%s %f",D,&setup.SetLargeCurrentStepsize);   
+    fscanf(set,"%s %f",E,&setup.SetStartupCurrentAbove50);
+    fscanf(set,"%s %f",F,&setup.SetStartupCurrent35to50); 
+    fscanf(set,"%s %f",G,&setup.SetStartupCurrent25to35); 
+    fscanf(set,"%s %f",H,&setup.SetStartupCurrent15to25); 
+    fscanf(set,"%s %f",I,&setup.SetStartupCurrent5to15); 
+    fscanf(set,"%s %f",J,&setup.SetStartupCurrentBelow5); 
+    fscanf(set,"%s %f",K,&setup.SetLowVoltAlarm);   
+    fscanf(set,"%s %f",L,&setup.SetHighTempAlarm);  
+    fscanf(set,"%s %f",M,&setup.SetPumpLowSpeed);   
+    fscanf(set,"%s %f",N,&setup.SetPumpHighSpeed);   
+    fscanf(set,"%s %f",O,&setup.SetFanLowSpeed);   
+    fscanf(set,"%s %f",P,&setup.SetFanMidSpeed);   
+    fscanf(set,"%s %f",Q,&setup.SetFanHighSpeed);   
+    fscanf(set,"%s %f",R,&setup.SetStartupTime);   
+    fscanf(set,"%s %f",S,&setup.SetLowMoment);   
+    fscanf(set,"%s %f",T,&setup.SetLowestCurrent);   
+    fscanf(set,"%s %f",U,&setup.SetResetCurrentTime); 
+    fscanf(set,"%s %f",V,&setup.PumpUpdateValue); 
+    fscanf(set,"%s %f",W,&setup.PumpUpdateInterval); 
+    fscanf(set,"%s %f",X,&setup.PumpTempTolerance); 
+    fclose(set);
+}
 
-void initSpeedCtrl(void)
-{
-    controller.setInputLimits(0,100); //0..100 RPM
-    //Pwm output from 0.0 to 1.0
-    controller.setOutputLimits(0.0, 1.0);
-//   controller.setBias(1.0);
-    controller.setMode(AUTO_MODE);
-    controller.setSetPoint(status.setpoint); //tomgang
+//WriteFile---------------------------------------------------------------------TESTED
+void WriteFile(void) { // write to SD memory
+    FILE *fp = fopen("/sd/ini.txt", "w");  // Open "ini.txt" on the SD file system for write
+    fprintf(fp,"SetCurrent %f\r\n",setup.SetCurrent);  
+    fprintf(fp,"SetTemp %f\r\n",setup.SetTemp);   
+    fprintf(fp,"SetSmallCurrentStepsize %f\r\n",setup.SetSmallCurrentStepsize); 
+    fprintf(fp,"SetLargeCurrentStepsize %f\r\n",setup.SetLargeCurrentStepsize);   
+    fprintf(fp,"SetStartupCurrentAbove50 %f\r\n",setup.SetStartupCurrentAbove50);
+    fprintf(fp,"SetStartupCurrent35to50 %f\r\n",setup.SetStartupCurrent35to50);
+    fprintf(fp,"SetStartupCurrent25to35 %f\r\n",setup.SetStartupCurrent25to35);
+    fprintf(fp,"SetStartupCurrent15to25 %f\r\n",setup.SetStartupCurrent15to25);
+    fprintf(fp,"SetStartupCurrent5to15 %f\r\n",setup.SetStartupCurrent5to15);
+    fprintf(fp,"SetStartupCurrentBelow5 %f\r\n",setup.SetStartupCurrentBelow5);
+    fprintf(fp,"SetLowVoltAlarm %f\r\n",setup.SetLowVoltAlarm);   
+    fprintf(fp,"SetHighTempAlarm %f\r\n",setup.SetHighTempAlarm); 
+    fprintf(fp,"SetPumpLowSpeed %f\r\n",setup.SetPumpLowSpeed);   
+    fprintf(fp,"SetPumpHighSpeed %f\r\n",setup.SetPumpHighSpeed); 
+    fprintf(fp,"SetFanLowSpeed %f\r\n",setup.SetFanLowSpeed);   
+    fprintf(fp,"SetFanMidSpeed %f\r\n",setup.SetFanMidSpeed); 
+    fprintf(fp,"SetFanHighSpeed %f\r\n",setup.SetFanHighSpeed);   
+    fprintf(fp,"SetStartupTime %f\r\n",setup.SetStartupTime);   
+    fprintf(fp,"SetLowMoment %f\r\n",setup.SetLowMoment);   
+    fprintf(fp,"SetLowestCurrent %f\r\n",setup.SetLowestCurrent); 
+    fprintf(fp,"SetResetCurrentTime %f\r\n",setup.SetResetCurrentTime);   
+    fprintf(fp,"PumpUpdateValue %f\r\n",setup.PumpUpdateValue);   
+    fprintf(fp,"PumpUpdateInterval %f\r\n",setup.PumpUpdateInterval);   
+    fprintf(fp,"PumpTempTolerance %f\r\n",setup.PumpTempTolerance);   
+    fclose(fp);
+}
+
+//InitPot-----------------------------------------------------------------------TESTED POT = digital potentiometer (DAC)
+//Setup digital potentiometer
+void InitPot(void) {
+    cs = 1;                 //Deselect the device
+    spi.format(16,1);       //Setup the spi for 16 bit data, SPI mode = 1 
+    spi.frequency(1000000); //1MHz clock
+    cs = 0;                 //Select the device
+    spi.write(0x1803);      //Send 0x1803 to enable updating of RDAC register for changing potentiometer values
+    cs = 1;                 //Deselect the device
+}
+
+//SetPot------------------------------------------------------------------------TESTED
+//Update of potentiometer value
+void SetPot(int value) {    //Values from 0-1023 are allowed
+    cs = 0;                 //Select the device
+    spi.write(0x400+value); //Values from 0x0400 to 0x7FF for digital potentiometer 
+    cs = 1;                 //Deselect the device   
 }
 
-void HeatOff() {
-  Heat=0; led=1; 
-}    
+//GetBattVolt-------------------------------------------------------------------TESTED
+float GetBattVolt(void) {
+    float result; 
+    result = (BattVolt.read()*15.207f+0.2f);
+    return result;     
+} 
+
+//Alarm check for low battery or high temperature-------------------------------TESTED NOT USED
+void Alarm(void) {      
+    if ((status.Temperature>setup.SetHighTempAlarm)) {
+        pc.printf("Water temperature high\r\n");
+        PwmAlarm = 1.0f;
+        wait(0.5);
+        PwmAlarm = 0.0f;
+        wait(0.5);   
+    }
+    else {
+        PwmAlarm = 0.0f;                                //Turn off the alarm
+    }
+}
+
+//UpdateTemp--------------------------------------------------------------------TESTED
+void UpdateTemp(void) {
+
+    switch(state) {
+    case PUMP_HIGH:
+        //pc.printf("State = PUMP_HIGH\n\r");
+        PwmFan = setup.SetFanHighSpeed;
+        PwmPump = setup.SetPumpHighSpeed;
+        if(status.Temperature < setup.SetTemp) { //Temp is lower than setpoint go to PUMP_REG state
+            state = PUMP_REG;
+        }
+    break;
+    case PUMP_LOW:
+        //pc.printf("State = PUMP_LOW\n\r");
+        PwmFan = setup.SetFanLowSpeed;
+        PwmPump = setup.SetPumpLowSpeed;
+        if(status.Temperature > setup.SetTemp) { //Temp is higher than setpoint go to PUMP_REG state
+            state = PUMP_REG;
+        }
+    break;
+    case PUMP_REG:
+        //pc.printf("State = PUMP_REG\n\r");
+        //PwmFan = setup.SetFanMidSpeed;
+        if(PumpTimer.read()>setup.PumpUpdateInterval){                        
+        
+            if(status.Temperature>setup.SetTemp){       //Temp too high turn up pump
+                PumpValue = PumpValue + setup.PumpUpdateValue;     //0.05f;
+                if(PumpValue>0.3f){
+                    PumpValue = 0.3;        
+                }
+                //pc.printf("Turn pump up\n\r");
+            }
+            else if(status.Temperature<setup.SetTemp) { //Temp too low turn down pump
+                PumpValue = PumpValue - setup.PumpUpdateValue*10;
+                //pc.printf("Turn pump down\n\r");
+            }
+            else {
+                PumpValue = PumpValue;
+            }
+            //Restart timer used for making the cooling system run a little time after PAPC has stopped
+            PumpTimer.stop();
+            PumpTimer.reset();
+            PumpTimer.start();
+        }  
+        //Make sure the value can not be lower than lowest value or higher than higest.
+        if(PumpValue<setup.SetPumpLowSpeed){
+            PumpValue = setup.SetPumpLowSpeed;    
+        }
+        if(PumpValue>setup.SetPumpHighSpeed){
+            PumpValue = setup.SetPumpHighSpeed;    
+        }
+        PwmPump = PumpValue;
+        PwmFan = PumpValue;
+        //pc.printf("PumpValue: %3.3f%\n\r",PumpValue);
+    
+        if(status.Temperature-setup.SetTemp >= setup.PumpTempTolerance) { //Temp is higher than tolerance go to PUMP_HIGH state 
+            state = PUMP_HIGH;    
+        }
+        if(setup.SetTemp-status.Temperature >= setup.PumpTempTolerance) { //Temp is lower than tolerance go to PUMP_LOW state
+            state = PUMP_LOW;    
+        }
+    break;
+    }    
+}
 
-void ReadTemp() {
-float RegError;    
-    status.tempeture=thermom.GetTemperature()-SensorOffset;
-    while ((status.tempeture<-20) || (status.tempeture>110)) status.tempeture=thermom.GetTemperature(); //læs igen
-    if (status.mode==1) {
-    controller.setProcessValue(status.tempeture);
-    RegError =controller.compute();
-        if (RegError>0.01) {
-          Heat=1; led=0;
-          TurnOffHeat.attach(&HeatOff,RegError/RATE);  
+//UpdateStartupCurrent----------------------------------------------------------TESTED
+void UpdateStartupCurrent(void) {
+    probe.convertTemperature(true, DS1820::all_devices);
+    
+    float output = 0.0f;
+    float tempC = 0.0f;
+    
+    tempC = probe.temperature();
+    wait_ms(10);
+    pc.printf("Temp: %3.1f%\n\r",tempC);
+    //reply.ReturnTemp = tempC;                   //TEST FOR SENDIND DATA BACK TO PC
+       
+    if (tempC>=50.0f) {
+        output = setup.SetStartupCurrentAbove50; //500
+    }
+    else if (50.0f>tempC && tempC>=35.0f) {
+        output = setup.SetStartupCurrent35to50; //600
+    }
+    else if (35.0f>tempC && tempC>=25.0f) {
+        output = setup.SetStartupCurrent25to35; //700   
+    }
+    else if (25.0f>tempC && tempC>=15.0f) {
+        output = setup.SetStartupCurrent15to25; //800        
+    }
+    else if (15.0f>tempC && tempC>=5.0f) {
+        output = setup.SetStartupCurrent5to15; //900
+    }
+    else {
+        output = setup.SetStartupCurrentBelow5; //1023
+    }
+    SetPot(output);                    //Startup current in order to slowly startup 
+    SetValue = output;                 //The currentUpdate function needs to know where it should start to regulate from   
+    pc.printf("StartupCurrent: %3.3f%\n\r",output);
+}
+
+//UpdateCurrent-----------------------------------------------------------------TESTED
+void UpdateCurrent(void) {
+probe.convertTemperature(true, DS1820::all_devices);
+    
+    if(status.Current >= setup.SetLowMoment) {
+        if (probe.temperature()<50.0f) {  //Only regulate if temp measured on regulator mosfet is below 50 degree
+            
+            //Voltage must be above a defined level or it should not be possible to turn more down
+            //Implement large step if big error and small step if small error
+            statusGreen = 1; //LED not used
+            //Current too high turn it down but only if voltage is not to low!
+            if((setup.SetCurrent < status.Current) && (status.Voltage > setup.SetLowVoltAlarm)) {  
+                float error = status.Current-setup.SetCurrent;
+                if (error>=0.5f) { //large step  0.5f = 0.5A
+                    SetValue = SetValue - setup.SetLargeCurrentStepsize;
+                    pc.printf("Turn down large\n\r");
+                    if (SetValue < setup.SetLowestCurrent) { //FitPC shuts down if value is below this number
+                        SetValue = setup.SetLowestCurrent;
+                    }
+                }
+                else { //small step
+                    SetValue = SetValue - setup.SetSmallCurrentStepsize;         
+                    pc.printf("Turn down small\n\r");
+                    if (SetValue < setup.SetLowestCurrent) { //FitPC shuts down if value is below this number
+                        SetValue = setup.SetLowestCurrent;
+                    }
+                }
+                SetPot(SetValue);
+                pc.printf("SetValue: %3.3f%\n\r",SetValue);
+            }
+            //Current too low turn it up
+            else if(setup.SetCurrent > status.Current) { 
+                float error = setup.SetCurrent-status.Current;
+                if (error>=1.0f) { //large step
+                    SetValue = SetValue + setup.SetLargeCurrentStepsize;
+                    pc.printf("Turn up large\n\r");
+                    if (SetValue > 1023) {
+                        SetValue = 1023;
+                    } 
+                }
+                else { //small step
+                    SetValue = SetValue + setup.SetSmallCurrentStepsize;  
+                    pc.printf("Turn up small\n\r");  
+                    if (SetValue > 1023) {
+                        SetValue = 1023;
+                    }    
+                }
+                if (SetValue >= 1023) {
+                    pc.printf("Unable to turn up higher, change battery\n\r");  
+                    statusRed = 1;
+                    PwmAlarm = 1.0f;
+                    wait(0.25);
+                    PwmAlarm = 0.0f;
+                    wait(0.25);
+                }
+                SetPot(SetValue);
+                pc.printf("SetValue: %3.3f%\n\r",SetValue);
+            }
+        }
+        //else go to safe state if regulator mosfet temperature is above 50 deg.
+        else {
+            //pc.printf("SetValue: %3.3f%\n\r",SetValue);
+            SetPot(setup.SetStartupCurrentBelow5);
         }
     }
-    if (status.mode==0) {        
-        if (status.PWM>0.01) {
-          Heat=1; led=0;
-          TurnOffHeat.attach(&HeatOff,status.PWM/RATE);  
+}
+
+//ReadSocketData----------------------------------------------------------------TESTED
+void ReadSocketDate(void const *args) {
+    char in_buffer[1024];
+    while(true) {
+        int n = server.receiveFrom(DataIn, in_buffer, sizeof(in_buffer));     
+        
+        if (in_buffer[0]==1) {                 //Receiving from PAPC, copy to status struct
+            memcpy(&status,&in_buffer[0],sizeof(status));  
+            UpdateCurrent();                    //Turn up/down the current
+            UpdateTemp();                       //Control speed of pump based on temperature 
+            firstRun = 1;                       
+            //pc.printf("Data modtaget\r\n");
+            pc.printf("Temperatur: %3.1f%\r\n",status.Temperature);
+            pc.printf("Voltage:    %3.3f%\r\n",status.Voltage);
+            pc.printf("Current:    %3.3f%\r\n\r\n",status.Current);
+        } 
+        else if (in_buffer[0]==2) {            //Receiving from tTEM regulator application, copy to setup struct
+            memcpy(&setup,&in_buffer[0],sizeof(setup));
+            //Acustic alarm to confirm data has been received 
+            reply.DataReceived = true;         //Sends a boolean to the tTEM regulation software confirming data has been received
+            DataReceivedTimer.stop();
+            DataReceivedTimer.reset();
+            DataReceivedTimer.start();
+            
+            PwmAlarm = 1.0f; // NOT USED
+            wait(0.05);
+            PwmAlarm = 0.0f;
+            wait(0.05);
+            PwmAlarm = 1.0f;
+            wait(0.05);
+            PwmAlarm = 0.0f;
+            
+            WriteFile();            //Write data to SD card   
+            
+            pc.printf("Data has been received from setup file\r\n");
+            //Print the received data to terminal
+            /*pc.printf("SetCurrent:               %3.2f%\r\n",setup.SetCurrent);
+            pc.printf("SetTemp:                  %3.2f%\r\n",setup.SetTemp);
+            pc.printf("SetSmallStepsize:         %3.2f%\r\n",setup.SetSmallCurrentStepsize);
+            pc.printf("SetLargeStepsize:         %3.2f%\r\n",setup.SetLargeCurrentStepsize);
+            pc.printf("SetStartupCurrentAbove50: %3.2f%\r\n",setup.SetStartupCurrentAbove50);
+            pc.printf("SetStartupCurrent35to50:  %3.2f%\r\n",setup.SetStartupCurrent35to50);
+            pc.printf("SetStartupCurrent25to35:  %3.2f%\r\n",setup.SetStartupCurrent25to35);
+            pc.printf("SetStartupCurrent15to25:  %3.2f%\r\n",setup.SetStartupCurrent15to25);
+            pc.printf("SetStartupCurrent5to15:   %3.2f%\r\n",setup.SetStartupCurrent5to15);
+            pc.printf("SetStartupCurrentBelow5:  %3.2f%\r\n",setup.SetStartupCurrentBelow5);
+            pc.printf("SetLowVoltAlarm:          %3.2f%\r\n",setup.SetLowVoltAlarm);
+            pc.printf("SetHighTempAlarm:         %3.2f%\r\n",setup.SetHighTempAlarm);
+            pc.printf("SetPumpLowSpeed:          %3.2f%\r\n",setup.SetPumpLowSpeed);
+            pc.printf("SetPumpHighSpeed:         %3.2f%\r\n",setup.SetPumpHighSpeed);
+            pc.printf("SetFanLowSpeed:           %3.2f%\r\n",setup.SetFanLowSpeed);
+            pc.printf("SetFanMidSpeed:           %3.2f%\r\n",setup.SetFanMidSpeed);
+            pc.printf("SetFanHighSpeed:          %3.2f%\r\n",setup.SetFanHighSpeed);
+            pc.printf("SetStartupTime:           %3.2f%\r\n",setup.SetStartupTime);
+            pc.printf("SetLowMoment:             %3.2f%\r\n",setup.SetLowMoment);
+            pc.printf("SetLowestCurrent:         %3.3f%\r\n",setup.SetLowestCurrent);
+            pc.printf("SetResetCurrentTime:      %3.3f%\r\n",setup.SetResetCurrentTime);
+            pc.printf("PumpUpdateValue:          %3.3f%\r\n",setup.PumpUpdateValue);
+            pc.printf("PumpUpdateInterval:       %3.3f%\r\n",setup.PumpUpdateInterval);
+            pc.printf("PumpTempTolerance:        %3.3f%\r\n",setup.PumpTempTolerance);
+            */
         }
-    }            
-}    
-
-
-void sendStatus() {
-
+        else {                              //Error
+            pc.printf("Invalid CrtlType, must be 1 for status or 2 for setup\r\n"); 
+        }
+        t.reset();                          //Reset and start the timer for measure if PAPC has been stopped
+        t.start();
+    }
 }
 
-void ReadSocketDate(void const *args) {
- char buffer[256];
- printf("ReadThread Init Done\r\n");
- while (1) {
-    int n = server.receiveFrom(DataIn, buffer, sizeof(buffer));
-    if (buffer[0]==0) { //seach function
-        if (strcmp(DataIn.get_address(),process_server.get_address())!=0) {
-           process_server.set_address(DataIn.get_address(),SERVER_PORT); 
-           printf(" New Adress: %s\r\n",DataIn.get_address());
-        } 
-    }    
-    if (buffer[0]==1) {
-        memcpy(&status,&buffer[0],sizeof(status));
-        printf("NEW Settings [%s]:\r\n",DataIn.get_address());
-        printf(" setpoint: %.1f \r\n",status.setpoint);    
-        if (!status.mode) printf("Manual mode %.1f\n\r",status.PWM); else printf("Auto mode\n\r");
-        printf(" Pump: %.1f \r\n",status.pump);  
-        Pump=status.pump/100; 
+void ReturnUDPData(void) {
+    char out_buffer[sizeof(reply)];
+    //Send data back through UDP
+    probe.convertTemperature(true, DS1820::all_devices);
+    tempProbe = probe.temperature(); 
+    //wait_ms(750);
+    while(tempProbe==-1000) {
+        //pc.printf("Temp probe crc error\n\r");
+        tempProbe = probe.temperature();
+        //wait_ms(750);   
     }
-    if (buffer[0]==2) {
-        memcpy(&PidFactors,&buffer[0],sizeof(PidFactors));
-        printf("NEW PID %.2f %.2f %.2f\r\n", PidFactors.Kp,PidFactors.tauI,PidFactors.tauD);
-        controller.setTunings(PidFactors.Kp,PidFactors.tauI,PidFactors.tauD);
-    }    
- }       
-}    
+        
+    reply.Temperature = status.Temperature;  //Data received from PAPC is send to tTEM regulator application
+    reply.Voltage = status.Voltage;
+    reply.Current = status.Current;
+    reply.RegTemp = tempProbe;  //Data measured by the microcontroller
+    reply.CurrentStep = SetValue;
+    //pc.printf("RegTemp: %3.3f%\n\r",tempProbe);
+        
+    memcpy(&out_buffer[0],&reply, sizeof(reply));
+    sock.sendTo(pserver, out_buffer, sizeof(out_buffer)); //reply 
+    wait_ms(550);
+        
+    if(DataReceivedTimer.read()>5) {
+        reply.DataReceived = false;
+        DataReceivedTimer.stop();
+        DataReceivedTimer.reset();
+    }
+}
+
+//MAIN--------------------------------------------------------------------------
+int main(void)
+{                   
+    PwmFan   = 0.0f; 
+    PwmPump  = 0.0f; 
+    PwmSpare = 0.0f;                        //Do not use this PWM output 
+
 
-int main() {
-  char out_buffer[sizeof(status)];
-  led=1; 
-  Pump.period_ms(1);
-  Pump.write(0);
-  pc.printf("\n\r---------------------------------------------------------------\n\r");
-  pc.printf("BrewController INIT\n\r");
-  status.CtrlType=1;
-  status.setpoint=0;
-  eth.init(); //Use DHCP  
-  eth.connect();
-  pc.printf("IP Address is %s\n\r", eth.getIPAddress());  
-  
-  sock.init();
-  server.bind(SERVER_PORT);
-  
-  process_server.set_address(SERVER_ADDRESS, SERVER_PORT);
-      
-  pc.printf("Temp Sensor: \n\r");
-  DS18B20::ROM_Code_t ROM_Code;
-  thermom.ReadROM(&ROM_Code);
-  pc.printf("Family code: 0x%X\n\r", ROM_Code.BYTES.familyCode);
-  pc.printf("Serial Number: ");
-  for (unsigned i = 6; i != 0; --i) {
-      pc.printf("%02X%s", ROM_Code.BYTES.serialNo[i-1], (i != 1)?":":"\r\n");
-  }
-  pc.printf("CRC: 0x%X\r\n", ROM_Code.BYTES.CRC);
-  Thread DbThread(ReadSocketDate, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25));
-  
-  initSpeedCtrl();
-  
-  pc.printf("---------------------------------------------------------------\n\r");
-  
-  pc.printf("\n\rRunning ...\n\r");
-  
-  
-  while (1) {
-      ReadTemp(); 
-      //send data til PC
-      memcpy(&out_buffer[0],&status.CtrlType,sizeof(status));
-      sock.sendTo(process_server, out_buffer, sizeof(status));          
-    //  printf("Data to: %s Temp= %.1f Out[0] %x \r\n",process_server.get_address(),status.tempeture, out_buffer[0]);
-      wait(RATE);
-  }
-}
\ No newline at end of file
+    InitUSB();                              //initialize the PC interface 
+    pc.printf("Init USB done\r\n");                                               
+    InitEth();                              //Init ethernet connection
+    pc.printf("Init Ethernet done\r\n");                                               
+    InitPot();                              //setup potentiometer
+    pc.printf("Init POT done\r\n");                                               
+    
+    
+    ReadFile();                             //Read ini values from SD card that was last received from UDP.
+    pc.printf("Read MicroSD card done\r\n");                                               
+    UpdateStartupCurrent();                 //Set the startup current at a value dependent of the measured temperature     
+    wait(setup.SetStartupTime);             //Wait a while for everything to startup  
+    PumpValue = (setup.SetPumpLowSpeed+setup.SetPumpHighSpeed)*0.5f;
+    //FanValue = setup.SetFanMidSpeed;
+    PumpTimer.reset();
+    PumpTimer.start();
+    Thread DbThread(ReadSocketDate, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25));
+    FillWater.mode(PullUp);                 //Enable pull-up resister on bushbutton input
+    statusGreen = 0;
+    statusRed = 0;
+    wait_ms(10);
+    
+    while(true)                                                                            
+    {   
+        red = !red;    
+        Alarm();                            //Check if battery is running low          
+        
+        if (firstRun == 0) {                //No data has been received so manual overwrite of pwmpump is allowed, if data has been received it can not be changed manual
+            if(FillWater == 0) {            //Button has been pushed
+               PwmPump = 1.0f;              //Run pump at half speed to fill system
+            }
+            else {
+                PwmPump = 0.0f;    
+            }
+        }
+        
+        //Reset setvalue for current regulator if PAPC has been stopped for a given time
+        if (setup.SetResetCurrentTime==0) {
+            t.stop();                       //If Time= 0, disable the resetting function
+            t.reset();
+                 
+        }
+        else if(t.read()>setup.SetResetCurrentTime) {
+            //No data received for 10 sek. reset the current
+            UpdateStartupCurrent(); 
+            PwmPump = 0.0f; //Pump and fan should not run if no data has been received from papc
+            PwmFan = 0.0f;  
+            PwmAlarm = 0.0f; //Stop the alarm
+            firstRun = 0;
+            statusGreen = 0;  
+            statusRed = 0; 
+            status.Temperature = 0;
+            status.Voltage = 0;
+            status.Current = 0;
+            //pc.printf("Resetting start value\n\r");
+            t.stop();
+            t.reset();
+        }
+        ReturnUDPData();
+    }
+    
+}   
\ No newline at end of file