AC dimmer

Dependencies:   mbed tsi_sensor

Committer:
iulian_radu
Date:
Sat Dec 13 11:51:17 2014 +0000
Revision:
0:e77768001bf6
Child:
1:513c1ae9298f
final commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iulian_radu 0:e77768001bf6 1 #include "mbed.h"
iulian_radu 0:e77768001bf6 2 #include "tsi_sensor.h"
iulian_radu 0:e77768001bf6 3
iulian_radu 0:e77768001bf6 4 union message{
iulian_radu 0:e77768001bf6 5 unsigned short body;
iulian_radu 0:e77768001bf6 6 struct {
iulian_radu 0:e77768001bf6 7 char data:8;
iulian_radu 0:e77768001bf6 8 char cmd:8;
iulian_radu 0:e77768001bf6 9 };
iulian_radu 0:e77768001bf6 10 };
iulian_radu 0:e77768001bf6 11
iulian_radu 0:e77768001bf6 12 //defines
iulian_radu 0:e77768001bf6 13 #define ERROR_CMD(x) x = x | 0xC0
iulian_radu 0:e77768001bf6 14 #define ERROR_MSG(x) x = x | 0xC000
iulian_radu 0:e77768001bf6 15 #define MSG_DEFAULT 0x8000 | MIN_DIMM_VALUE
iulian_radu 0:e77768001bf6 16
iulian_radu 0:e77768001bf6 17 #define MAX_PERIOD 9600 // us // teoretic 10ms
iulian_radu 0:e77768001bf6 18 #define TRIAC_ON_TIME 25 //us // latimea pulsului pentru activarea triacului.
iulian_radu 0:e77768001bf6 19 #define DIMM_RX_BUFFER 6
iulian_radu 0:e77768001bf6 20 #define CONNECTION 3 // 1-PC // 2 - BT // 3 - PC + BT
iulian_radu 0:e77768001bf6 21
iulian_radu 0:e77768001bf6 22 char STEPS = 255;
iulian_radu 0:e77768001bf6 23 signed char AUTO_DIMM_STEP = 1;
iulian_radu 0:e77768001bf6 24 float AUTO_DIMM_PERIOD = 0.01;
iulian_radu 0:e77768001bf6 25 char MIN_DIMM_VALUE = 1;
iulian_radu 0:e77768001bf6 26 char MAX_DIMM_VALUE = STEPS;
iulian_radu 0:e77768001bf6 27
iulian_radu 0:e77768001bf6 28 PwmOut LED(LED_GREEN); // on board LED
iulian_radu 0:e77768001bf6 29 DigitalOut triacOut(PTD5); //output to Opto Triac
iulian_radu 0:e77768001bf6 30 InterruptIn zerroCross(PTA13); // only port A or D
iulian_radu 0:e77768001bf6 31 TSIAnalogSlider tsi(9, 10, 39); // board slider
iulian_radu 0:e77768001bf6 32 Serial pc(USBTX, USBRX);
iulian_radu 0:e77768001bf6 33 Serial bt(PTA2,PTA1);
iulian_radu 0:e77768001bf6 34
iulian_radu 0:e77768001bf6 35 Ticker cycling;
iulian_radu 0:e77768001bf6 36 Timeout timer;
iulian_radu 0:e77768001bf6 37
iulian_radu 0:e77768001bf6 38 char buffer[DIMM_RX_BUFFER]; // rx buffer
iulian_radu 0:e77768001bf6 39 signed char direction = AUTO_DIMM_STEP;
iulian_radu 0:e77768001bf6 40 char dimmingLevel = MIN_DIMM_VALUE;
iulian_radu 0:e77768001bf6 41 char regDimmingLevel = MIN_DIMM_VALUE;
iulian_radu 0:e77768001bf6 42 union message msg, aux;
iulian_radu 0:e77768001bf6 43
iulian_radu 0:e77768001bf6 44 void setTriacOff(void){
iulian_radu 0:e77768001bf6 45 triacOut = 0;
iulian_radu 0:e77768001bf6 46 timer.detach();
iulian_radu 0:e77768001bf6 47 }
iulian_radu 0:e77768001bf6 48
iulian_radu 0:e77768001bf6 49 void setTriacOn(void){
iulian_radu 0:e77768001bf6 50 triacOut = 1;
iulian_radu 0:e77768001bf6 51 timer.detach();
iulian_radu 0:e77768001bf6 52 timer.attach_us(&setTriacOff,TRIAC_ON_TIME);
iulian_radu 0:e77768001bf6 53 }
iulian_radu 0:e77768001bf6 54
iulian_radu 0:e77768001bf6 55 void changeDimmingLevel(int val){
iulian_radu 0:e77768001bf6 56 if(val >= MIN_DIMM_VALUE && val <= MAX_DIMM_VALUE)
iulian_radu 0:e77768001bf6 57 dimmingLevel = val;
iulian_radu 0:e77768001bf6 58 }
iulian_radu 0:e77768001bf6 59
iulian_radu 0:e77768001bf6 60 void dimmingInterval(){
iulian_radu 0:e77768001bf6 61 if(dimmingLevel < msg.data)
iulian_radu 0:e77768001bf6 62 changeDimmingLevel(dimmingLevel + AUTO_DIMM_STEP); // direction up
iulian_radu 0:e77768001bf6 63 else if (dimmingLevel > msg.data)
iulian_radu 0:e77768001bf6 64 changeDimmingLevel(dimmingLevel - AUTO_DIMM_STEP); // direccion down
iulian_radu 0:e77768001bf6 65 else{
iulian_radu 0:e77768001bf6 66 cycling.detach();
iulian_radu 0:e77768001bf6 67 direction = 0;
iulian_radu 0:e77768001bf6 68 }
iulian_radu 0:e77768001bf6 69 }
iulian_radu 0:e77768001bf6 70
iulian_radu 0:e77768001bf6 71 void printMessage(message msg, char *s, char err){
iulian_radu 0:e77768001bf6 72 switch(CONNECTION){
iulian_radu 0:e77768001bf6 73 case 1:
iulian_radu 0:e77768001bf6 74 if(!err)
iulian_radu 0:e77768001bf6 75 pc.printf("%s# MSG: %u CMD: %u DATA: %u\n", s, msg.body, msg.cmd, msg.data);
iulian_radu 0:e77768001bf6 76 else
iulian_radu 0:e77768001bf6 77 pc.printf("%s# CMD: %u DATA %u \n",s, ERROR_CMD(msg.cmd), msg.data);
iulian_radu 0:e77768001bf6 78 break;
iulian_radu 0:e77768001bf6 79 case 2:
iulian_radu 0:e77768001bf6 80 if(!err)
iulian_radu 0:e77768001bf6 81 bt.printf("%u",msg.body);
iulian_radu 0:e77768001bf6 82 else
iulian_radu 0:e77768001bf6 83 bt.printf("%u",ERROR_MSG(msg.body));
iulian_radu 0:e77768001bf6 84 break;
iulian_radu 0:e77768001bf6 85 case 3:
iulian_radu 0:e77768001bf6 86 if(!err){
iulian_radu 0:e77768001bf6 87 pc.printf("%s# MSG: %u CMD: %u DATA: %u\n",s,msg.body, msg.cmd, msg.data);
iulian_radu 0:e77768001bf6 88 bt.printf("%u",msg.body);
iulian_radu 0:e77768001bf6 89 }else{
iulian_radu 0:e77768001bf6 90 pc.printf("%s# CMD: %u DATA %u \n",s, ERROR_CMD(msg.cmd), msg.data);
iulian_radu 0:e77768001bf6 91 bt.printf("%u",ERROR_MSG(msg.body));
iulian_radu 0:e77768001bf6 92 }
iulian_radu 0:e77768001bf6 93 break;
iulian_radu 0:e77768001bf6 94 }
iulian_radu 0:e77768001bf6 95 }
iulian_radu 0:e77768001bf6 96
iulian_radu 0:e77768001bf6 97
iulian_radu 0:e77768001bf6 98
iulian_radu 0:e77768001bf6 99 void ISR_zerroCross(void){
iulian_radu 0:e77768001bf6 100 timer.attach_us(&setTriacOn,(MAX_PERIOD/STEPS) * (STEPS - dimmingLevel));
iulian_radu 0:e77768001bf6 101 }
iulian_radu 0:e77768001bf6 102
iulian_radu 0:e77768001bf6 103 void ISR_Serial(void){
iulian_radu 0:e77768001bf6 104 bt.gets(buffer, DIMM_RX_BUFFER);
iulian_radu 0:e77768001bf6 105 LED = !LED;
iulian_radu 0:e77768001bf6 106 }
iulian_radu 0:e77768001bf6 107
iulian_radu 0:e77768001bf6 108 void readData(void)
iulian_radu 0:e77768001bf6 109 {
iulian_radu 0:e77768001bf6 110 if(bt.readable()) {
iulian_radu 0:e77768001bf6 111
iulian_radu 0:e77768001bf6 112 bt.gets(buffer, DIMM_RX_BUFFER);
iulian_radu 0:e77768001bf6 113 sscanf(buffer,"%u",&msg.body);
iulian_radu 0:e77768001bf6 114
iulian_radu 0:e77768001bf6 115 switch(msg.cmd){
iulian_radu 0:e77768001bf6 116 case 0x81: //CONN
iulian_radu 0:e77768001bf6 117 if(msg.data == 0xA5){
iulian_radu 0:e77768001bf6 118 msg.body = MSG_DEFAULT;
iulian_radu 0:e77768001bf6 119 printMessage(msg,"CONN",0);
iulian_radu 0:e77768001bf6 120 }else
iulian_radu 0:e77768001bf6 121 printMessage(msg,"ERR-CONN",1);
iulian_radu 0:e77768001bf6 122 break;
iulian_radu 0:e77768001bf6 123 case 0x82: //ON
iulian_radu 0:e77768001bf6 124 if(msg.data == 0xFF){
iulian_radu 0:e77768001bf6 125 cycling.attach(&dimmingInterval,AUTO_DIMM_PERIOD);
iulian_radu 0:e77768001bf6 126 printMessage(msg,"ON",0);
iulian_radu 0:e77768001bf6 127 }else
iulian_radu 0:e77768001bf6 128 printMessage(msg,"ERR-ON",1);
iulian_radu 0:e77768001bf6 129 break;
iulian_radu 0:e77768001bf6 130 case 0x83: //OFF
iulian_radu 0:e77768001bf6 131 if(msg.data == 0x01){
iulian_radu 0:e77768001bf6 132 cycling.attach(&dimmingInterval,AUTO_DIMM_PERIOD);
iulian_radu 0:e77768001bf6 133 printMessage(msg,"OFF",0);
iulian_radu 0:e77768001bf6 134 }else
iulian_radu 0:e77768001bf6 135 printMessage(msg,"ERR-OFF",1);
iulian_radu 0:e77768001bf6 136 break;
iulian_radu 0:e77768001bf6 137 case 0x84: //DIMM
iulian_radu 0:e77768001bf6 138 cycling.attach(&dimmingInterval,AUTO_DIMM_PERIOD);
iulian_radu 0:e77768001bf6 139 printMessage(msg,"DIMM",0);
iulian_radu 0:e77768001bf6 140 break;
iulian_radu 0:e77768001bf6 141 case 0x85: //TIME/STEP
iulian_radu 0:e77768001bf6 142 if(msg.data <= 0xFF && msg.data > 0x00){
iulian_radu 0:e77768001bf6 143 AUTO_DIMM_PERIOD = (float)((float)msg.data /1000);
iulian_radu 0:e77768001bf6 144 printMessage(msg,"TIME/STEP (ms)",0);
iulian_radu 0:e77768001bf6 145 }else
iulian_radu 0:e77768001bf6 146 printMessage(msg,"ERR-TIME/STEP",1);
iulian_radu 0:e77768001bf6 147 break;
iulian_radu 0:e77768001bf6 148 case 0x8A: //ASK
iulian_radu 0:e77768001bf6 149 aux.cmd = 0x8A;
iulian_radu 0:e77768001bf6 150 switch(msg.data){
iulian_radu 0:e77768001bf6 151 case 0x01: //DIMM
iulian_radu 0:e77768001bf6 152 aux.data = dimmingLevel;
iulian_radu 0:e77768001bf6 153 printMessage(aux,"DIMM LEVEL",0);
iulian_radu 0:e77768001bf6 154 break;
iulian_radu 0:e77768001bf6 155 case 0x02: // TIME/STEP
iulian_radu 0:e77768001bf6 156 aux.data = (unsigned short)(AUTO_DIMM_PERIOD*1000);
iulian_radu 0:e77768001bf6 157 printMessage(aux,"TIME/STEP (ms)",0);
iulian_radu 0:e77768001bf6 158 break;
iulian_radu 0:e77768001bf6 159 default:
iulian_radu 0:e77768001bf6 160 aux.data = 0x00;
iulian_radu 0:e77768001bf6 161 printMessage(aux, "ERR-ASK-CMD", 1);
iulian_radu 0:e77768001bf6 162 break;
iulian_radu 0:e77768001bf6 163 }
iulian_radu 0:e77768001bf6 164 break;
iulian_radu 0:e77768001bf6 165 default:
iulian_radu 0:e77768001bf6 166 printMessage(msg, "ERR-CMD", 1);
iulian_radu 0:e77768001bf6 167 break;
iulian_radu 0:e77768001bf6 168 }
iulian_radu 0:e77768001bf6 169 }
iulian_radu 0:e77768001bf6 170 }
iulian_radu 0:e77768001bf6 171
iulian_radu 0:e77768001bf6 172 void testSlider(void){
iulian_radu 0:e77768001bf6 173 if (tsi.readPercentage())
iulian_radu 0:e77768001bf6 174 dimmingLevel= STEPS * (1.0 - tsi.readPercentage());
iulian_radu 0:e77768001bf6 175 }
iulian_radu 0:e77768001bf6 176
iulian_radu 0:e77768001bf6 177 void testDimming(void){
iulian_radu 0:e77768001bf6 178 if(dimmingLevel % (STEPS - AUTO_DIMM_STEP) == MIN_DIMM_VALUE)
iulian_radu 0:e77768001bf6 179 direction *= -1;
iulian_radu 0:e77768001bf6 180 changeDimmingLevel(dimmingLevel + direction);
iulian_radu 0:e77768001bf6 181 }
iulian_radu 0:e77768001bf6 182
iulian_radu 0:e77768001bf6 183 int main()
iulian_radu 0:e77768001bf6 184 {
iulian_radu 0:e77768001bf6 185 zerroCross.enable_irq(); //enable routine
iulian_radu 0:e77768001bf6 186 zerroCross.fall(&ISR_zerroCross); // falling edge interrupt routine
iulian_radu 0:e77768001bf6 187
iulian_radu 0:e77768001bf6 188 //cycling.attach(&testDimming,AUTO_DIMM_PERIOD);
iulian_radu 0:e77768001bf6 189 bt.attach(&ISR_Serial); // e mai bine fara intrerupere pentru ca nu apare intreruperea dimmingului
iulian_radu 0:e77768001bf6 190
iulian_radu 0:e77768001bf6 191 LED = 1; // led off.
iulian_radu 0:e77768001bf6 192 triacOut = 0; // triac off
iulian_radu 0:e77768001bf6 193
iulian_radu 0:e77768001bf6 194 while(true){
iulian_radu 0:e77768001bf6 195 //testSlider();
iulian_radu 0:e77768001bf6 196 //readData();
iulian_radu 0:e77768001bf6 197 }
iulian_radu 0:e77768001bf6 198 }