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

Dependencies:   mbed BMP180

Committer:
scb01166
Date:
Wed Dec 16 13:13:15 2020 +0000
Revision:
3:52396b1b5867
Parent:
2:76f6a32f9404
Added "NoSignal" message; Improved the response when pushing the deploy button

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 2:76f6a32f9404 160 bool deploy = false;
scb01166 0:7bea87fe7ce1 161 while(!bb){
scb01166 2:76f6a32f9404 162 deploy = true;
scb01166 0:7bea87fe7ce1 163 led_button = 1;
scb01166 0:7bea87fe7ce1 164 if(timer == 0){
scb01166 0:7bea87fe7ce1 165 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 166 lcd_printStr("55555555");
scb01166 0:7bea87fe7ce1 167 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 168 lcd_printStr("55555555");
scb01166 0:7bea87fe7ce1 169 contrast = 35;
scb01166 0:7bea87fe7ce1 170 }else if(timer == 10){
scb01166 0:7bea87fe7ce1 171 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 172 lcd_printStr("44444444");
scb01166 0:7bea87fe7ce1 173 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 174 lcd_printStr("44444444");
scb01166 0:7bea87fe7ce1 175 contrast = 35;
scb01166 0:7bea87fe7ce1 176 }else if(timer == 20){
scb01166 0:7bea87fe7ce1 177 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 178 lcd_printStr("33333333");
scb01166 0:7bea87fe7ce1 179 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 180 lcd_printStr("33333333");
scb01166 0:7bea87fe7ce1 181 contrast = 35;
scb01166 0:7bea87fe7ce1 182 }else if(timer == 30){
scb01166 0:7bea87fe7ce1 183 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 184 lcd_printStr("22222222");
scb01166 0:7bea87fe7ce1 185 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 186 lcd_printStr("22222222");
scb01166 0:7bea87fe7ce1 187 contrast = 35;
scb01166 0:7bea87fe7ce1 188 }else if(timer == 40){
scb01166 0:7bea87fe7ce1 189 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 190 lcd_printStr("11111111");
scb01166 0:7bea87fe7ce1 191 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 192 lcd_printStr("11111111");
scb01166 0:7bea87fe7ce1 193 contrast = 35;
scb01166 0:7bea87fe7ce1 194 }else if(timer>=50){
scb01166 0:7bea87fe7ce1 195 xbee.printf("O");
scb01166 0:7bea87fe7ce1 196 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 197 lcd_printStr("CanSat ");
scb01166 0:7bea87fe7ce1 198 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 199 lcd_printStr(" Deploy!");
scb01166 0:7bea87fe7ce1 200 contrast = 35;
scb01166 0:7bea87fe7ce1 201 }
scb01166 0:7bea87fe7ce1 202 wait(0.1);
scb01166 0:7bea87fe7ce1 203 timer++;
scb01166 0:7bea87fe7ce1 204 bb = button;
scb01166 0:7bea87fe7ce1 205 }
scb01166 2:76f6a32f9404 206 if(deploy){
scb01166 2:76f6a32f9404 207 lcd_setCursor(0,0);
scb01166 2:76f6a32f9404 208 lcd_printStr(" ");
scb01166 2:76f6a32f9404 209 lcd_setCursor(0,1);
scb01166 2:76f6a32f9404 210 lcd_printStr(" ");
scb01166 2:76f6a32f9404 211 contrast = 35;
scb01166 2:76f6a32f9404 212 }
scb01166 0:7bea87fe7ce1 213 led_button = 0;
scb01166 0:7bea87fe7ce1 214 //buf[0] = '0';
scb01166 3:52396b1b5867 215 int nosignal = 0;
scb01166 3:52396b1b5867 216 bool push = false;
scb01166 0:7bea87fe7ce1 217 while(xbee.readable()==0) {
scb01166 0:7bea87fe7ce1 218 xbee.printf("G");
scb01166 3:52396b1b5867 219 nosignal++;
scb01166 3:52396b1b5867 220 bb = button;
scb01166 3:52396b1b5867 221 if(nosignal == 5000){
scb01166 3:52396b1b5867 222 lcd_setCursor(0,0);
scb01166 3:52396b1b5867 223 lcd_printStr("NoSignal");
scb01166 3:52396b1b5867 224 lcd_setCursor(0,1);
scb01166 3:52396b1b5867 225 lcd_printStr(" ");
scb01166 3:52396b1b5867 226 contrast = 35;
scb01166 3:52396b1b5867 227 }else if(!bb && nosignal<5000){
scb01166 3:52396b1b5867 228 push = true;
scb01166 3:52396b1b5867 229 break;
scb01166 3:52396b1b5867 230 }
scb01166 3:52396b1b5867 231 }
scb01166 3:52396b1b5867 232 if(push){
scb01166 3:52396b1b5867 233 printf("1");
scb01166 3:52396b1b5867 234 continue;
scb01166 0:7bea87fe7ce1 235 }
scb01166 0:7bea87fe7ce1 236 while(1) {
scb01166 0:7bea87fe7ce1 237 int c = xbee.getc();
scb01166 0:7bea87fe7ce1 238 //printf("%c",c);
scb01166 0:7bea87fe7ce1 239 if(buf_count == 0 && c != 'P') {
scb01166 0:7bea87fe7ce1 240 continue;
scb01166 0:7bea87fe7ce1 241 }
scb01166 0:7bea87fe7ce1 242 buf[buf_count] = c;
scb01166 0:7bea87fe7ce1 243 buf_count++;
scb01166 0:7bea87fe7ce1 244 if(c == '\n') {
scb01166 0:7bea87fe7ce1 245 buf[buf_count] = '\0';
scb01166 0:7bea87fe7ce1 246 printf("buf:%s\r\n",buf);
scb01166 0:7bea87fe7ce1 247 sscanf(buf,"PP%fT%f\n", &pressure, &temp);
scb01166 0:7bea87fe7ce1 248 pressure += 1.77f;
scb01166 0:7bea87fe7ce1 249 buf_count = 0;
scb01166 3:52396b1b5867 250 while(xbee.readable()==1) {
scb01166 3:52396b1b5867 251 c = xbee.getc();
scb01166 3:52396b1b5867 252 }
scb01166 3:52396b1b5867 253 push = false;
scb01166 1:3d4042d58038 254 for(int i=0;i<8;i++){
scb01166 0:7bea87fe7ce1 255 bb = button;
scb01166 0:7bea87fe7ce1 256 if(!bb){
scb01166 0:7bea87fe7ce1 257 led_button = 1;
scb01166 0:7bea87fe7ce1 258 push = true;
scb01166 0:7bea87fe7ce1 259 break;
scb01166 0:7bea87fe7ce1 260 }
scb01166 0:7bea87fe7ce1 261 wait(0.1);
scb01166 0:7bea87fe7ce1 262 }
scb01166 3:52396b1b5867 263 if(push){
scb01166 3:52396b1b5867 264 printf("2");
scb01166 3:52396b1b5867 265 break;
scb01166 3:52396b1b5867 266 }
scb01166 0:7bea87fe7ce1 267 led = 1;
scb01166 0:7bea87fe7ce1 268 for(int i=0;i<2;i++){
scb01166 0:7bea87fe7ce1 269 bb = button;
scb01166 0:7bea87fe7ce1 270 if(!bb){
scb01166 0:7bea87fe7ce1 271 led_button = 1;
scb01166 0:7bea87fe7ce1 272 push = true;
scb01166 0:7bea87fe7ce1 273 break;
scb01166 0:7bea87fe7ce1 274 }
scb01166 0:7bea87fe7ce1 275 wait(0.1);
scb01166 1:3d4042d58038 276 led = !led;
scb01166 0:7bea87fe7ce1 277 }
scb01166 1:3d4042d58038 278 led = 0;
scb01166 3:52396b1b5867 279 if(push){
scb01166 3:52396b1b5867 280 printf("3");
scb01166 3:52396b1b5867 281 break;
scb01166 3:52396b1b5867 282 }
scb01166 0:7bea87fe7ce1 283 ground_P = get_P();
scb01166 0:7bea87fe7ce1 284 ground_T = get_T();
scb01166 0:7bea87fe7ce1 285 //height = ( pow(ground_P/pressure, 1/5.257f)-1 )*(temp+273.15f)/0.0065f;
scb01166 0:7bea87fe7ce1 286 height = 290*((temp+ground_T)/2+273.15f)/9.80665f*log(ground_P/pressure);
scb01166 0:7bea87fe7ce1 287 if(init) {
scb01166 0:7bea87fe7ce1 288 printf("P0=%f P=%f T=%f B-G=%f\r\n--------------------\r\n",ground_P,pressure,temp,pressure-ground_P);
scb01166 0:7bea87fe7ce1 289 if(height<-100 or height>1000) continue;
scb01166 0:7bea87fe7ce1 290 if(pressure-ground_P>0) height=0.0;
scb01166 0:7bea87fe7ce1 291 sprintf(str_lcd,"%.1fhPa",ground_P-pressure);
scb01166 0:7bea87fe7ce1 292 n=8-strlen(str_lcd);
scb01166 0:7bea87fe7ce1 293 for(int i=0; i<n; i++) {
scb01166 0:7bea87fe7ce1 294 sprintf(strtmp," %s",str_lcd);
scb01166 0:7bea87fe7ce1 295 sprintf(str_lcd,"%s",strtmp);
scb01166 0:7bea87fe7ce1 296 }
scb01166 0:7bea87fe7ce1 297 lcd_setCursor(0,0);
scb01166 0:7bea87fe7ce1 298 lcd_printStr(str_lcd);
scb01166 0:7bea87fe7ce1 299 printf("%s\r\n",str_lcd);
scb01166 0:7bea87fe7ce1 300
scb01166 0:7bea87fe7ce1 301 sprintf(str_lcd,"%.1f""\xf2""C",ground_T);
scb01166 0:7bea87fe7ce1 302 n=8-strlen(str_lcd);
scb01166 0:7bea87fe7ce1 303 for(int i=0; i<n; i++) {
scb01166 0:7bea87fe7ce1 304 sprintf(strtmp," %s",str_lcd);
scb01166 0:7bea87fe7ce1 305 sprintf(str_lcd,"%s",strtmp);
scb01166 0:7bea87fe7ce1 306 }
scb01166 0:7bea87fe7ce1 307
scb01166 0:7bea87fe7ce1 308 lcd_setCursor(0,1);
scb01166 0:7bea87fe7ce1 309 lcd_printStr(str_lcd);
scb01166 0:7bea87fe7ce1 310 contrast = 35;
scb01166 0:7bea87fe7ce1 311 setContrast(contrast);
scb01166 0:7bea87fe7ce1 312 printf("%s\r\n\r\n",str_lcd);
scb01166 0:7bea87fe7ce1 313 printf("height=%f m\r\n",height);
scb01166 0:7bea87fe7ce1 314 ssd1306_draw_meter( (int)height );
scb01166 0:7bea87fe7ce1 315 }
scb01166 0:7bea87fe7ce1 316 init = true;
scb01166 0:7bea87fe7ce1 317 printf("P0=%f P=%f T=%f B-G=%f\r\n--------------------\r\n",ground_P,pressure,temp,pressure-ground_P);
scb01166 0:7bea87fe7ce1 318 }
scb01166 0:7bea87fe7ce1 319 break;
scb01166 0:7bea87fe7ce1 320 }
scb01166 0:7bea87fe7ce1 321 }
scb01166 0:7bea87fe7ce1 322 }