
AC dimmer
main.cpp@0:e77768001bf6, 2014-12-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |