Brew controller for controlling the temperature in the pot and the speed of the pump. It upload all data to a PC with UDP

Dependencies:   DS18B20_1wire EthernetInterface PID mbed-rtos mbed

Committer:
gert_lauritsen
Date:
Tue Feb 02 14:42:29 2016 +0000
Revision:
0:ad2d0aa4726b
Brew control system for a BIB brew

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gert_lauritsen 0:ad2d0aa4726b 1 #include "mbed.h"
gert_lauritsen 0:ad2d0aa4726b 2 #include <stdint.h>
gert_lauritsen 0:ad2d0aa4726b 3 #include "DS18B20.h"
gert_lauritsen 0:ad2d0aa4726b 4 #include "PID.h"
gert_lauritsen 0:ad2d0aa4726b 5 #include "EthernetInterface.h"
gert_lauritsen 0:ad2d0aa4726b 6
gert_lauritsen 0:ad2d0aa4726b 7 #define RATE 1
gert_lauritsen 0:ad2d0aa4726b 8 #define SensorOffset 1.2 //Its about this that they show to must.
gert_lauritsen 0:ad2d0aa4726b 9
gert_lauritsen 0:ad2d0aa4726b 10 char* SERVER_ADDRESS = "172.31.2.3";
gert_lauritsen 0:ad2d0aa4726b 11 const int SERVER_PORT = 2222;
gert_lauritsen 0:ad2d0aa4726b 12
gert_lauritsen 0:ad2d0aa4726b 13 typedef struct {
gert_lauritsen 0:ad2d0aa4726b 14 char MeassageID;
gert_lauritsen 0:ad2d0aa4726b 15 float Kp,tauI,tauD;
gert_lauritsen 0:ad2d0aa4726b 16 } __attribute__ ((packed)) TPID;
gert_lauritsen 0:ad2d0aa4726b 17
gert_lauritsen 0:ad2d0aa4726b 18 typedef struct {
gert_lauritsen 0:ad2d0aa4726b 19 char CtrlType;
gert_lauritsen 0:ad2d0aa4726b 20 float tempeture; //nuværende temperatur
gert_lauritsen 0:ad2d0aa4726b 21 float setpoint; //Hvad temperatur vi skal nå.
gert_lauritsen 0:ad2d0aa4726b 22 float pump; //Stilling af pumpen
gert_lauritsen 0:ad2d0aa4726b 23 char mode; //0: Auto; 1: manuel
gert_lauritsen 0:ad2d0aa4726b 24 float PWM; //Manuel power
gert_lauritsen 0:ad2d0aa4726b 25 } __attribute__ ((packed)) Tsetting;
gert_lauritsen 0:ad2d0aa4726b 26
gert_lauritsen 0:ad2d0aa4726b 27 DigitalOut led(LED_GREEN); //Varmelegme
gert_lauritsen 0:ad2d0aa4726b 28 DigitalOut Heat(A3); //Varmelegme
gert_lauritsen 0:ad2d0aa4726b 29 PwmOut Pump(A4);
gert_lauritsen 0:ad2d0aa4726b 30
gert_lauritsen 0:ad2d0aa4726b 31
gert_lauritsen 0:ad2d0aa4726b 32 Serial pc(USBTX, USBRX); // serial comms over usb back to console
gert_lauritsen 0:ad2d0aa4726b 33 DS18B20 thermom(A5, DS18B20::RES_12_BIT); // Dallas 1-wire
gert_lauritsen 0:ad2d0aa4726b 34 float SetTemp;
gert_lauritsen 0:ad2d0aa4726b 35
gert_lauritsen 0:ad2d0aa4726b 36 PID controller(10.0, 0.02, 5.0, RATE);
gert_lauritsen 0:ad2d0aa4726b 37 Timeout TurnOffHeat;
gert_lauritsen 0:ad2d0aa4726b 38 Tsetting status;
gert_lauritsen 0:ad2d0aa4726b 39 EthernetInterface eth;
gert_lauritsen 0:ad2d0aa4726b 40 UDPSocket server,sock;; //Denne server. Modtager data fra PC sock er til at sende data
gert_lauritsen 0:ad2d0aa4726b 41 Endpoint process_server, DataIn;
gert_lauritsen 0:ad2d0aa4726b 42 TPID PidFactors;
gert_lauritsen 0:ad2d0aa4726b 43
gert_lauritsen 0:ad2d0aa4726b 44 void initSpeedCtrl(void)
gert_lauritsen 0:ad2d0aa4726b 45 {
gert_lauritsen 0:ad2d0aa4726b 46 controller.setInputLimits(0,100); //0..100 RPM
gert_lauritsen 0:ad2d0aa4726b 47 //Pwm output from 0.0 to 1.0
gert_lauritsen 0:ad2d0aa4726b 48 controller.setOutputLimits(0.0, 1.0);
gert_lauritsen 0:ad2d0aa4726b 49 // controller.setBias(1.0);
gert_lauritsen 0:ad2d0aa4726b 50 controller.setMode(AUTO_MODE);
gert_lauritsen 0:ad2d0aa4726b 51 controller.setSetPoint(status.setpoint); //tomgang
gert_lauritsen 0:ad2d0aa4726b 52 }
gert_lauritsen 0:ad2d0aa4726b 53
gert_lauritsen 0:ad2d0aa4726b 54 void HeatOff() {
gert_lauritsen 0:ad2d0aa4726b 55 Heat=0; led=1;
gert_lauritsen 0:ad2d0aa4726b 56 }
gert_lauritsen 0:ad2d0aa4726b 57
gert_lauritsen 0:ad2d0aa4726b 58 void ReadTemp() {
gert_lauritsen 0:ad2d0aa4726b 59 float RegError;
gert_lauritsen 0:ad2d0aa4726b 60 status.tempeture=thermom.GetTemperature()-SensorOffset;
gert_lauritsen 0:ad2d0aa4726b 61 while ((status.tempeture<-20) || (status.tempeture>110)) status.tempeture=thermom.GetTemperature(); //læs igen
gert_lauritsen 0:ad2d0aa4726b 62 if (status.mode==1) {
gert_lauritsen 0:ad2d0aa4726b 63 controller.setProcessValue(status.tempeture);
gert_lauritsen 0:ad2d0aa4726b 64 RegError =controller.compute();
gert_lauritsen 0:ad2d0aa4726b 65 if (RegError>0.01) {
gert_lauritsen 0:ad2d0aa4726b 66 Heat=1; led=0;
gert_lauritsen 0:ad2d0aa4726b 67 TurnOffHeat.attach(&HeatOff,RegError/RATE);
gert_lauritsen 0:ad2d0aa4726b 68 }
gert_lauritsen 0:ad2d0aa4726b 69 }
gert_lauritsen 0:ad2d0aa4726b 70 if (status.mode==0) {
gert_lauritsen 0:ad2d0aa4726b 71 if (status.PWM>0.01) {
gert_lauritsen 0:ad2d0aa4726b 72 Heat=1; led=0;
gert_lauritsen 0:ad2d0aa4726b 73 TurnOffHeat.attach(&HeatOff,status.PWM/RATE);
gert_lauritsen 0:ad2d0aa4726b 74 }
gert_lauritsen 0:ad2d0aa4726b 75 }
gert_lauritsen 0:ad2d0aa4726b 76 }
gert_lauritsen 0:ad2d0aa4726b 77
gert_lauritsen 0:ad2d0aa4726b 78
gert_lauritsen 0:ad2d0aa4726b 79 void sendStatus() {
gert_lauritsen 0:ad2d0aa4726b 80
gert_lauritsen 0:ad2d0aa4726b 81 }
gert_lauritsen 0:ad2d0aa4726b 82
gert_lauritsen 0:ad2d0aa4726b 83 void ReadSocketDate(void const *args) {
gert_lauritsen 0:ad2d0aa4726b 84 char buffer[256];
gert_lauritsen 0:ad2d0aa4726b 85 printf("ReadThread Init Done\r\n");
gert_lauritsen 0:ad2d0aa4726b 86 while (1) {
gert_lauritsen 0:ad2d0aa4726b 87 int n = server.receiveFrom(DataIn, buffer, sizeof(buffer));
gert_lauritsen 0:ad2d0aa4726b 88 if (buffer[0]==0) { //seach function
gert_lauritsen 0:ad2d0aa4726b 89 if (strcmp(DataIn.get_address(),process_server.get_address())!=0) {
gert_lauritsen 0:ad2d0aa4726b 90 process_server.set_address(DataIn.get_address(),SERVER_PORT);
gert_lauritsen 0:ad2d0aa4726b 91 printf(" New Adress: %s\r\n",DataIn.get_address());
gert_lauritsen 0:ad2d0aa4726b 92 }
gert_lauritsen 0:ad2d0aa4726b 93 }
gert_lauritsen 0:ad2d0aa4726b 94 if (buffer[0]==1) {
gert_lauritsen 0:ad2d0aa4726b 95 memcpy(&status,&buffer[0],sizeof(status));
gert_lauritsen 0:ad2d0aa4726b 96 printf("NEW Settings [%s]:\r\n",DataIn.get_address());
gert_lauritsen 0:ad2d0aa4726b 97 printf(" setpoint: %.1f \r\n",status.setpoint);
gert_lauritsen 0:ad2d0aa4726b 98 if (!status.mode) printf("Manual mode %.1f\n\r",status.PWM); else printf("Auto mode\n\r");
gert_lauritsen 0:ad2d0aa4726b 99 printf(" Pump: %.1f \r\n",status.pump);
gert_lauritsen 0:ad2d0aa4726b 100 Pump=status.pump/100;
gert_lauritsen 0:ad2d0aa4726b 101 }
gert_lauritsen 0:ad2d0aa4726b 102 if (buffer[0]==2) {
gert_lauritsen 0:ad2d0aa4726b 103 memcpy(&PidFactors,&buffer[0],sizeof(PidFactors));
gert_lauritsen 0:ad2d0aa4726b 104 printf("NEW PID %.2f %.2f %.2f\r\n", PidFactors.Kp,PidFactors.tauI,PidFactors.tauD);
gert_lauritsen 0:ad2d0aa4726b 105 controller.setTunings(PidFactors.Kp,PidFactors.tauI,PidFactors.tauD);
gert_lauritsen 0:ad2d0aa4726b 106 }
gert_lauritsen 0:ad2d0aa4726b 107 }
gert_lauritsen 0:ad2d0aa4726b 108 }
gert_lauritsen 0:ad2d0aa4726b 109
gert_lauritsen 0:ad2d0aa4726b 110 int main() {
gert_lauritsen 0:ad2d0aa4726b 111 char out_buffer[sizeof(status)];
gert_lauritsen 0:ad2d0aa4726b 112 led=1;
gert_lauritsen 0:ad2d0aa4726b 113 Pump.period_ms(1);
gert_lauritsen 0:ad2d0aa4726b 114 Pump.write(0);
gert_lauritsen 0:ad2d0aa4726b 115 pc.printf("\n\r---------------------------------------------------------------\n\r");
gert_lauritsen 0:ad2d0aa4726b 116 pc.printf("BrewController INIT\n\r");
gert_lauritsen 0:ad2d0aa4726b 117 status.CtrlType=1;
gert_lauritsen 0:ad2d0aa4726b 118 status.setpoint=0;
gert_lauritsen 0:ad2d0aa4726b 119 eth.init(); //Use DHCP
gert_lauritsen 0:ad2d0aa4726b 120 eth.connect();
gert_lauritsen 0:ad2d0aa4726b 121 pc.printf("IP Address is %s\n\r", eth.getIPAddress());
gert_lauritsen 0:ad2d0aa4726b 122
gert_lauritsen 0:ad2d0aa4726b 123 sock.init();
gert_lauritsen 0:ad2d0aa4726b 124 server.bind(SERVER_PORT);
gert_lauritsen 0:ad2d0aa4726b 125
gert_lauritsen 0:ad2d0aa4726b 126 process_server.set_address(SERVER_ADDRESS, SERVER_PORT);
gert_lauritsen 0:ad2d0aa4726b 127
gert_lauritsen 0:ad2d0aa4726b 128 pc.printf("Temp Sensor: \n\r");
gert_lauritsen 0:ad2d0aa4726b 129 DS18B20::ROM_Code_t ROM_Code;
gert_lauritsen 0:ad2d0aa4726b 130 thermom.ReadROM(&ROM_Code);
gert_lauritsen 0:ad2d0aa4726b 131 pc.printf("Family code: 0x%X\n\r", ROM_Code.BYTES.familyCode);
gert_lauritsen 0:ad2d0aa4726b 132 pc.printf("Serial Number: ");
gert_lauritsen 0:ad2d0aa4726b 133 for (unsigned i = 6; i != 0; --i) {
gert_lauritsen 0:ad2d0aa4726b 134 pc.printf("%02X%s", ROM_Code.BYTES.serialNo[i-1], (i != 1)?":":"\r\n");
gert_lauritsen 0:ad2d0aa4726b 135 }
gert_lauritsen 0:ad2d0aa4726b 136 pc.printf("CRC: 0x%X\r\n", ROM_Code.BYTES.CRC);
gert_lauritsen 0:ad2d0aa4726b 137 Thread DbThread(ReadSocketDate, NULL, osPriorityNormal, (DEFAULT_STACK_SIZE * 2.25));
gert_lauritsen 0:ad2d0aa4726b 138
gert_lauritsen 0:ad2d0aa4726b 139 initSpeedCtrl();
gert_lauritsen 0:ad2d0aa4726b 140
gert_lauritsen 0:ad2d0aa4726b 141 pc.printf("---------------------------------------------------------------\n\r");
gert_lauritsen 0:ad2d0aa4726b 142
gert_lauritsen 0:ad2d0aa4726b 143 pc.printf("\n\rRunning ...\n\r");
gert_lauritsen 0:ad2d0aa4726b 144
gert_lauritsen 0:ad2d0aa4726b 145
gert_lauritsen 0:ad2d0aa4726b 146 while (1) {
gert_lauritsen 0:ad2d0aa4726b 147 ReadTemp();
gert_lauritsen 0:ad2d0aa4726b 148 //send data til PC
gert_lauritsen 0:ad2d0aa4726b 149 memcpy(&out_buffer[0],&status.CtrlType,sizeof(status));
gert_lauritsen 0:ad2d0aa4726b 150 sock.sendTo(process_server, out_buffer, sizeof(status));
gert_lauritsen 0:ad2d0aa4726b 151 // printf("Data to: %s Temp= %.1f Out[0] %x \r\n",process_server.get_address(),status.tempeture, out_buffer[0]);
gert_lauritsen 0:ad2d0aa4726b 152 wait(RATE);
gert_lauritsen 0:ad2d0aa4726b 153 }
gert_lauritsen 0:ad2d0aa4726b 154 }