SORACOM Harvest and Grove - Temperature&Humidity Sensor(DHT11) example for Wio cellular targets - Seeed Wio 3G and Wio LTE-M1/NB1(BG96)

Dependencies:   DHT-2

Committer:
asagin
Date:
Thu Jun 06 01:14:27 2019 +0000
Revision:
6:deb72cbeb039
Parent:
5:1d355dfee639
It's working!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:fb5e1789de47 1 /*
MACRUM 0:fb5e1789de47 2 * Copyright (c) 2017 ARM Limited. All rights reserved.
MACRUM 0:fb5e1789de47 3 * SPDX-License-Identifier: Apache-2.0
MACRUM 0:fb5e1789de47 4 * Licensed under the Apache License, Version 2.0 (the License); you may
MACRUM 0:fb5e1789de47 5 * not use this file except in compliance with the License.
MACRUM 0:fb5e1789de47 6 * You may obtain a copy of the License at
MACRUM 0:fb5e1789de47 7 *
MACRUM 0:fb5e1789de47 8 * http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:fb5e1789de47 9 *
MACRUM 0:fb5e1789de47 10 * Unless required by applicable law or agreed to in writing, software
MACRUM 0:fb5e1789de47 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
MACRUM 0:fb5e1789de47 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:fb5e1789de47 13 * See the License for the specific language governing permissions and
MACRUM 0:fb5e1789de47 14 * limitations under the License.
MACRUM 0:fb5e1789de47 15 */
MACRUM 0:fb5e1789de47 16
MACRUM 0:fb5e1789de47 17 #include "mbed.h"
MACRUM 0:fb5e1789de47 18 #include "common_functions.h"
MACRUM 0:fb5e1789de47 19 #include "CellularNonIPSocket.h"
MACRUM 0:fb5e1789de47 20 #include "CellularDevice.h"
MACRUM 0:fb5e1789de47 21 #include "UDPSocket.h"
MACRUM 0:fb5e1789de47 22 #include "CellularLog.h"
asagin 6:deb72cbeb039 23 #include "DHT.h"
MACRUM 0:fb5e1789de47 24
MACRUM 0:fb5e1789de47 25 #define UDP 0
MACRUM 0:fb5e1789de47 26 #define TCP 1
MACRUM 0:fb5e1789de47 27 #define NONIP 2
MACRUM 0:fb5e1789de47 28
asagin 6:deb72cbeb039 29 // define the sensor /
asagin 6:deb72cbeb039 30 DHT sensor(D38, DHT11);
asagin 6:deb72cbeb039 31 int sensorError = 0;
asagin 6:deb72cbeb039 32 float Temperature = 0.0f;
asagin 6:deb72cbeb039 33
MACRUM 0:fb5e1789de47 34 // Number of retries /
MACRUM 0:fb5e1789de47 35 #define RETRY_COUNT 3
MACRUM 0:fb5e1789de47 36
MACRUM 0:fb5e1789de47 37 NetworkInterface *iface;
MACRUM 0:fb5e1789de47 38
MACRUM 0:fb5e1789de47 39 // Echo server hostname
MACRUM 0:fb5e1789de47 40 const char *host_name = MBED_CONF_APP_ECHO_SERVER_HOSTNAME;
MACRUM 0:fb5e1789de47 41
MACRUM 0:fb5e1789de47 42 // Echo server port (same for TCP and UDP)
MACRUM 0:fb5e1789de47 43 const int port = MBED_CONF_APP_ECHO_SERVER_PORT;
MACRUM 0:fb5e1789de47 44
MACRUM 0:fb5e1789de47 45 static rtos::Mutex trace_mutex;
MACRUM 0:fb5e1789de47 46
MACRUM 0:fb5e1789de47 47 #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 48 static void trace_wait()
MACRUM 0:fb5e1789de47 49 {
MACRUM 0:fb5e1789de47 50 trace_mutex.lock();
MACRUM 0:fb5e1789de47 51 }
MACRUM 0:fb5e1789de47 52
MACRUM 0:fb5e1789de47 53 static void trace_release()
MACRUM 0:fb5e1789de47 54 {
MACRUM 0:fb5e1789de47 55 trace_mutex.unlock();
MACRUM 0:fb5e1789de47 56 }
MACRUM 0:fb5e1789de47 57
MACRUM 0:fb5e1789de47 58 static char time_st[50];
MACRUM 0:fb5e1789de47 59
MACRUM 0:fb5e1789de47 60 static char* trace_time(size_t ss)
MACRUM 0:fb5e1789de47 61 {
MACRUM 0:fb5e1789de47 62 snprintf(time_st, 49, "[%08llums]", Kernel::get_ms_count());
MACRUM 0:fb5e1789de47 63 return time_st;
MACRUM 0:fb5e1789de47 64 }
MACRUM 0:fb5e1789de47 65
MACRUM 0:fb5e1789de47 66 static void trace_open()
MACRUM 0:fb5e1789de47 67 {
MACRUM 0:fb5e1789de47 68 mbed_trace_init();
MACRUM 0:fb5e1789de47 69 mbed_trace_prefix_function_set( &trace_time );
MACRUM 0:fb5e1789de47 70
MACRUM 0:fb5e1789de47 71 mbed_trace_mutex_wait_function_set(trace_wait);
MACRUM 0:fb5e1789de47 72 mbed_trace_mutex_release_function_set(trace_release);
MACRUM 0:fb5e1789de47 73
MACRUM 0:fb5e1789de47 74 mbed_cellular_trace::mutex_wait_function_set(trace_wait);
MACRUM 0:fb5e1789de47 75 mbed_cellular_trace::mutex_release_function_set(trace_release);
MACRUM 0:fb5e1789de47 76 }
MACRUM 0:fb5e1789de47 77
MACRUM 0:fb5e1789de47 78 static void trace_close()
MACRUM 0:fb5e1789de47 79 {
MACRUM 0:fb5e1789de47 80 mbed_cellular_trace::mutex_wait_function_set(NULL);
MACRUM 0:fb5e1789de47 81 mbed_cellular_trace::mutex_release_function_set(NULL);
MACRUM 0:fb5e1789de47 82
MACRUM 0:fb5e1789de47 83 mbed_trace_free();
MACRUM 0:fb5e1789de47 84 }
MACRUM 0:fb5e1789de47 85 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 86
MACRUM 0:fb5e1789de47 87 Thread dot_thread(osPriorityNormal, 512);
MACRUM 0:fb5e1789de47 88
MACRUM 0:fb5e1789de47 89 void print_function(const char *format, ...)
MACRUM 0:fb5e1789de47 90 {
MACRUM 0:fb5e1789de47 91 trace_mutex.lock();
MACRUM 0:fb5e1789de47 92 va_list arglist;
MACRUM 0:fb5e1789de47 93 va_start( arglist, format );
MACRUM 0:fb5e1789de47 94 vprintf(format, arglist);
MACRUM 0:fb5e1789de47 95 va_end( arglist );
MACRUM 0:fb5e1789de47 96 trace_mutex.unlock();
MACRUM 0:fb5e1789de47 97 }
MACRUM 0:fb5e1789de47 98
MACRUM 0:fb5e1789de47 99 void dot_event()
MACRUM 0:fb5e1789de47 100 {
MACRUM 0:fb5e1789de47 101 while (true) {
MACRUM 0:fb5e1789de47 102 ThisThread::sleep_for(4000);
MACRUM 0:fb5e1789de47 103 if (iface && iface->get_connection_status() == NSAPI_STATUS_GLOBAL_UP) {
MACRUM 0:fb5e1789de47 104 break;
MACRUM 0:fb5e1789de47 105 } else {
MACRUM 0:fb5e1789de47 106 trace_mutex.lock();
MACRUM 0:fb5e1789de47 107 printf(".");
MACRUM 0:fb5e1789de47 108 fflush(stdout);
MACRUM 0:fb5e1789de47 109 trace_mutex.unlock();
MACRUM 0:fb5e1789de47 110 }
MACRUM 0:fb5e1789de47 111 }
MACRUM 0:fb5e1789de47 112 }
MACRUM 0:fb5e1789de47 113
MACRUM 0:fb5e1789de47 114 /**
MACRUM 0:fb5e1789de47 115 * Connects to the Cellular Network
MACRUM 0:fb5e1789de47 116 */
MACRUM 0:fb5e1789de47 117 nsapi_error_t do_connect()
MACRUM 0:fb5e1789de47 118 {
MACRUM 0:fb5e1789de47 119 nsapi_error_t retcode = NSAPI_ERROR_OK;
MACRUM 0:fb5e1789de47 120 uint8_t retry_counter = 0;
MACRUM 0:fb5e1789de47 121
MACRUM 0:fb5e1789de47 122 while (iface->get_connection_status() != NSAPI_STATUS_GLOBAL_UP) {
MACRUM 0:fb5e1789de47 123 retcode = iface->connect();
MACRUM 0:fb5e1789de47 124 if (retcode == NSAPI_ERROR_AUTH_FAILURE) {
MACRUM 0:fb5e1789de47 125 print_function("\n\nAuthentication Failure. Exiting application\n");
MACRUM 0:fb5e1789de47 126 } else if (retcode == NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 127 print_function("\n\nConnection Established.\n");
MACRUM 0:fb5e1789de47 128 } else if (retry_counter > RETRY_COUNT) {
MACRUM 0:fb5e1789de47 129 print_function("\n\nFatal connection failure: %d\n", retcode);
MACRUM 0:fb5e1789de47 130 } else {
MACRUM 0:fb5e1789de47 131 print_function("\n\nCouldn't connect: %d, will retry\n", retcode);
MACRUM 0:fb5e1789de47 132 retry_counter++;
MACRUM 0:fb5e1789de47 133 continue;
MACRUM 0:fb5e1789de47 134 }
MACRUM 0:fb5e1789de47 135 break;
MACRUM 0:fb5e1789de47 136 }
MACRUM 0:fb5e1789de47 137 return retcode;
MACRUM 0:fb5e1789de47 138 }
MACRUM 0:fb5e1789de47 139
MACRUM 0:fb5e1789de47 140 /**
MACRUM 0:fb5e1789de47 141 * Opens:
MACRUM 0:fb5e1789de47 142 * - UDP or TCP socket with the given echo server and performs an echo
MACRUM 0:fb5e1789de47 143 * transaction retrieving current.
MACRUM 0:fb5e1789de47 144 * - Cellular Non-IP socket for which the data delivery path is decided
MACRUM 0:fb5e1789de47 145 * by network's control plane CIoT optimisation setup, for the given APN.
MACRUM 0:fb5e1789de47 146 */
MACRUM 0:fb5e1789de47 147 nsapi_error_t test_send_recv()
MACRUM 0:fb5e1789de47 148 {
MACRUM 0:fb5e1789de47 149 nsapi_size_or_error_t retcode;
MACRUM 0:fb5e1789de47 150 #if MBED_CONF_APP_SOCK_TYPE == TCP
MACRUM 0:fb5e1789de47 151 TCPSocket sock;
MACRUM 0:fb5e1789de47 152 #elif MBED_CONF_APP_SOCK_TYPE == UDP
MACRUM 0:fb5e1789de47 153 UDPSocket sock;
MACRUM 0:fb5e1789de47 154 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 155 CellularNonIPSocket sock;
MACRUM 0:fb5e1789de47 156 #endif
MACRUM 0:fb5e1789de47 157
MACRUM 0:fb5e1789de47 158 #if MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 159 retcode = sock.open((CellularContext*)iface);
MACRUM 0:fb5e1789de47 160 #else
MACRUM 0:fb5e1789de47 161 retcode = sock.open(iface);
MACRUM 0:fb5e1789de47 162 #endif
MACRUM 0:fb5e1789de47 163
MACRUM 0:fb5e1789de47 164 if (retcode != NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 165 #if MBED_CONF_APP_SOCK_TYPE == TCP
MACRUM 0:fb5e1789de47 166 print_function("TCPSocket.open() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 167 #elif MBED_CONF_APP_SOCK_TYPE == UDP
MACRUM 0:fb5e1789de47 168 print_function("UDPSocket.open() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 169 #elif MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 170 print_function("CellularNonIPSocket.open() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 171 #endif
MACRUM 0:fb5e1789de47 172 return -1;
MACRUM 0:fb5e1789de47 173 }
asagin 6:deb72cbeb039 174 /*
asagin 6:deb72cbeb039 175 int val = 123; // 普通の変数
asagin 6:deb72cbeb039 176 int* ptr = &val; // ポインタ(pointer)
asagin 6:deb72cbeb039 177 int& ref = val; // 参照(reference)
asagin 6:deb72cbeb039 178 const int cval = 45; // 定数(constant)
asagin 6:deb72cbeb039 179 */
MACRUM 0:fb5e1789de47 180 int n = 0;
asagin 3:4c355eed5a07 181 int val = 1;
asagin 6:deb72cbeb039 182 // int *echo_string = &val;
MACRUM 0:fb5e1789de47 183 char recv_buf[4];
MACRUM 0:fb5e1789de47 184
MACRUM 0:fb5e1789de47 185 sock.set_timeout(15000);
MACRUM 0:fb5e1789de47 186
MACRUM 0:fb5e1789de47 187 #if MBED_CONF_APP_SOCK_TYPE == NONIP
MACRUM 0:fb5e1789de47 188 retcode = sock.send((void*) echo_string, sizeof(echo_string));
MACRUM 0:fb5e1789de47 189 if (retcode < 0) {
MACRUM 0:fb5e1789de47 190 print_function("CellularNonIPSocket.send() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 191 return -1;
MACRUM 0:fb5e1789de47 192 } else {
MACRUM 0:fb5e1789de47 193 print_function("CellularNonIPSocket: Sent %d Bytes\n", retcode);
MACRUM 0:fb5e1789de47 194 }
MACRUM 0:fb5e1789de47 195
MACRUM 0:fb5e1789de47 196 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
MACRUM 0:fb5e1789de47 197
MACRUM 0:fb5e1789de47 198 #else
MACRUM 0:fb5e1789de47 199
MACRUM 0:fb5e1789de47 200 SocketAddress sock_addr;
MACRUM 0:fb5e1789de47 201 retcode = iface->gethostbyname(host_name, &sock_addr);
MACRUM 0:fb5e1789de47 202 if (retcode != NSAPI_ERROR_OK) {
MACRUM 0:fb5e1789de47 203 print_function("Couldn't resolve remote host: %s, code: %d\n", host_name, retcode);
MACRUM 0:fb5e1789de47 204 return -1;
MACRUM 0:fb5e1789de47 205 }
MACRUM 0:fb5e1789de47 206
MACRUM 0:fb5e1789de47 207 sock_addr.set_port(port);
MACRUM 0:fb5e1789de47 208
MACRUM 0:fb5e1789de47 209 #if MBED_CONF_APP_SOCK_TYPE == TCP
MACRUM 0:fb5e1789de47 210 retcode = sock.connect(sock_addr);
MACRUM 0:fb5e1789de47 211 if (retcode < 0) {
MACRUM 0:fb5e1789de47 212 print_function("TCPSocket.connect() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 213 return -1;
MACRUM 0:fb5e1789de47 214 } else {
MACRUM 0:fb5e1789de47 215 print_function("TCP: connected with %s server\n", host_name);
MACRUM 0:fb5e1789de47 216 }
MACRUM 0:fb5e1789de47 217 retcode = sock.send((void*) echo_string, sizeof(echo_string));
MACRUM 0:fb5e1789de47 218 if (retcode < 0) {
MACRUM 0:fb5e1789de47 219 print_function("TCPSocket.send() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 220 return -1;
MACRUM 0:fb5e1789de47 221 } else {
MACRUM 0:fb5e1789de47 222 print_function("TCP: Sent %d Bytes to %s\n", retcode, host_name);
MACRUM 0:fb5e1789de47 223 }
MACRUM 0:fb5e1789de47 224
MACRUM 0:fb5e1789de47 225 n = sock.recv((void*) recv_buf, sizeof(recv_buf));
MACRUM 0:fb5e1789de47 226 #else
asagin 3:4c355eed5a07 227 //UDP
asagin 5:1d355dfee639 228 char echo_string[100];
asagin 6:deb72cbeb039 229 sprintf(echo_string, "{\"Temprature\" : %4.2f}", Temperature);
asagin 5:1d355dfee639 230 retcode = sock.sendto(sock_addr, (void*)echo_string, strlen(echo_string));
asagin 4:693230744089 231 print_function("%s\n", echo_string);
MACRUM 0:fb5e1789de47 232 if (retcode < 0) {
MACRUM 0:fb5e1789de47 233 print_function("UDPSocket.sendto() fails, code: %d\n", retcode);
MACRUM 0:fb5e1789de47 234 return -1;
MACRUM 0:fb5e1789de47 235 } else {
MACRUM 0:fb5e1789de47 236 print_function("UDP: Sent %d Bytes to %s\n", retcode, host_name);
MACRUM 0:fb5e1789de47 237 }
MACRUM 0:fb5e1789de47 238
MACRUM 0:fb5e1789de47 239 n = sock.recvfrom(&sock_addr, (void*) recv_buf, sizeof(recv_buf));
MACRUM 0:fb5e1789de47 240 #endif
asagin 3:4c355eed5a07 241
MACRUM 0:fb5e1789de47 242 #endif
MACRUM 0:fb5e1789de47 243
MACRUM 0:fb5e1789de47 244 sock.close();
MACRUM 0:fb5e1789de47 245
MACRUM 0:fb5e1789de47 246 if (n > 0) {
MACRUM 0:fb5e1789de47 247 print_function("Received from echo server %d Bytes\n", n);
MACRUM 0:fb5e1789de47 248 return 0;
MACRUM 0:fb5e1789de47 249 }
MACRUM 0:fb5e1789de47 250
MACRUM 0:fb5e1789de47 251 return -1;
MACRUM 0:fb5e1789de47 252 }
MACRUM 0:fb5e1789de47 253
asagin 3:4c355eed5a07 254 DigitalIn pushButton(D20);
asagin 3:4c355eed5a07 255
MACRUM 0:fb5e1789de47 256 int main()
MACRUM 0:fb5e1789de47 257 {
asagin 6:deb72cbeb039 258 print_function("\n\nmbed-os-example-cellular-temp\n");
MACRUM 0:fb5e1789de47 259 print_function("\n\nBuilt: %s, %s\n", __DATE__, __TIME__);
asagin 6:deb72cbeb039 260
asagin 6:deb72cbeb039 261 for(int count = 1; count < 10; count = count + 1) {
asagin 6:deb72cbeb039 262 sensorError = sensor.readData();
asagin 6:deb72cbeb039 263 if (0 == sensorError) {
asagin 6:deb72cbeb039 264 Temperature = sensor.ReadTemperature(CELCIUS);
asagin 6:deb72cbeb039 265
asagin 6:deb72cbeb039 266 } else {
asagin 6:deb72cbeb039 267 print_function("Error: %d\n", sensorError);
asagin 6:deb72cbeb039 268 }
asagin 6:deb72cbeb039 269
asagin 6:deb72cbeb039 270
MACRUM 0:fb5e1789de47 271 #ifdef MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN
asagin 6:deb72cbeb039 272 print_function("\n\n[MAIN], plmn: %s\n", (MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN ? MBED_CONF_NSAPI_DEFAULT_CELLULAR_PLMN : "NULL"));
MACRUM 0:fb5e1789de47 273 #endif
MACRUM 0:fb5e1789de47 274
asagin 6:deb72cbeb039 275 // print_function("Establishing connection\n");
MACRUM 0:fb5e1789de47 276 #if MBED_CONF_MBED_TRACE_ENABLE
asagin 6:deb72cbeb039 277 trace_open();
MACRUM 0:fb5e1789de47 278 #else
asagin 6:deb72cbeb039 279 dot_thread.start(dot_event);
MACRUM 0:fb5e1789de47 280 #endif // #if MBED_CONF_MBED_TRACE_ENABLE
MACRUM 0:fb5e1789de47 281
MACRUM 0:fb5e1789de47 282 #if MBED_CONF_APP_SOCK_TYPE == NONIP
asagin 6:deb72cbeb039 283 iface = CellularContext::get_default_nonip_instance();
MACRUM 0:fb5e1789de47 284 #else
asagin 6:deb72cbeb039 285 iface = CellularContext::get_default_instance();
MACRUM 0:fb5e1789de47 286 #endif
MACRUM 0:fb5e1789de47 287
asagin 6:deb72cbeb039 288 MBED_ASSERT(iface);
MACRUM 0:fb5e1789de47 289
asagin 6:deb72cbeb039 290 // sim pin, apn, credentials and possible plmn are taken automatically from json when using NetworkInterface::set_default_parameters()
asagin 6:deb72cbeb039 291 iface->set_default_parameters();
asagin 6:deb72cbeb039 292
asagin 6:deb72cbeb039 293 nsapi_error_t retcode = NSAPI_ERROR_NO_CONNECTION;
asagin 3:4c355eed5a07 294
asagin 6:deb72cbeb039 295 /* Attempt to connect to a cellular network */
asagin 6:deb72cbeb039 296 if (do_connect() == NSAPI_ERROR_OK) {
asagin 6:deb72cbeb039 297 retcode = test_send_recv();
asagin 3:4c355eed5a07 298 }
asagin 6:deb72cbeb039 299 wait(1);
asagin 6:deb72cbeb039 300 if (iface->disconnect() != NSAPI_ERROR_OK) {
asagin 6:deb72cbeb039 301 print_function("\n\n disconnect failed.\n\n");
asagin 6:deb72cbeb039 302 }
MACRUM 0:fb5e1789de47 303
asagin 6:deb72cbeb039 304 if (retcode == NSAPI_ERROR_OK) {
asagin 6:deb72cbeb039 305 print_function("\n\nSuccess. Exiting \n\n");
asagin 6:deb72cbeb039 306 } else {
asagin 6:deb72cbeb039 307 print_function("\n\nFailure. Exiting \n\n");
asagin 6:deb72cbeb039 308 }
MACRUM 0:fb5e1789de47 309
MACRUM 0:fb5e1789de47 310 #if MBED_CONF_MBED_TRACE_ENABLE
asagin 6:deb72cbeb039 311 trace_close();
MACRUM 0:fb5e1789de47 312 #else
asagin 6:deb72cbeb039 313 dot_thread.terminate();
asagin 3:4c355eed5a07 314 #endif
asagin 6:deb72cbeb039 315 }
MACRUM 0:fb5e1789de47 316
MACRUM 0:fb5e1789de47 317 return 0;
MACRUM 0:fb5e1789de47 318 }
MACRUM 0:fb5e1789de47 319 // EOF