放出機構コントローラ用プログラム

Dependencies:   mbed BMP180

Committer:
scb01166
Date:
Tue Dec 15 07:21:08 2020 +0000
Revision:
1:3d4042d58038
Parent:
0:7bea87fe7ce1
Child:
2:76f6a32f9404
shorten the update frequency (1s shorter); (considering the time taken by xbee communication, whole update frequency is about 2s)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
scb01166 0:7bea87fe7ce1 1 #include "mbed.h"
scb01166 0:7bea87fe7ce1 2 #include "BMP180.h"
scb01166 0:7bea87fe7ce1 3 #include <stdio.h>
scb01166 0:7bea87fe7ce1 4 #include <stdlib.h>
scb01166 0:7bea87fe7ce1 5 #include <math.h>
scb01166 0:7bea87fe7ce1 6 #include <string.h>
scb01166 0:7bea87fe7ce1 7
scb01166 0:7bea87fe7ce1 8
scb01166 0:7bea87fe7ce1 9 I2C bmp(D4, D5);
scb01166 0:7bea87fe7ce1 10 BMP180 bmp180(&bmp);
scb01166 0:7bea87fe7ce1 11 Serial xbee(PA_9, PA_10);
scb01166 0:7bea87fe7ce1 12 I2C i2c(D4, D5); // sda, scl
scb01166 0:7bea87fe7ce1 13 #include "SSD1306.h"
scb01166 0:7bea87fe7ce1 14 DigitalOut led(LED1);
scb01166 0:7bea87fe7ce1 15 DigitalIn button(A1);
scb01166 0:7bea87fe7ce1 16 DigitalOut led_button(A2);
scb01166 0:7bea87fe7ce1 17 const int AQCM0802_addr = 0x7C;
scb01166 0:7bea87fe7ce1 18
scb01166 0:7bea87fe7ce1 19 unsigned char mode;
scb01166 0:7bea87fe7ce1 20 unsigned char contrast = 0; // 0-63
scb01166 0:7bea87fe7ce1 21 unsigned char contrastFlag = false;
scb01166 0:7bea87fe7ce1 22 int CGcounter;
scb01166 0:7bea87fe7ce1 23 int FADEcounter;
scb01166 0:7bea87fe7ce1 24
scb01166 0:7bea87fe7ce1 25 void lcd_cmd(char x)
scb01166 0:7bea87fe7ce1 26 {
scb01166 0:7bea87fe7ce1 27 char data[2];
scb01166 0:7bea87fe7ce1 28 data[0] = 0x00; // CO = 0,RS = 0
scb01166 0:7bea87fe7ce1 29 data[1] = x;
scb01166 0:7bea87fe7ce1 30 i2c.write(AQCM0802_addr, data, 2);
scb01166 0:7bea87fe7ce1 31 }
scb01166 0:7bea87fe7ce1 32
scb01166 0:7bea87fe7ce1 33 void lcd_contdata(char x)
scb01166 0:7bea87fe7ce1 34 {
scb01166 0:7bea87fe7ce1 35 char data[2];
scb01166 0:7bea87fe7ce1 36 data[0] = 0xC0; //0b11000000 CO = 1, RS = 1
scb01166 0:7bea87fe7ce1 37 data[1] = x;
scb01166 0:7bea87fe7ce1 38 i2c.write(AQCM0802_addr, data, 2);
scb01166 0:7bea87fe7ce1 39 }
scb01166 0:7bea87fe7ce1 40
scb01166 0:7bea87fe7ce1 41 void lcd_lastdata(char x)
scb01166 0:7bea87fe7ce1 42 {
scb01166 0:7bea87fe7ce1 43 char data[2];
scb01166 0:7bea87fe7ce1 44 data[0] = 0x40; //0b11000000 CO = 0, RS = 1
scb01166 0:7bea87fe7ce1 45 data[1] = x;
scb01166 0:7bea87fe7ce1 46 i2c.write(AQCM0802_addr, data, 2);
scb01166 0:7bea87fe7ce1 47 }
scb01166 0:7bea87fe7ce1 48
scb01166 0:7bea87fe7ce1 49 void lcd_printStr(const char *s)
scb01166 0:7bea87fe7ce1 50 {
scb01166 0:7bea87fe7ce1 51 while(*s) {
scb01166 0:7bea87fe7ce1 52 if(*(s + 1)) {
scb01166 0:7bea87fe7ce1 53 lcd_contdata(*s);
scb01166 0:7bea87fe7ce1 54 } else {
scb01166 0:7bea87fe7ce1 55 lcd_lastdata(*s);
scb01166 0:7bea87fe7ce1 56 }
scb01166 0:7bea87fe7ce1 57 s++;
scb01166 0:7bea87fe7ce1 58 }
scb01166 0:7bea87fe7ce1 59 }
scb01166 0:7bea87fe7ce1 60
scb01166 0:7bea87fe7ce1 61 void lcd_printHex(unsigned char num)
scb01166 0:7bea87fe7ce1 62 {
scb01166 0:7bea87fe7ce1 63 lcd_contdata(num);
scb01166 0:7bea87fe7ce1 64 }
scb01166 0:7bea87fe7ce1 65
scb01166 0:7bea87fe7ce1 66 void lcd_init()
scb01166 0:7bea87fe7ce1 67 {
scb01166 0:7bea87fe7ce1 68 wait(0.04);
scb01166 0:7bea87fe7ce1 69 // LCD initialize
scb01166 0:7bea87fe7ce1 70 lcd_cmd(0x38); // function set
scb01166 0:7bea87fe7ce1 71 lcd_cmd(0x39); // function set
scb01166 0:7bea87fe7ce1 72 lcd_cmd(0x04); // EntryModeSet
scb01166 0:7bea87fe7ce1 73 lcd_cmd(0x14); // interval osc
scb01166 0:7bea87fe7ce1 74 lcd_cmd(0x70 | (contrast & 0xF)); // contrast Low
scb01166 0:7bea87fe7ce1 75 lcd_cmd(0x5C | ((contrast >> 4) & 0x3)); // contast High/icon/power
scb01166 0:7bea87fe7ce1 76 lcd_cmd(0x6C); // follower control
scb01166 0:7bea87fe7ce1 77 wait(0.2);
scb01166 0:7bea87fe7ce1 78 lcd_cmd(0x38); // function set
scb01166 0:7bea87fe7ce1 79 lcd_cmd(0x0C); // Display On
scb01166 0:7bea87fe7ce1 80 lcd_cmd(0x01); // Clear Display
scb01166 0:7bea87fe7ce1 81 wait(0.2); // need additional wait to Clear Display
scb01166 0:7bea87fe7ce1 82 }
scb01166 0:7bea87fe7ce1 83
scb01166 0:7bea87fe7ce1 84 void lcd_setCursor(unsigned char x,unsigned char y)
scb01166 0:7bea87fe7ce1 85 {
scb01166 0:7bea87fe7ce1 86 lcd_cmd(0x80 | (y * 0x40 + x));
scb01166 0:7bea87fe7ce1 87 }
scb01166 0:7bea87fe7ce1 88
scb01166 0:7bea87fe7ce1 89 void setContrast(unsigned char c)
scb01166 0:7bea87fe7ce1 90 {
scb01166 0:7bea87fe7ce1 91 lcd_cmd(0x39);
scb01166 0:7bea87fe7ce1 92 lcd_cmd(0x70 | (c & 0x0f)); // contrast Low
scb01166 0:7bea87fe7ce1 93 lcd_cmd(0x5C | ((c >> 4) & 0x03)); // contast High/icon/power
scb01166 0:7bea87fe7ce1 94 lcd_cmd(0x38);
scb01166 0:7bea87fe7ce1 95 }
scb01166 0:7bea87fe7ce1 96
scb01166 0:7bea87fe7ce1 97 float get_P()
scb01166 0:7bea87fe7ce1 98 {
scb01166 0:7bea87fe7ce1 99 float sum = 0.0f;
scb01166 0:7bea87fe7ce1 100 for(int i=0;i<10;i++){
scb01166 0:7bea87fe7ce1 101 bmp180.startPressure(BMP180::ULTRA_LOW_POWER);
scb01166 0:7bea87fe7ce1 102 wait_ms(10); // Wait for conversion to complete
scb01166 0:7bea87fe7ce1 103 int pressure;
scb01166 0:7bea87fe7ce1 104 if(bmp180.getPressure(&pressure) != 0) {
scb01166 0:7bea87fe7ce1 105 printf("Error getting pressure\n");
scb01166 0:7bea87fe7ce1 106 }
scb01166 0:7bea87fe7ce1 107 sum += pressure;
scb01166 0:7bea87fe7ce1 108 }
scb01166 0:7bea87fe7ce1 109 return sum/1000.0f;
scb01166 0:7bea87fe7ce1 110 }
scb01166 0:7bea87fe7ce1 111
scb01166 0:7bea87fe7ce1 112 float get_T()
scb01166 0:7bea87fe7ce1 113 {
scb01166 0:7bea87fe7ce1 114 float sum = 0.0f;
scb01166 0:7bea87fe7ce1 115 for(int i=0;i<10;i++){
scb01166 0:7bea87fe7ce1 116 bmp180.startTemperature();
scb01166 0:7bea87fe7ce1 117 wait_ms(5); // Wait for conversion to complete
scb01166 0:7bea87fe7ce1 118 float temp;
scb01166 0:7bea87fe7ce1 119 if(bmp180.getTemperature(&temp) != 0) {
scb01166 0:7bea87fe7ce1 120 printf("Error getting temperature\n");
scb01166 0:7bea87fe7ce1 121 }
scb01166 0:7bea87fe7ce1 122 sum += temp;
scb01166 0:7bea87fe7ce1 123 }
scb01166 0:7bea87fe7ce1 124 return sum/10.0f;
scb01166 0:7bea87fe7ce1 125 }
scb01166 0:7bea87fe7ce1 126
scb01166 0:7bea87fe7ce1 127
scb01166 0:7bea87fe7ce1 128 int main()
scb01166 0:7bea87fe7ce1 129 {
scb01166 0:7bea87fe7ce1 130 ssd1306_init();
scb01166 0:7bea87fe7ce1 131 ssd1306_init_meter_display();
scb01166 0:7bea87fe7ce1 132 button.mode(PullUp);
scb01166 0:7bea87fe7ce1 133 while(1) {
scb01166 0:7bea87fe7ce1 134 if (bmp180.init() != 0) {
scb01166 0:7bea87fe7ce1 135 printf("Error communicating with BMP180\n");
scb01166 0:7bea87fe7ce1 136 } else {
scb01166 0:7bea87fe7ce1 137 printf("Initialized BMP180\n");
scb01166 0:7bea87fe7ce1 138 break;
scb01166 0:7bea87fe7ce1 139 }
scb01166 0:7bea87fe7ce1 140 wait(1);
scb01166 0:7bea87fe7ce1 141 }
scb01166 0:7bea87fe7ce1 142
scb01166 0:7bea87fe7ce1 143 char buf[64] = {};
scb01166 0:7bea87fe7ce1 144 int buf_count = 0;
scb01166 0:7bea87fe7ce1 145 float pressure, temp, ground_P, ground_T, height;
scb01166 0:7bea87fe7ce1 146 bool init = false;
scb01166 0:7bea87fe7ce1 147 char str_lcd[15];
scb01166 0:7bea87fe7ce1 148 char strtmp[15];
scb01166 0:7bea87fe7ce1 149 int n;
scb01166 0:7bea87fe7ce1 150 lcd_init();
scb01166 0:7bea87fe7ce1 151 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 152 lcd_printStr("Hello");
scb01166 0:7bea87fe7ce1 153 lcd_setCursor(3,1);
scb01166 0:7bea87fe7ce1 154 lcd_printStr("SSSRC");
scb01166 0:7bea87fe7ce1 155 contrast = 35;
scb01166 0:7bea87fe7ce1 156 setContrast(contrast);
scb01166 0:7bea87fe7ce1 157 while(1) {
scb01166 0:7bea87fe7ce1 158 int timer = 0;
scb01166 0:7bea87fe7ce1 159 int bb = button;
scb01166 0:7bea87fe7ce1 160 while(!bb){
scb01166 0:7bea87fe7ce1 161 led_button = 1;
scb01166 0:7bea87fe7ce1 162 if(timer == 0){
scb01166 0:7bea87fe7ce1 163 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 164 lcd_printStr("55555555");
scb01166 0:7bea87fe7ce1 165 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 166 lcd_printStr("55555555");
scb01166 0:7bea87fe7ce1 167 contrast = 35;
scb01166 0:7bea87fe7ce1 168 }else if(timer == 10){
scb01166 0:7bea87fe7ce1 169 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 170 lcd_printStr("44444444");
scb01166 0:7bea87fe7ce1 171 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 172 lcd_printStr("44444444");
scb01166 0:7bea87fe7ce1 173 contrast = 35;
scb01166 0:7bea87fe7ce1 174 }else if(timer == 20){
scb01166 0:7bea87fe7ce1 175 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 176 lcd_printStr("33333333");
scb01166 0:7bea87fe7ce1 177 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 178 lcd_printStr("33333333");
scb01166 0:7bea87fe7ce1 179 contrast = 35;
scb01166 0:7bea87fe7ce1 180 }else if(timer == 30){
scb01166 0:7bea87fe7ce1 181 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 182 lcd_printStr("22222222");
scb01166 0:7bea87fe7ce1 183 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 184 lcd_printStr("22222222");
scb01166 0:7bea87fe7ce1 185 contrast = 35;
scb01166 0:7bea87fe7ce1 186 }else if(timer == 40){
scb01166 0:7bea87fe7ce1 187 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 188 lcd_printStr("11111111");
scb01166 0:7bea87fe7ce1 189 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 190 lcd_printStr("11111111");
scb01166 0:7bea87fe7ce1 191 contrast = 35;
scb01166 0:7bea87fe7ce1 192 }else if(timer>=50){
scb01166 0:7bea87fe7ce1 193 xbee.printf("O");
scb01166 0:7bea87fe7ce1 194 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 195 lcd_printStr("CanSat ");
scb01166 0:7bea87fe7ce1 196 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 197 lcd_printStr(" Deploy!");
scb01166 0:7bea87fe7ce1 198 contrast = 35;
scb01166 0:7bea87fe7ce1 199 }
scb01166 0:7bea87fe7ce1 200 wait(0.1);
scb01166 0:7bea87fe7ce1 201 timer++;
scb01166 0:7bea87fe7ce1 202 bb = button;
scb01166 0:7bea87fe7ce1 203 }
scb01166 0:7bea87fe7ce1 204 led_button = 0;
scb01166 0:7bea87fe7ce1 205 //buf[0] = '0';
scb01166 0:7bea87fe7ce1 206 while(xbee.readable()==0) {
scb01166 0:7bea87fe7ce1 207 xbee.printf("G");
scb01166 0:7bea87fe7ce1 208 }
scb01166 0:7bea87fe7ce1 209 while(1) {
scb01166 0:7bea87fe7ce1 210 int c = xbee.getc();
scb01166 0:7bea87fe7ce1 211 //printf("%c",c);
scb01166 0:7bea87fe7ce1 212 if(buf_count == 0 && c != 'P') {
scb01166 0:7bea87fe7ce1 213 continue;
scb01166 0:7bea87fe7ce1 214 }
scb01166 0:7bea87fe7ce1 215 buf[buf_count] = c;
scb01166 0:7bea87fe7ce1 216 buf_count++;
scb01166 0:7bea87fe7ce1 217 if(c == '\n') {
scb01166 0:7bea87fe7ce1 218 buf[buf_count] = '\0';
scb01166 0:7bea87fe7ce1 219 printf("buf:%s\r\n",buf);
scb01166 0:7bea87fe7ce1 220 sscanf(buf,"PP%fT%f\n", &pressure, &temp);
scb01166 0:7bea87fe7ce1 221 pressure += 1.77f;
scb01166 0:7bea87fe7ce1 222 buf_count = 0;
scb01166 0:7bea87fe7ce1 223 bool push = false;
scb01166 1:3d4042d58038 224 for(int i=0;i<8;i++){
scb01166 0:7bea87fe7ce1 225 bb = button;
scb01166 0:7bea87fe7ce1 226 if(!bb){
scb01166 0:7bea87fe7ce1 227 led_button = 1;
scb01166 0:7bea87fe7ce1 228 push = true;
scb01166 0:7bea87fe7ce1 229 break;
scb01166 0:7bea87fe7ce1 230 }
scb01166 0:7bea87fe7ce1 231 wait(0.1);
scb01166 0:7bea87fe7ce1 232 }
scb01166 0:7bea87fe7ce1 233 if(push) break;
scb01166 0:7bea87fe7ce1 234 led = 1;
scb01166 0:7bea87fe7ce1 235 for(int i=0;i<2;i++){
scb01166 0:7bea87fe7ce1 236 bb = button;
scb01166 0:7bea87fe7ce1 237 if(!bb){
scb01166 0:7bea87fe7ce1 238 led_button = 1;
scb01166 0:7bea87fe7ce1 239 push = true;
scb01166 0:7bea87fe7ce1 240 break;
scb01166 0:7bea87fe7ce1 241 }
scb01166 0:7bea87fe7ce1 242 wait(0.1);
scb01166 1:3d4042d58038 243 led = !led;
scb01166 0:7bea87fe7ce1 244 }
scb01166 1:3d4042d58038 245 led = 0;
scb01166 0:7bea87fe7ce1 246 if(push) break;
scb01166 0:7bea87fe7ce1 247 ground_P = get_P();
scb01166 0:7bea87fe7ce1 248 ground_T = get_T();
scb01166 0:7bea87fe7ce1 249 //height = ( pow(ground_P/pressure, 1/5.257f)-1 )*(temp+273.15f)/0.0065f;
scb01166 0:7bea87fe7ce1 250 height = 290*((temp+ground_T)/2+273.15f)/9.80665f*log(ground_P/pressure);
scb01166 0:7bea87fe7ce1 251 if(init) {
scb01166 0:7bea87fe7ce1 252 printf("P0=%f P=%f T=%f B-G=%f\r\n--------------------\r\n",ground_P,pressure,temp,pressure-ground_P);
scb01166 0:7bea87fe7ce1 253 if(height<-100 or height>1000) continue;
scb01166 0:7bea87fe7ce1 254 if(pressure-ground_P>0) height=0.0;
scb01166 0:7bea87fe7ce1 255 sprintf(str_lcd,"%.1fhPa",ground_P-pressure);
scb01166 0:7bea87fe7ce1 256 n=8-strlen(str_lcd);
scb01166 0:7bea87fe7ce1 257 for(int i=0; i<n; i++) {
scb01166 0:7bea87fe7ce1 258 sprintf(strtmp," %s",str_lcd);
scb01166 0:7bea87fe7ce1 259 sprintf(str_lcd,"%s",strtmp);
scb01166 0:7bea87fe7ce1 260 }
scb01166 0:7bea87fe7ce1 261 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 262 lcd_printStr(str_lcd);
scb01166 0:7bea87fe7ce1 263 printf("%s\r\n",str_lcd);
scb01166 0:7bea87fe7ce1 264
scb01166 0:7bea87fe7ce1 265 sprintf(str_lcd,"%.1f""\xf2""C",ground_T);
scb01166 0:7bea87fe7ce1 266 n=8-strlen(str_lcd);
scb01166 0:7bea87fe7ce1 267 for(int i=0; i<n; i++) {
scb01166 0:7bea87fe7ce1 268 sprintf(strtmp," %s",str_lcd);
scb01166 0:7bea87fe7ce1 269 sprintf(str_lcd,"%s",strtmp);
scb01166 0:7bea87fe7ce1 270 }
scb01166 0:7bea87fe7ce1 271
scb01166 0:7bea87fe7ce1 272 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 273 lcd_printStr(str_lcd);
scb01166 0:7bea87fe7ce1 274 contrast = 35;
scb01166 0:7bea87fe7ce1 275 setContrast(contrast);
scb01166 0:7bea87fe7ce1 276 printf("%s\r\n\r\n",str_lcd);
scb01166 0:7bea87fe7ce1 277 printf("height=%f m\r\n",height);
scb01166 0:7bea87fe7ce1 278 ssd1306_draw_meter( (int)height );
scb01166 0:7bea87fe7ce1 279 }
scb01166 0:7bea87fe7ce1 280 init = true;
scb01166 0:7bea87fe7ce1 281 printf("P0=%f P=%f T=%f B-G=%f\r\n--------------------\r\n",ground_P,pressure,temp,pressure-ground_P);
scb01166 0:7bea87fe7ce1 282 }
scb01166 0:7bea87fe7ce1 283 break;
scb01166 0:7bea87fe7ce1 284 }
scb01166 0:7bea87fe7ce1 285 }
scb01166 0:7bea87fe7ce1 286 }