part of the preparation works for Ina-city Hackerthon
Fork of Wio_3G_example by
main.cpp@76:fe9dd61c5f5c, 2018-08-22 (annotated)
- Committer:
- atomichan
- Date:
- Wed Aug 22 05:27:25 2018 +0000
- Revision:
- 76:fe9dd61c5f5c
- Parent:
- 75:f93c0063755c
- Child:
- 77:0194cca4103b
used for Ina-city Hackerthon
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jonathan Austin |
0:2757d7abb7d9 | 1 | #include "mbed.h" |
MACRUM | 71:7d17edde2e03 | 2 | #include "Grove_LCD_RGB_Backlight.h" |
MACRUM | 72:aa14c091f860 | 3 | #include "Grove_temperature.h" |
MACRUM | 73:d47320bcc568 | 4 | #include "WS2812.h" |
MACRUM | 73:d47320bcc568 | 5 | #include "PixelArray.h" |
MACRUM | 73:d47320bcc568 | 6 | #include "Servo.h" |
MACRUM | 73:d47320bcc568 | 7 | |
atomichan | 76:fe9dd61c5f5c | 8 | #include <sstream> |
atomichan | 76:fe9dd61c5f5c | 9 | #include "easy-connect.h" |
atomichan | 76:fe9dd61c5f5c | 10 | #include "https_request.h" |
atomichan | 76:fe9dd61c5f5c | 11 | #include "ssl_ca_pem.h" |
atomichan | 76:fe9dd61c5f5c | 12 | |
MACRUM | 73:d47320bcc568 | 13 | #if !defined(TARGET_WIO_3G) |
MACRUM | 73:d47320bcc568 | 14 | #error Selected target is not supported. |
MACRUM | 73:d47320bcc568 | 15 | #endif |
MACRUM | 70:cb6d36218441 | 16 | |
MACRUM | 70:cb6d36218441 | 17 | #define D20 (PB_4) |
MACRUM | 70:cb6d36218441 | 18 | #define D19 (PB_3) |
MACRUM | 70:cb6d36218441 | 19 | |
MACRUM | 73:d47320bcc568 | 20 | // on-board resources |
MACRUM | 74:847e5dc7b4d5 | 21 | |
MACRUM | 73:d47320bcc568 | 22 | Serial pc(USBTX, USBRX, 115200); |
MACRUM | 70:cb6d36218441 | 23 | DigitalOut GrovePower(PB_10, 1); |
MACRUM | 73:d47320bcc568 | 24 | |
MACRUM | 74:847e5dc7b4d5 | 25 | #define WS2812_BUF 8 |
MACRUM | 74:847e5dc7b4d5 | 26 | #define NUM_COLORS 8 |
MACRUM | 74:847e5dc7b4d5 | 27 | #define NUM_LEDS_PER_COLOR 8 |
MACRUM | 73:d47320bcc568 | 28 | #define H0 8 |
MACRUM | 73:d47320bcc568 | 29 | #define L0 32 |
MACRUM | 73:d47320bcc568 | 30 | #define H1 17 |
MACRUM | 73:d47320bcc568 | 31 | #define L1 32 |
MACRUM | 73:d47320bcc568 | 32 | |
MACRUM | 73:d47320bcc568 | 33 | DigitalOut LEDPower(PE_8, 1); |
MACRUM | 73:d47320bcc568 | 34 | PixelArray px(WS2812_BUF); |
MACRUM | 74:847e5dc7b4d5 | 35 | WS2812 ws(PB_1, WS2812_BUF, H0, L0, H1, L1); |
MACRUM | 74:847e5dc7b4d5 | 36 | |
MACRUM | 73:d47320bcc568 | 37 | // Grove sensors |
MACRUM | 74:847e5dc7b4d5 | 38 | |
MACRUM | 70:cb6d36218441 | 39 | DigitalOut led1(D38); |
MACRUM | 73:d47320bcc568 | 40 | AnalogIn ain(A6); // angle or light sensor |
MACRUM | 73:d47320bcc568 | 41 | InterruptIn btn(D20); // button or touch sensor |
MACRUM | 73:d47320bcc568 | 42 | Grove_LCD_RGB_Backlight lcd(I2C_SDA, I2C_SCL); |
MACRUM | 72:aa14c091f860 | 43 | Grove_temperature temp(A4); |
MACRUM | 74:847e5dc7b4d5 | 44 | |
MACRUM | 71:7d17edde2e03 | 45 | uint32_t button = 0; |
MACRUM | 70:cb6d36218441 | 46 | |
MACRUM | 70:cb6d36218441 | 47 | void push() |
MACRUM | 70:cb6d36218441 | 48 | { |
MACRUM | 71:7d17edde2e03 | 49 | button++; |
MACRUM | 70:cb6d36218441 | 50 | } |
Jonathan Austin |
0:2757d7abb7d9 | 51 | |
MACRUM | 73:d47320bcc568 | 52 | |
atomichan | 76:fe9dd61c5f5c | 53 | const char API_TOKEN[] = "tfa6Ud9FY760SfLLhHl3UBr0NFdVHEFLHvdjTsrW"; |
atomichan | 76:fe9dd61c5f5c | 54 | const char URL[] = "https://devzfyjsa.cybozu.com/k/v1/record.json"; |
atomichan | 76:fe9dd61c5f5c | 55 | |
atomichan | 76:fe9dd61c5f5c | 56 | int app_id = 1; |
atomichan | 76:fe9dd61c5f5c | 57 | |
atomichan | 76:fe9dd61c5f5c | 58 | // JSON simplicity parser |
atomichan | 76:fe9dd61c5f5c | 59 | char* j_paser( const char *buf , char *word , char *out ) |
atomichan | 76:fe9dd61c5f5c | 60 | { |
atomichan | 76:fe9dd61c5f5c | 61 | int i = 0; |
atomichan | 76:fe9dd61c5f5c | 62 | char *p; |
atomichan | 76:fe9dd61c5f5c | 63 | char _word[64] = "\"\0"; |
atomichan | 76:fe9dd61c5f5c | 64 | |
atomichan | 76:fe9dd61c5f5c | 65 | strcat(_word , word ); |
atomichan | 76:fe9dd61c5f5c | 66 | strcat(_word , "\"" ); |
atomichan | 76:fe9dd61c5f5c | 67 | |
atomichan | 76:fe9dd61c5f5c | 68 | p = strstr( (char*)buf , _word ) + 2 + strlen(_word); |
atomichan | 76:fe9dd61c5f5c | 69 | |
atomichan | 76:fe9dd61c5f5c | 70 | while( (p[i] != ',')&&(p[i] != '\n')&&(p[i] != '"') ) |
atomichan | 76:fe9dd61c5f5c | 71 | { |
atomichan | 76:fe9dd61c5f5c | 72 | out[i] = p[i]; |
atomichan | 76:fe9dd61c5f5c | 73 | i++; |
atomichan | 76:fe9dd61c5f5c | 74 | } |
atomichan | 76:fe9dd61c5f5c | 75 | out[i] = '\0'; |
atomichan | 76:fe9dd61c5f5c | 76 | |
atomichan | 76:fe9dd61c5f5c | 77 | return p; |
atomichan | 76:fe9dd61c5f5c | 78 | } |
atomichan | 76:fe9dd61c5f5c | 79 | |
atomichan | 76:fe9dd61c5f5c | 80 | |
atomichan | 76:fe9dd61c5f5c | 81 | |
atomichan | 76:fe9dd61c5f5c | 82 | |
MACRUM | 70:cb6d36218441 | 83 | int main() |
MACRUM | 70:cb6d36218441 | 84 | { |
MACRUM | 73:d47320bcc568 | 85 | char buf[20]; |
MACRUM | 73:d47320bcc568 | 86 | btn.fall(push); // set interrupt handler |
MACRUM | 70:cb6d36218441 | 87 | |
MACRUM | 73:d47320bcc568 | 88 | lcd.clear(); |
MACRUM | 73:d47320bcc568 | 89 | lcd.setRGB(0xff, 0x00, 0x00); |
MACRUM | 73:d47320bcc568 | 90 | lcd.locate(0, 0); |
MACRUM | 73:d47320bcc568 | 91 | lcd.print("Hello World!"); |
MACRUM | 73:d47320bcc568 | 92 | lcd.locate(0, 1); |
MACRUM | 73:d47320bcc568 | 93 | |
MACRUM | 74:847e5dc7b4d5 | 94 | // set up the colours we want to draw with |
MACRUM | 74:847e5dc7b4d5 | 95 | const int colorbuf[NUM_COLORS] = {0x000000, 0x2f0000,0x2f2f00,0x002f00,0x002f2f,0x00002f,0x2f002f, 0x2f2f2f}; |
MACRUM | 74:847e5dc7b4d5 | 96 | |
atomichan | 76:fe9dd61c5f5c | 97 | ::ws.useII(WS2812::PER_PIXEL); // use per-pixel intensity scaling |
MACRUM | 74:847e5dc7b4d5 | 98 | |
MACRUM | 74:847e5dc7b4d5 | 99 | // for each of the colours (j) write out 10 of them |
MACRUM | 74:847e5dc7b4d5 | 100 | // the pixels are written at the colour*10, plus the colour position |
MACRUM | 74:847e5dc7b4d5 | 101 | // all modulus 60 so it wraps around |
MACRUM | 74:847e5dc7b4d5 | 102 | for (int i = 0; i < WS2812_BUF; i++) { |
MACRUM | 74:847e5dc7b4d5 | 103 | px.Set(i, colorbuf[i]); |
MACRUM | 74:847e5dc7b4d5 | 104 | px.SetI(i, 0x80); |
MACRUM | 74:847e5dc7b4d5 | 105 | } |
MACRUM | 74:847e5dc7b4d5 | 106 | |
MACRUM | 74:847e5dc7b4d5 | 107 | pc.printf("hello, Mbed world\n"); |
MACRUM | 71:7d17edde2e03 | 108 | |
atomichan | 76:fe9dd61c5f5c | 109 | /* |
MACRUM | 70:cb6d36218441 | 110 | int cnt = 0; |
MACRUM | 75:f93c0063755c | 111 | int idx = 0; |
MACRUM | 74:847e5dc7b4d5 | 112 | |
Jonathan Austin |
0:2757d7abb7d9 | 113 | while (true) { |
MACRUM | 73:d47320bcc568 | 114 | pc.printf("count = %4d, button = %d, analog = %2.2f, temp = %2.2f\n", cnt++, button, ain.read(), temp.getTemperature()); |
MACRUM | 73:d47320bcc568 | 115 | sprintf(buf, "L=%2.2f, T=%2.2f", ain.read(), temp.getTemperature()); |
MACRUM | 75:f93c0063755c | 116 | |
MACRUM | 73:d47320bcc568 | 117 | lcd.setRGB(0xff, (255*ain.read()), 0x00); |
MACRUM | 73:d47320bcc568 | 118 | lcd.locate(0, 1); |
MACRUM | 73:d47320bcc568 | 119 | lcd.print(buf); |
MACRUM | 75:f93c0063755c | 120 | |
Jonathan Austin |
0:2757d7abb7d9 | 121 | led1 = !led1; |
MACRUM | 74:847e5dc7b4d5 | 122 | |
MACRUM | 75:f93c0063755c | 123 | ws.write_offsets(px.getBuf(), idx, idx, idx); |
MACRUM | 75:f93c0063755c | 124 | idx++; |
MACRUM | 75:f93c0063755c | 125 | if (idx >= WS2812_BUF) { |
MACRUM | 75:f93c0063755c | 126 | idx = 0; |
MACRUM | 74:847e5dc7b4d5 | 127 | } |
MACRUM | 74:847e5dc7b4d5 | 128 | |
mbed_official | 22:af9dcf379926 | 129 | wait(0.5); |
Jonathan Austin |
0:2757d7abb7d9 | 130 | } |
atomichan | 76:fe9dd61c5f5c | 131 | */ |
atomichan | 76:fe9dd61c5f5c | 132 | NetworkInterface* network = NULL; |
atomichan | 76:fe9dd61c5f5c | 133 | |
atomichan | 76:fe9dd61c5f5c | 134 | /* |
atomichan | 76:fe9dd61c5f5c | 135 | pc.baud(115200); |
atomichan | 76:fe9dd61c5f5c | 136 | |
atomichan | 76:fe9dd61c5f5c | 137 | lcd.cls(); |
atomichan | 76:fe9dd61c5f5c | 138 | lcd.locate(0,3); |
atomichan | 76:fe9dd61c5f5c | 139 | lcd.printf("Network Connect.."); |
atomichan | 76:fe9dd61c5f5c | 140 | */ |
atomichan | 76:fe9dd61c5f5c | 141 | |
atomichan | 76:fe9dd61c5f5c | 142 | pc.printf("\r\n----- Start -----\r\n"); |
atomichan | 76:fe9dd61c5f5c | 143 | |
atomichan | 76:fe9dd61c5f5c | 144 | network = easy_connect(true); // If true, prints out connection details. |
atomichan | 76:fe9dd61c5f5c | 145 | if (!network) { |
atomichan | 76:fe9dd61c5f5c | 146 | //lcd.printf("NG"); |
atomichan | 76:fe9dd61c5f5c | 147 | pc.printf("\r\n----- Network Error -----\r\n"); |
atomichan | 76:fe9dd61c5f5c | 148 | return -1; |
atomichan | 76:fe9dd61c5f5c | 149 | } |
atomichan | 76:fe9dd61c5f5c | 150 | |
atomichan | 76:fe9dd61c5f5c | 151 | //lcd.printf("OK"); |
atomichan | 76:fe9dd61c5f5c | 152 | pc.printf("\r\n----- Network Connected -----\r\n"); |
atomichan | 76:fe9dd61c5f5c | 153 | |
atomichan | 76:fe9dd61c5f5c | 154 | wait(2.0); |
atomichan | 76:fe9dd61c5f5c | 155 | |
atomichan | 76:fe9dd61c5f5c | 156 | while(1){ |
atomichan | 76:fe9dd61c5f5c | 157 | int id = 10; |
atomichan | 76:fe9dd61c5f5c | 158 | |
atomichan | 76:fe9dd61c5f5c | 159 | /* |
atomichan | 76:fe9dd61c5f5c | 160 | // ID select |
atomichan | 76:fe9dd61c5f5c | 161 | lcd.cls(); |
atomichan | 76:fe9dd61c5f5c | 162 | lcd.locate(0,3); |
atomichan | 76:fe9dd61c5f5c | 163 | lcd.printf("Please select id."); |
atomichan | 76:fe9dd61c5f5c | 164 | while(fire == 0){ |
atomichan | 76:fe9dd61c5f5c | 165 | lcd.locate(0,14); |
atomichan | 76:fe9dd61c5f5c | 166 | lcd.printf("id = "); |
atomichan | 76:fe9dd61c5f5c | 167 | if( up == 1) id++; |
atomichan | 76:fe9dd61c5f5c | 168 | if( down == 1) id--; |
atomichan | 76:fe9dd61c5f5c | 169 | lcd.printf("%d ",id); |
atomichan | 76:fe9dd61c5f5c | 170 | wait(0.2); |
atomichan | 76:fe9dd61c5f5c | 171 | } |
atomichan | 76:fe9dd61c5f5c | 172 | |
atomichan | 76:fe9dd61c5f5c | 173 | lcd.cls(); |
atomichan | 76:fe9dd61c5f5c | 174 | lcd.locate(0,3); |
atomichan | 76:fe9dd61c5f5c | 175 | lcd.printf("It is polling with the selected id."); |
atomichan | 76:fe9dd61c5f5c | 176 | */ |
atomichan | 76:fe9dd61c5f5c | 177 | |
atomichan | 76:fe9dd61c5f5c | 178 | // Set url |
atomichan | 76:fe9dd61c5f5c | 179 | std::stringstream ss_url; |
atomichan | 76:fe9dd61c5f5c | 180 | std::string s_url(URL); |
atomichan | 76:fe9dd61c5f5c | 181 | |
atomichan | 76:fe9dd61c5f5c | 182 | ss_url << s_url << "?app=" << app_id << "&id=" << id; |
atomichan | 76:fe9dd61c5f5c | 183 | |
atomichan | 76:fe9dd61c5f5c | 184 | string url = ss_url.str(); |
atomichan | 76:fe9dd61c5f5c | 185 | |
atomichan | 76:fe9dd61c5f5c | 186 | pc.printf("%s\r\n",url.c_str()); |
atomichan | 76:fe9dd61c5f5c | 187 | |
atomichan | 76:fe9dd61c5f5c | 188 | while(1){ |
atomichan | 76:fe9dd61c5f5c | 189 | pc.printf("\r\n----- HTTPS GET request -----\r\n"); |
atomichan | 76:fe9dd61c5f5c | 190 | HttpsRequest* get_req = new HttpsRequest(network, SSL_CA_PEM, HTTP_GET, url.c_str()); |
atomichan | 76:fe9dd61c5f5c | 191 | |
atomichan | 76:fe9dd61c5f5c | 192 | get_req->set_header("X-Cybozu-API-Token", API_TOKEN); |
atomichan | 76:fe9dd61c5f5c | 193 | |
atomichan | 76:fe9dd61c5f5c | 194 | HttpResponse* get_res = get_req->send(); |
atomichan | 76:fe9dd61c5f5c | 195 | |
atomichan | 76:fe9dd61c5f5c | 196 | pc.printf("\n----- HTTPS GET response [%d]-----\n",get_res->get_status_code()); |
atomichan | 76:fe9dd61c5f5c | 197 | |
atomichan | 76:fe9dd61c5f5c | 198 | if(get_res->get_status_code() == 200){ |
atomichan | 76:fe9dd61c5f5c | 199 | pc.printf("\n----- HTTPS GET response 200 -----\n"); |
atomichan | 76:fe9dd61c5f5c | 200 | const char* body = get_res->get_body_as_string().c_str(); |
atomichan | 76:fe9dd61c5f5c | 201 | |
atomichan | 76:fe9dd61c5f5c | 202 | pc.printf("%s\r\n",body); |
atomichan | 76:fe9dd61c5f5c | 203 | |
atomichan | 76:fe9dd61c5f5c | 204 | // Response JSON parse |
atomichan | 76:fe9dd61c5f5c | 205 | char value[256]; |
atomichan | 76:fe9dd61c5f5c | 206 | |
atomichan | 76:fe9dd61c5f5c | 207 | char* p = j_paser(body,"日付",value); |
atomichan | 76:fe9dd61c5f5c | 208 | j_paser(p,"value",value); |
atomichan | 76:fe9dd61c5f5c | 209 | printf("date:%s\r\n",value); |
atomichan | 76:fe9dd61c5f5c | 210 | |
atomichan | 76:fe9dd61c5f5c | 211 | /* |
atomichan | 76:fe9dd61c5f5c | 212 | lcd.cls(); |
atomichan | 76:fe9dd61c5f5c | 213 | lcd.locate(0,3); |
atomichan | 76:fe9dd61c5f5c | 214 | lcd.printf("Date:%s",value); |
atomichan | 76:fe9dd61c5f5c | 215 | */ |
atomichan | 76:fe9dd61c5f5c | 216 | |
atomichan | 76:fe9dd61c5f5c | 217 | p = j_paser(body,"文字列__1行_",value); |
atomichan | 76:fe9dd61c5f5c | 218 | j_paser(p,"value",value); |
atomichan | 76:fe9dd61c5f5c | 219 | printf("%s\r\n",value); |
atomichan | 76:fe9dd61c5f5c | 220 | |
atomichan | 76:fe9dd61c5f5c | 221 | /* |
atomichan | 76:fe9dd61c5f5c | 222 | lcd.locate(0,14); |
atomichan | 76:fe9dd61c5f5c | 223 | lcd.printf("name:%s",value); |
atomichan | 76:fe9dd61c5f5c | 224 | |
atomichan | 76:fe9dd61c5f5c | 225 | // Sound an alert |
atomichan | 76:fe9dd61c5f5c | 226 | spkr.period(1.0/5000.0); |
atomichan | 76:fe9dd61c5f5c | 227 | spkr=0.5; |
atomichan | 76:fe9dd61c5f5c | 228 | wait(1.0); |
atomichan | 76:fe9dd61c5f5c | 229 | spkr=0.0; |
atomichan | 76:fe9dd61c5f5c | 230 | */ |
atomichan | 76:fe9dd61c5f5c | 231 | |
atomichan | 76:fe9dd61c5f5c | 232 | delete get_req; |
atomichan | 76:fe9dd61c5f5c | 233 | |
atomichan | 76:fe9dd61c5f5c | 234 | break; |
atomichan | 76:fe9dd61c5f5c | 235 | } |
atomichan | 76:fe9dd61c5f5c | 236 | |
atomichan | 76:fe9dd61c5f5c | 237 | delete get_req; |
atomichan | 76:fe9dd61c5f5c | 238 | |
atomichan | 76:fe9dd61c5f5c | 239 | wait(10.0); |
atomichan | 76:fe9dd61c5f5c | 240 | } |
atomichan | 76:fe9dd61c5f5c | 241 | |
atomichan | 76:fe9dd61c5f5c | 242 | //while(fire == 0); |
atomichan | 76:fe9dd61c5f5c | 243 | wait(1.0); |
atomichan | 76:fe9dd61c5f5c | 244 | } |
Jonathan Austin |
0:2757d7abb7d9 | 245 | } |