質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

解決済

センサーの値をSORACOMサーバーへ送信したい

senntii
senntii

総合スコア3

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

1回答

0グッド

1クリップ

303閲覧

投稿2022/11/11 00:47

3軸加速度センサーとArduino、LTE-M Shield for Arduinoを接続し、センサー値をSORACOMサーバーへ送信したいです。

センサー値の取得及びTeratermでセンサー値を表示することはできるのですが、取得したセンサー値をSORACOMサーバーへ送信する際に値が「?」になってしまい、値を送信することができません。
SORACOMサーバーへの送信用のプログラムはIoTで屋内の環境モニタリングをするを参考にしています。

送信したいセンサー値は符号つき小数点の値(-3.18、-18.90、25.60など)です。

C

1#include <Wire.h> 2#include <SoftwareSerial.h> 3#include <stdio.h> 4 5const int LIS3DH_ADDR = 0x18; 6const int LIS3DH_ID = 0x33; 7 8const float X_offset = 0.0; 9const float Y_offset = 0.0; 10const float Z_offset = 0.0; 11const float T_offset = -20.0; 12 13volatile uint8_t Int_Detected; 14 15const int AUX_STATUS = 0x07; 16const int TEMP_L = 0x0C; 17const int TEMP_H = 0x0D; 18const int WHO_AM_I = 0x0F; 19const int CTRL_REG0 = 0x1E; 20const int TEMP_CFG = 0x1F; 21const int CTRL_REG1 = 0x20; 22const int CTRL_REG2 = 0x21; 23const int CTRL_REG3 = 0x22; 24const int CTRL_REG4 = 0x23; 25const int CTRL_REG5 = 0x24; 26const int CTRL_REG6 = 0x25; 27const int REFERENCE = 0x26; 28const int STATUS = 0x27; 29const int XL = 0x28; 30const int XH = 0x29; 31const int YL = 0x2A; 32const int YH = 0x2B; 33const int ZL = 0x2C; 34const int ZH = 0x2D; 35const int FIFO_CTRL = 0x2E; 36const int FIFO_SRC = 0x2F; 37const int INT1_CFG = 0x30; 38const int INT1_SRC = 0x31; 39const int INT1_THS = 0x32; 40const int INT1_DUR = 0x33; 41const int INT2_CFG = 0x34; 42const int INT2_SRC = 0x35; 43const int INT2_THS = 0x36; 44const int INT2_DUR = 0x37; 45const int CLICK_CFG = 0x38; 46const int CLICK_SRC = 0x39; 47const int CLICK_THS = 0x3A; 48const int TIME_LIMIT = 0x3B; 49const int TIME_LATENCY = 0x3C; 50const int TIME_WINDOW = 0x3D; 51const int ACT_THS = 0x3E; 52const int ACT_DUR = 0x3F; 53 54#define CONSOLE Serial 55#define INTERVAL_MS (1000) 56#define ENDPOINT "uni.soracom.io" 57#define SKETCH_NAME "data_recievetoLTE" 58#define VERSION "1.0" 59 60/* for LTE-M Shield for Arduino */ 61#define RX 10 62#define TX 11 63#define BAUDRATE 9600 64#define BG96_RESET 15 65 66#define TINY_GSM_MODEM_BG96 67#include <TinyGsmClient.h> 68 69SoftwareSerial LTE_M_shieldUART(RX, TX); 70TinyGsm modem(LTE_M_shieldUART); 71TinyGsmClient ctx(modem); 72 73 74// #define RESET_DURATION 86400000UL // 1 day 75void software_reset() { 76 asm volatile (" jmp 0"); 77} 78 79unsigned int readRegister(byte reg){ 80 Wire.beginTransmission(LIS3DH_ADDR); 81 Wire.write(reg); 82 Wire.endTransmission(); 83 84 Wire.requestFrom(LIS3DH_ADDR, 1); 85 return Wire.read(); 86} 87 88void writeRegister(byte reg, byte data){ 89 Wire.beginTransmission(LIS3DH_ADDR); 90 Wire.write(reg); 91 Wire.write(data); 92 Wire.endTransmission(); 93} 94 95void setup(){ 96 Wire.begin(); 97 Serial.begin(19200); 98 99 attachInterrupt(digitalPinToInterrupt(2), activity, FALLING); // INT on D2 pin 100// attachInterrupt(digitalPinToInterrupt(3), activity, RISING); // INT on D3 pin 101 102 writeRegister(TEMP_CFG, 0xC0); // Enable Temperature Sensor 103 writeRegister(CTRL_REG1, 0x27); // CTRL_REG1 set to 10Hz !Low_PWR + X&Y&Z 104 // 0x17:1Hz 0x27:10Hz 0x37:25Hz 0x47:50Hz 105 // 0x57:100Hz 0x67:200Hz 0x77:400Hz 0x97:1.344kHz 106 writeRegister(CTRL_REG4, 0x80); // CTRL_REG4 set to 2G/Normal, Update after Read Data Reg. 107 // !HR, LSB first/MSB second, Self-test disable. 108 // 0x80:2G 0x90:4G 0xA0:8G 0xB0:16G 109 110 int res = readRegister(0x0F); // WHO_AM_I 111 Serial.print("Addressed Device is "); 112 Serial.print(res,HEX); 113 Serial.print("H, "); 114 if (res == LIS3DH_ID) Serial.println("OK"); 115 else Serial.println("NG"); 116 117 configIntterupts(); 118 119 CONSOLE.begin(19200); 120 121 CONSOLE.println(); 122 CONSOLE.print(F("Welcome to ")); CONSOLE.print(SKETCH_NAME); CONSOLE.print(F(" ")); CONSOLE.println(VERSION); 123 124 CONSOLE.print(F("resetting module ")); 125 pinMode(BG96_RESET,OUTPUT); 126 digitalWrite(BG96_RESET,LOW); 127 delay(30); 128 digitalWrite(BG96_RESET,HIGH); 129 delay(30); 130 digitalWrite(BG96_RESET,LOW); 131 CONSOLE.println(F(" done.")); 132 133 LTE_M_shieldUART.begin(BAUDRATE); 134 135 CONSOLE.print(F("modem.restart()")); 136 modem.restart(); 137 CONSOLE.println(F(" done.")); 138 139 CONSOLE.print(F("modem.getModemInfo(): ")); 140 String modemInfo = modem.getModemInfo(); 141 CONSOLE.println(modemInfo); 142 143 CONSOLE.print(F("waitForNetwork()")); 144 while (!modem.waitForNetwork()) CONSOLE.print("."); 145 CONSOLE.println(F(" Ok.")); 146 147 CONSOLE.print(F("gprsConnect(soracom.io)")); 148 modem.gprsConnect("soracom.io", "sora", "sora"); 149 CONSOLE.println(F(" done.")); 150 151 CONSOLE.print(F("isNetworkConnected()")); 152 while (!modem.isNetworkConnected()) CONSOLE.print("."); 153 CONSOLE.println(F(" Ok.")); 154 155 CONSOLE.print(F("My IP addr: ")); 156 IPAddress ipaddr = modem.localIP(); 157 CONSOLE.println(ipaddr); 158 159} 160 161void loop(){ 162 float x, y, z, temp, x1, y1, z1; 163 int h, l; 164 uint8_t dataRead; 165 166 const float Acc_Coefficient = 0.0006125 ; // [mG/digit], for 2G/Normal (FS=00b) 167 168 // read X 169 l = readRegister(XL); 170 h = readRegister(XH); 171 x = h << 8 | l; 172 173 // read Y 174 l = readRegister(YL); 175 h = readRegister(YH); 176 y = h << 8 | l; 177 178 // read Z 179 l = readRegister(ZL); 180 h = readRegister(ZH); 181 z = h << 8 | l; 182 183 l = readRegister(TEMP_L); 184 h = readRegister(TEMP_H); 185 temp = h << 8 | l; 186 187 x = x * Acc_Coefficient - X_offset; 188 y = y * Acc_Coefficient - Y_offset; 189 z = z * Acc_Coefficient - Z_offset; 190 temp = temp/256 - T_offset; 191 x1 = degrees(asin(x/9.8)); 192 y1 = degrees(asin(y/9.8)); 193 z1 = degrees(asin(z/9.8)); 194 195 Serial.print("Acc_X = ");  //ここは正しく表示される 196 Serial.print(x); 197 Serial.print(", xd = "); 198 Serial.print(x1); 199 Serial.print("°, Acc_Y = "); 200 Serial.print(y); 201 Serial.print(", yd = "); 202 Serial.print(y1); 203 Serial.print("°, Acc_Z = "); 204 Serial.print(z); 205 Serial.print(", zd = "); 206 Serial.print(z1); 207 Serial.print("°, TEMP = "); 208 Serial.println(temp); 209 210 char payload[120]; 211 sprintf_P(payload, PSTR("{\"X\":%f,\"Y\":%f,\"Z\":%f,\"temp\":%f}"), x1, y1, z1, temp); //送るデータ「?」になる 212 CONSOLE.println(payload); 213 214 if (!ctx.connect(ENDPOINT, 80)) { 215 CONSOLE.println(F("failed.")); 216 delay(30); 217 return; 218 } 219 220 /*send request*/ 221 char hdr_buf[40]; 222 ctx.println(F("POST / HTTP/1.1")); 223 sprintf_P(hdr_buf, PSTR("Host: %s"), ENDPOINT); 224 ctx.println(hdr_buf); 225 ctx.println(F("Content-Type: application/json")); 226 ctx.println(hdr_buf); 227 ctx.println(); 228 while (ctx.connected()) { 229 String line = ctx.readStringUntil('\n'); 230 CONSOLE.println(line); 231 if (line == "\r") { 232 CONSOLE.println(F("Response header received.")); 233 break; 234 } 235 } 236 237 ctx.stop(); 238 239 delay(INTERVAL_MS); 240 241 #ifdef RESET_DURATION 242 if(millis() > RESET_DURATION ) 243 { 244 CONSOLE.println("Execute software reset..."); 245 delay(10); 246 software_reset(); 247 } 248#endif 249} 250 251void configIntterupts() 252{ 253 uint8_t dataToWrite = 0; 254 dataToWrite |= 0x10;//Z low 255 256 writeRegister(INT1_CFG, dataToWrite); 257 258 dataToWrite = 0; 259 dataToWrite |= 0x10; // 1/8 range 260 writeRegister(INT1_THS, dataToWrite); 261 262 dataToWrite = 0; 263 dataToWrite |= 0x01; // 1 * 1/50 s = 20ms 264 writeRegister(INT1_DUR, dataToWrite); 265 266 dataToWrite = 0; 267 dataToWrite |= 0x10;//Z single-click 268 dataToWrite |= 0x04;//Y single-click 269 dataToWrite |= 0x01;//X single-click 270 writeRegister(CLICK_CFG, dataToWrite); 271 272 dataToWrite = 0; 273 dataToWrite |= 0x04;//Enable single clicks 274 dataToWrite |= 0x04;//Z click detect enabled 275 dataToWrite |= 0x02;//Y click detect enabled 276 dataToWrite |= 0x01;//X click detect enabled 277 writeRegister(CLICK_SRC, dataToWrite); 278 279 dataToWrite = 0; 280 dataToWrite |= 0x0A; // ~1/16 range <- 1/12.7 281 writeRegister(CLICK_THS, dataToWrite); 282 283 dataToWrite = 0; 284 dataToWrite |= 0x08; // 8 * 1/50 s = 160ms 285 writeRegister(TIME_LIMIT, dataToWrite); 286 287 dataToWrite = 0; 288 dataToWrite |= 0x08; // 4 * 1/50 s = 160ms 289 writeRegister(TIME_LATENCY, dataToWrite); 290 291 dataToWrite = 0; 292 dataToWrite |= 0x10; // 16 * 1/50 s = 320ms 293 writeRegister(TIME_WINDOW, dataToWrite); 294 295 dataToWrite = readRegister(CTRL_REG5); 296 dataToWrite &= 0xF3; //Clear bits of interest 297 dataToWrite |= 0x08; //Latch interrupt (Cleared by reading int1_src) 298 writeRegister(CTRL_REG5, dataToWrite); 299 300 dataToWrite = 0; 301 dataToWrite |= 0x80; //Click detect on pin 1 302 dataToWrite |= 0x40; //AOI1 event (Generator 1 interrupt on pin 1) 303 dataToWrite |= 0x20; //AOI2 event () 304 writeRegister(CTRL_REG3, dataToWrite); 305 306 dataToWrite = 0; 307 dataToWrite |= 0x80; //Click int on pin 2 308 writeRegister(CTRL_REG6, dataToWrite); 309 310} 311 312void activity() 313{ 314 315 Int_Detected = 1 ; // Set interruput detection flag 316}

試したこと

・payload内の変換指定子を一通り試しましたが、正しい値を送信できませんでした。
・各センサー値をfloat型からchar型に変換してみましたが、うまく変換できないようで、こちらも「?」の表示となってしまいます。

C

1 char x2[50]; 2 snprintf(x2,50,"%f", x1); 3 puts(x2); 4 Serial.println(x2); //←?の表示となる

データは取得出来ているので、送付する部分のプログラムが違うのだと思うのですが、どの部分を修正したらよいのかアドバイスいただきたいです。

よろしくお願いいたします。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

arduinoのsprintfはfloat/doubleに非対応。
dtostrfとかで変換する。

投稿2022/11/11 04:20

matukeso

総合スコア1427

mike👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

senntii

2022/11/11 05:24

dtostrfで変換したらいけました。 sprintfはArduinoではfloat/doubleに非対応ということを初めて知りました。 ありがとうございました。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。