アクセスカウンタ

zoom RSS テーマ「電子工作」のブログ記事

みんなの「電子工作」ブログ


BLE + 温湿度・気圧センサー + 照度センサー

2016/07/30 12:24
CY8CKIT-042-BLE に 前回も使用した温湿度と気圧が測れる BME280 と
照度センサー TSL2561 を繋げて、
環境センサーを作成しました。

PSoC Creatorには、多くのサンプルプログラムがあり、
これをベースにして簡単に作成できるようです

環境センサーについても、Environmental sensingというサンプルコードがあります。

このサンプルコードを参考にして、修正していきました。

TopDesignは、こんな感じに。
画像

I2Cを追加して、BME280を追記しています。BME280のブロックは、
TopDesignに書いても書かなくても関係ないです
照度のTSL2561は実際には接続していますが、TopDesignには書いてません。

サンプルではLED三色使用していますが、後で何かに使うかもしれないので、
1個に減らしました

ピン配は、I2Cをどこでもいいみたいですが一応並べて配置。
画像
アナログピンの場合は少し制限があるみたいです。
LED、SW、Debug用UARTは下のボードとの
兼ね合いで決まってますので、変更できないでしょう

BLEのプロファイルは、
画像
のようにDescriptorを3つだけにしました。

プログラムの構成を大幅に変更しました。
画像


main関数の最初は、コールバックの設定と各種初期化です。
1:CyGlobalIntEnable;
2:
3:/* Start CYBLE component and register generic event handler */
4:CyBle_Start(BLE_Component_CallBack);
5:
6:/* Configure button interrupt */
7:Wakeup_Interrupt_StartEx(&ButtonPressInt);
8:
9:#if (DEBUG_UART_ENABLED == ENABLED)
10:UART_DEB_Start();
11:#endif /* (DEBUG_UART_ENABLED == ENABLED) */
12:
13:I2C_1_scl_SetDriveMode(I2C_1_scl_DM_RES_UP);
14:I2C_1_sda_SetDriveMode(I2C_1_sda_DM_RES_UP);
15:I2C_1_Start();
16:
17:BME280_Init();
18:TSL2561_Init();
19:DBG_PRINTF("TSL2561_ReadId()=%02x\r\n", TSL2561_ReadId());
20:
21:ESS_Init();
22:
23:/* Global Resources initialization */
24:WDT_Start();
25:BLE_InitStateLeds();

I2Cは、内部ブルアップ抵抗を使用して、部品点数削減です。
データシートには、内部抵抗じゃない方がいいよってありますが
100kbpsなら問題ないようです。

main関数のループ部分は、
1:while(1)
2:{
3: /* CyBle_ProcessEvents() allows BLE stack to process pending events */
4: CyBle_ProcessEvents();
5:
6: /* To achieve low power in the device */
7: BLE_LowPowerImplementation();
8:
9: /* Handle advertising LED blinking */
10: BLE_HandleStateLeds();
11:
12: /* */
13: BME280_Handle();
14: TSL2561_Handle();
15:
16: state = CyBle_GetState();
17: if (state == CYBLE_STATE_CONNECTED)
18: {
19: /* */
20: ESS_Handle();
21: }
22:
23: /* button */
24: if (isButtonPressed == YES)
25: {
26: isButtonPressed = NO;
27: DBG_PRINTF("Pressed button\r\n");
28: }
29:
30: /* Store bonding data to flash only when all debug information has been sent */
31: #if (DEBUG_UART_ENABLED == ENABLED)
32: if((cyBle_pendingFlashWrite != 0u) &&
33: ((UART_DEB_SpiUartGetTxBufferSize() + UART_DEB_GET_TX_FIFO_SR_VALID) == 0u))
34: #else
35: if(cyBle_pendingFlashWrite != 0u)
36: #endif /* (DEBUG_UART_ENABLED == ENABLED) */
37: {
38: uint8 apiResult = CyBle_StoreBondingData(0u);
39: DBG_PRINTF("Store bonding data, status: %x \r\n", apiResult);
40: }
41:}
CyBle_ProcessEvents関数が、BLEのイベントを処理してくれる
(たぶん、Callbackしてくれる?)関数なので、これ必須。
BLE_LowPowerImplementationは、必要ない時にLowPowerになってくれるようです
サンプルコードそのままです
あとは、なんちゃらHandle関数で、自分の好きな処理をしています。
この中では、WDTの時間を使って、周期的に処理をしています。

WDTと聞くと、ハングアップしたときにリセット入れるためのものと思いましたが、
どうやら、動作モードが何種類かあるらしく、
単なるタイマーとして使用することができるようです。
通常のタイマーとの違いは、ソースのクロックということになるでしょう。
WDTなら低周波数なので、低消費電力になると思います

BME280のソースコードは、ESP8266で作成したものをほぼ流用しています。
I2Cアクセス部分のみ異なります。
レジスタの書き込み関数は、割り込みベースの書き方で
1:static bool BME280i_WriteRegister(uint8 addr, uint8 data)
2:{
3: bool ret = false;
4: uint32 sts;
5: uint8 buff[2] = {addr, data};
6:
7: sts = I2C_1_I2CMasterWriteBuf((uint32)BME280_SLAVE_ADDR, buff, 2, I2C_1_I2C_MODE_COMPLETE_XFER);
8: if (sts != I2C_1_I2C_MSTR_NO_ERROR)
9: {
10: DBG_PRINTF("BME280:W:Write error:0x%lx\r\n", sts);
11: return ret;
12: }
13:
14: /* Waits until master completes write transfer */
15: while ((I2C_1_I2CMasterStatus() & I2C_1_I2C_MSTAT_WR_CMPLT) == 0) continue;
16:
17: /* Displays transfer status */
18: if (I2C_1_I2CMasterStatus() & I2C_1_I2C_MSTAT_ERR_XFER)
19: {
20: DBG_PRINTF("BME280:W:Status err\r\n");
21: }
22: else
23: {
24: ret = true;
25: }
26: I2C_1_I2CMasterClearStatus();
27:
28: return ret;
29:}


レジスタ読み込み関数は、ローモード(?)的な書き方で
1:static bool BME280i_ReadRegister(uint8 addr, uint8 *data, sint32 length)
2:{
3: bool ret = false;
4: uint32 sts;
5:
6: do
7: {
8: sts = I2C_1_I2CMasterSendStart(BME280_SLAVE_ADDR, I2C_1_I2C_WRITE_XFER_MODE);
9: if (sts != I2C_1_I2C_MSTR_NO_ERROR)
10: {
11: DBG_PRINTF("BME280:R:Write slave addr error:0x%lx\r\n", sts);
12: break;
13: }
14:
15: sts = I2C_1_I2CMasterWriteByte(addr);
16: if (sts != I2C_1_I2C_MSTR_NO_ERROR)
17: {
18: DBG_PRINTF("BME280:R:Error when write addr:0x%lx\r\n", sts);
19: break;
20: }
21:
22: sts = I2C_1_I2CMasterSendRestart(BME280_SLAVE_ADDR, I2C_1_I2C_READ_XFER_MODE);
23: if (sts != I2C_1_I2C_MSTR_NO_ERROR)
24: {
25: DBG_PRINTF("BME280:R:Error when write slave addr2:0x%lx\r\n", sts);
26: break;
27: }
28:
29: while(length > 0)
30: {
31: if (--length > 0)
32: {
33: *data++ = (uint8)I2C_1_I2CMasterReadByte(I2C_1_I2C_ACK_DATA);
34: }
35: else
36: {
37: *data++ = (uint8)I2C_1_I2CMasterReadByte(I2C_1_I2C_NAK_DATA);
38: }
39: }
40: ret = true;
41: } while(false);
42:
43: I2C_1_I2CMasterSendStop();
44:
45: return ret;
46:}
ローモードだと、ほとんどI2C APIの名前を変えるだけで行けます

main関数のループ呼び出す、BME280_Handle関数は、
先のWDTの時間を使用して、周期的に処理をしています。
1:void BME280_Handle(void)
2:{
3: sint32 temperature;
4: uint32 humidity;
5: uint32 pressure;
6: uint32 baro;
7:
8: if (WDT_IsTimeout(&timer))
9: {
10: BME280_ForceMeasure();
11: if (BME280_MeasureData(&temperature, &humidity, &pressure))
12: {
13: baro = pressure * 10;
14: CyBle_EsssSetCharacteristicValue(CYBLE_ESS_TEMPERATURE, 0, 2, (uint8*)&temperature);
15: CyBle_EsssSetCharacteristicValue(CYBLE_ESS_HUMIDITY , 0, 2, (uint8*)&humidity );
16: CyBle_EsssSetCharacteristicValue(CYBLE_ESS_PRESSURE , 0, 4, (uint8*)&baro );
17: DBG_PRINTF("BME280:%ld.%02ld, %lu.%02lu, %lu.%03lu\r\n",
18: temperature / 100, temperature % 100,
19: humidity / 100, humidity % 100,
20: pressure / 1000, pressure % 1000);
21: }
22: else
23: {
24: DBG_PRINTF("BME280:measure error\r\n");
25: }
26: }
27:}
設定された時間が経過したらtrueを返すWDT_IsTimeout関数を作成しました。
測定結果をBLEのCharacteristicに書き込んでいます。

TSL2561については、このICのデータシートに載っているソースコードを参考に作成。
レジストの書き込みと読み込みはBME280とほぼ同じでOK。
というか、アドレスしか違わない。あとでまとめた方がよさそう。

main関数のループ呼び出す、TSL2561_Handle関数では、
1:void TSL2561_Handle(void)
2:{
3: uint16 lux, irr;
4: if (WDT_IsTimeout(&timer))
5: {
6: lux = TSL2561_GetLux();
7: DBG_PRINTF("TSL2561:lux=%u\r\n", lux);
8: irr = (lux * 10) / 685;
9: CyBle_EsssSetCharacteristicValue(CYBLE_ESS_IRRADIANCE, 0, 2, (uint8*)&irr);
10: }
11:}
照度(lux)は、BLEでは放射照度(Irradiance)を使用するのでしょうか?
このCharactristicは0.1W/m2単位で格納する必要があるので、
luxを変換して代入しています。
lux⇔W/m2変換は、波長によって変わるようですが、まぁ、いいんでしょう
だけど、単位が荒すぎないですか?
お家では、0か1、がんばって2なんですが。。。
用途違いなのでしょうか。。。

センサー側のログ
画像
1分ごとに各データをNotificationsしています。

データ取得側は、CySmartを使用して、下のログを見るとNotificationを
受信していることが分かります。Notificationを受信すると上側の値も変化します。
画像


照度が納得いってませんが
BLEセンサーは非常に簡単に作成できました
さすが、Cypressですね
記事へブログ気持玉 / トラックバック / コメント


BLEを学ぶ

2016/07/24 09:35
BLEは簡単と言うけれど、初めてだとなかなかね

サンプルは簡単に動かせるけど、作ろうと思うとなかなかね

英語はよくわからないから、PSoC Creatorをメインにして、学習

まずは、「Central」と「Peripheral」 について、

Advertiseしている方が「Peripheral」、
AdvertiseをScanして、Connectを開始する方が「Central」

ということらしいが、なんか無線LANとは逆な感じです。

後で出てくるProfileによって、「Peripheral」だけしか
選択できなかったり、「Central」やどっちでもなれるようになるらいい。
PSoCのBLEの設定から今のところそう判断しています。
画像


次に、「Profile」について、
このBLEが何者かを決めるもの。
BLE SIGによって、ある程度登録されている。
カスタムもできるみたい。
画像

「Server」と「Client」について、
さっきの「Central」と「Peripheral」とは、まったくの無関係らしい。
データを持っている方が「Server」で、取ってくる方が「Client」。

環境センサーの例では、センサー側が「Server」ということになるが、
これはセンサーデータについてだけです。もし、このセンサーが
時間を取得する場合、時間については「Client」になる。
この辺がややこしぃが、まぁ単なる役割としての
呼び名ととらえた方がいいかと思います。

BLEは、Profileを決めて、そのProfileの役割を決めて、

@ Profileの決定
A Profieの役割の決定
B Serviceの選択
C Characteristicsの選択
D Descriptorの選択

という感じで、デバイスが特徴づけられる。
Aまでを、Bluetooth SIGで決められているものに準拠する場合
B〜Dから必須とオプションに従う必要がある。
これにより、スマホとかの標準アプリで操作できるようになる。

PSoCサンプルの環境センサーの場合、こんな感じで、階層化されています。
画像
P:Profile、R:Role、S:Server、C:Characteristics、D:Discriptionを示し、
先の番号と階層の段が対応しています。

Bluetooth SIGでの@〜Bは、ここに一覧があります。

CのCharacteristicsは、Service毎にどのようなCharacteristicsが必要かが先のページの
各Serviceに記載されています。Characteristicsの一覧はここにあります。
DのDescriptorも、先のServiceの仕様書によってどのCharactreristicsには、
どのようなDesciptorを付けられるか決められています。
Descriptorの一覧は、ここにありますが、そのリンク先の情報は十分ではない気がします

PSoC Creatorなら、この辺の組み合わせは、たぶんツールに
予め登録されている(?)と期待しています。

こんな感じにサービスを選択出来て
画像

Characteristicsも選択出来て
画像

Descriptorも選択できます
画像

正しいかどうかは確認してませんが、便利すぎて怖いです

次回は、いつもの環境センサーを作ってみたいです
記事へブログ気持玉 / トラックバック / コメント


BLEはじめました

2016/07/16 15:41
WiFiで遊んだあとは、BLEで遊ばないとね

やっぱり、電池で動かしたいしね

どのメーカーのBLEを購入しようか迷いましたが、

条件は、

@ 日本国内無線認証取得済みモジュール
A モジュールが小さい
B 開発キットが安い
C 日本語資料が多い

というとことでしょう。

有名どころのメーカーは、

Nordic、Microchip、TI、Cypress、STMicro

というとことでしょうか。

SWITCH SCIENCEから買うなら、Nordicのチップを使ったホシデンのモジュール。
秋月電子で買うなら、Microchipのモジュール。
なんか今ひとつ
TI、STMicroのモジュールは、FCCまでか?

Digi-keyで検索してみると、
Nordic、MicrochipやCypressが開発キット、小さなモジュールがあり、良さそうです。
Microchipの開発キットは他と比べると若干高い。
CypressはPSoCにBLEが入っているので、面白そう。
Nordicのドングルならパケットキャプチャできる?
日本語資料なら、NordicよりMicrochipかCypressが優位?

と、適当に比較してみて、PSoCに興味あるし、Cypressに決定

Digi-keyでユーザー登録して、さっそく発注
画像

CY8CKIT-042-BLEだけでいいのですが、
\7,500(?)以上で送料無料になるので、
ついでに、小さなモジュールのCYBLE-022001-00を購入。

これでも足らないので、使いそうな部品を適当に購入。
無駄遣い?

いいえ、飛行機乗って買いに行ったと思えば、激激激激安です

ユーザー登録に1日、発注して3日後には到着。
海外品を入手するのに、1週間もかからないという、鬼世界

中身は、こんな感じで、きっちりしています。
画像

左のマニュアル通りにドングルをPCに刺して、
(ドングルのファームウェアのアップデートが必要)
赤い基板にボタン電池をセットしたら、CapSensor(これもCypressの面白ポイント)
に従って、ドングルのLEDの明るさが変化。

もぉ、これだけでもワクワクが止まらない
記事へブログ気持玉 / トラックバック / コメント


ケース・イン

2016/07/09 12:16
暑い日も安心。

外出先からスマホでエアコンONできるようになったので、
涼しいお家が待ち構えてくれています

ちゃんとしたものに仕上げるため、ブレッドボードではなく、
半田付けして、ケースに入れてみました。

実装済み基板がこちら。
画像

すっかすかです
左側のモジュールがESP8266、右側がBME280モジュールです。
真ん中下にあるのは、電源モジュールです。
ほぼモジュール乗っけているだけです。

赤外線は、従来品より広角のIRに変更して、
トランジスタで駆動してます。写真では、ちょうど真ん中くらいに、
実装しているけど、ケーブルで見えない
ケーブルは、動作確認用のLEDとIRのケーブルです。

これをケースに入れました。
おもて面(?)動作確認用のLEDとIRのLED側が
画像
となってます。
温度測定するのと、無線モジュールが熱くなりそうなので、
空気穴を開けてみましたが、効果はどうなんでしょね

DCジャック面が
画像
となってます。
こちらも空気穴開けておきました。

このあと、ゴム足をつけて完成しました

記事へブログ気持玉 / トラックバック / コメント


スマホ から ESP8266リモコン を リモートコントロール

2016/06/18 23:16
前回は、MQTTプロトコルで、ESP8266リモコンを操作しましたので、
今回は、スマホからESP8266リモコンを操作したいです。

普通(?)に考えると、スマホのアプリからAWS IoTへ接続し、
MQTTでPublishするのかもしれませんが、

スマホのアプリを作るのも面倒ですので、
ブラウザ(@スマホ)から、AWS EC2上のWEBサーバーにアクセスして、
そのサーバーからAWS IoTへMQTTでPublishする方法を取ります

ブラウザから操作するようにすれば、スマホからでもPCからでも、
タブレットからでも、操作出来て、一石二鳥以上です

まずは、javascriptでAWS IoTへPublishしてみます。

このサイトに書いてある通りに、、、
1:var awsIot = require('aws-iot-device-sdk');
2:
3:var device = awsIot.device({
4: keyPath: './certs/private.pem.key',
5: certPath: './certs/certificate.pem.crt',
6: caPath: './certs/iot-rootca.pem.crt',
7: clientId: 'test-devdev',
8: region: 'ap-northeast-1'
9:});
10:
11:device
12: .on('connect', function() {
13: console.log('connect');
14: device.subscribe('#');
15: device.publish('topic_2', JSON.stringify({ test_data: 1}));
16: });
17:
18:device
19: .on('message', function(topic, payload) {
20: console.log('message', topic, payload.toString());
21: });
このファイルを app.js として保存して、
証明書は、AWS IoTで作成した証明書を用意します。
ルート証明書は、 VeriSign root CA certificate を用意します。
これで、

npm install aws-iot-device-sdk
node app.js

とすれば、AWS IoTに接続して、publish と subscribe してくれます
簡単すぎますね。

接続先を指定していませんが、なんかうまいことやってくれているのかな

あとは、これをAWS EC2上で動かして、WEB APIのように見せればよいかと思います。

ということで、作成したWEBページがこんな感じ。
画像
初めてのWEBデザインなので素人感満載です
こんなデザインですが、このページ作成には、結構な時間がかかっています

温度、湿度、気圧の最新データはDynamoDBから取得しています。
これも、ブラウザから直接DynamoDBにアクセスせずに、
WEB APIを用意して、AWS EC2がDynamoDBから取得しています。

スピンボタンで設定温度を調整します。
本物のリモコン同様に、下限14℃、上限30℃にしました。
温度設定後に、冷房と暖房、停止ボタンを押すと、
AWS EC2からESP8266リモコンにコマンドが送られます。

コマンドを送信して、ESP8266リモコンからの応答を受信すると、
下からニョキニョキっとメッセージが上がってきて、送信できたことを知らせてくれます
画像
応答が来ない場合は、失敗した旨を知らせてくれます。

さて、これで一応WEBページはできましたが、
AWS EC2上にWEBサーバを立てるとなると、セキュリティの問題が出ちゃいます。
エアコンのON/OFFしかないけどね。

ということで、HTTPS限定にして、さらにクライアント認証必須にすることにしました。
自己ルート認証局、サーバー証明書、クライアント証明書に関しては、
以前お勉強したので、すんなり行けますが、問題は、これをNode.jsで
どのようにHTTPS + クライアント認証にするかです。。。

このページを参考にして、app.jsを以下のようにしました。
1:var
2: routes = require('./lib/routes'),
3: fs = require('fs'),
4: https = require('https'),
5: http = require('http'),
6: express = require('express'),
7: morgan = require('morgan'),
8: app = express(),
9: options = {
10: key : fs.readFileSync('./certs/server/server.key.pem'),
11: cert : fs.readFileSync('./certs/server/server.cert.pem'),
12: passphrase: process.env.CERT_PASS,
13: ca : fs.readFileSync('./certs/server/rootca.cert.pem'),
14:
15: honorCipherOrder: true,
16: requestCert: true,
17: rejectUnauthorized: true
18: };
19:// ------------- END MODULE SCOPE VARIABLES ---------------
20:
21:// ------------- BEGIN SERVER CONFIGURATION ---------------
22:app.use(morgan(':date[iso] : :remote-addr - :method :url :status'));
23:app.use(express.static(__dirname + '/public'));
24:
25:routes.configRoutes(app);
26:// -------------- END SERVER CONFIGURATION ----------------
27:
28:// ----------------- BEGIN START SERVER -------------------
29:var server_port = process.env.WEB_PORT || 3000;
30:if (process.env.OS === 'Windows_NT') {
31: http.createServer(app).listen(server_port, function () {
32: console.log('HTTP server listening on port %d in %s mode',
33: server_port, app.settings.env);
34: });
35:}
36:else {
37: https.createServer(options, app).listen(server_port, function () {
38: console.log('HTTPS server listening on port %d in %s mode',
39: server_port, app.settings.env);
40: });
41:}
42:// ------------------ END START SERVER --------------------
43:

optionsにhttpsの設定が入っています。証明書は、自分で作成した証明書になります。
passphraseは、サーバーの秘密鍵のパスワードです。
ブログに間違ってアップロードしないように、環境変数に入っています
honorCipherOrderは、よくわからない攻撃用に推奨しているので入れました。
requestCertが、クライアント認証要求です。
rejectUnauthorizedは、認証されていないクライアントを拒否るようです。

httpも入っているのは、localhostでhttpsをやろうとしたら怒られたからです。
判定はいい加減で、OSがWindows_NTかどうかで見ています。

あと、ルーティング部分は、
1:configRoutes = function (app) {
2: if (process.env.OS !=='Windows_NT') {
3: app.all('*', function (req, res, next) {
4: // 証明書の検証
5: var cert = res.connection.getPeerCertificate();
6:
7: if (cert.subject.CN !== 'home-controller' ||
8: new Date(cert.valid_to) < Date.now()) {
9: console.log("CN :" + cert.subject.CN); // for debug
10: console.log("Valid:" + cert.valid_to);
11: res.sendStatus(406); //Not Acceptable
12: return;
13: }
14: next();
15: });
16: }
17:
として、クライアント証明書の検証を入れています。
Node.js側でどのくらいやってくれているかよく分からないので、
とりあえず、クライアント証明書のCNと有効期限をチェックしています。
CNは、home-controller用に証明書を発行しましたので、これ以外の目的は
拒否するようにしています。まだ、これ以外は無いんですけどね

これで、クライアント側にルート認証局証明書、クライアント証明書を入れて、
AWS EC2上で、Node.js WEBサーバーを立てれば完了です。

PCのChromeからアクセスすると、証明書の選択画面が出てきました。
画像
OKをおすと、無事にhttpsでアクセスできました
画像

同様にスマホからも、証明書をインストールして、
画像
となりました

ここで注意
スマホからテストするとき、WiFiを切ってアクセスしましょう。
AWS EC2側でIPアドレス制限している場合、外に行ったらスマホから
アクセスできないってことになります

もう一点
EC2上にバックグラウンドでNode.js WEBサーバーを立てる場合、
単に、

node app.js &

としただけでは、PUTTYを切った後、しばらくすると、
nodeプロセスは死んでしまいます

いろいろ調べたところ、どうやらSSHで接続すると、
SSHのプロセスが親プロセスになって、nodeプロセスは子プロセス
として動作するため、親がいなくなると、子は消されるようです

これを回避するためには、

nohup node app.js > test.log 2>&1 &

のように、nohupコマンドを使用します。
ログはエラー含めて、test.logに出力されます

なんとか、真夏になる前に、外から冷房を入れられるようになりました
真夏が楽しみでなりません

最後に、証明書は入ってないですが、WEBサーバーのソースコードを参考まで ⇒ ここ

さて、つぎは、何つくろうかな
記事へブログ気持玉 / トラックバック / コメント


ESP8266 を AWSクラウド エアコン用リモコンに

2016/06/12 09:48
前回は、ESP8266をエアコンの赤外線リモコンにましたので、
AWS IoTを経由して、このリモコンを操作します。

AWS IoTへMQTTプロトコルでPublishしたコマンドを
ESP8266でSubscribeしてあげれば、外部操作できそうです。

まずは、コマンドを定義します。コマンドは、流行りのjson形式で、

{
"operation":"stop",
"temp": 26
}

としました。
operationは、動作停止(stop)、冷房(cool)、暖房(heat)、除湿(dry)をサポートし、
tempは、設定温度を数値で入れます。

ESP8266 SDKに付属のcJSONライブラリで簡単にjsonを読めます。

コマンド解析と、赤外線送信は次のようにしました。
1:char name[12];
2:cJSON *msg;
3:cJSON *cjson_ope;
4:cJSON *cjson_temp;
5:int8 response = -1;
6:uint16 cmd = 0;
7:uint16 temp = 0;
8:
9:msg = cJSON_Parse(cmd_json);
10:if (msg == NULL) {
11: IPRINTF("cJSON error\n");
12: return;
13:}
14:
15:irom_strcpy(name, "operation");
16:cjson_ope = cJSON_GetObjectItem(msg, name);
17:irom_strcpy(name, "temp");
18:cjson_temp = cJSON_GetObjectItem(msg, name);
19:
20:if ((cjson_ope != NULL) && (cjson_temp != NULL)
21: && (cjson_ope->type == cJSON_String)
22: && (cjson_temp->type == cJSON_Number)) {
23:
24: temp = (cjson_temp->valueint * 2) & 0xff;
25: if (irom_strcmp(cjson_ope->valuestring, "stop") == 0) {
26: cmd = AIRCON_OPERATE_STOP;
27: }
28: else if (irom_strcmp(cjson_ope->valuestring, "cool") == 0) {
29: cmd = AIRCON_OPERATE_COOL;
30: }
31: else if (irom_strcmp(cjson_ope->valuestring, "heat") == 0) {
32: cmd = AIRCON_OPERATE_HEAT;
33: }
34: else if (irom_strcmp(cjson_ope->valuestring, "dry") == 0) {
35: cmd = AIRCON_OPERATE_DRY;
36: }
37: if ((cmd != 0) && (temp >= 16*2) && (temp <= 30*2)) {
38: ir_data[AIRCON_OFST_OPERATE] = cmd;
39: ir_data[AIRCON_OFST_TEMP] = temp;
40: ir_data[AIRCON_OFST_SUM] = (AIRCON_SUM + cmd + temp) & 0x00ff;
41:
42: IPRINTF("AIRCON:%s:%d\n",
43: cjson_ope->valuestring, cjson_temp->valueint);
44: IR_Tx(ir_data, sizeof(ir_data) / sizeof(uint16));
45: response = 0;
46: }
47: else {
48: ERROR("Aircon cmd error");
49: response = 1;
50: }
51:}
52:else {
53: ERROR("Aircon cmd format error");
54: response = 2;
55:}
56:cJSON_Delete(msg);
最初にcJSON_Parseで解析して、cJSON_GetObjectItemでアイテムを取り出します。
最後にcJSON_Deleteで後始末します
15行目と17行目でitem名をname変数にコピーしていますが、
これは文字列をすべてirom領域に配置しているため、
そのままcJSON_GetObjectItemに渡すとアクセスエラーとなるためです。
ESP8266 SDKを変な風に使っているための仕様です

AWS IoTを使用するなら、Shadow機能を使ったほうが良いかもしれませんが、
単なるリモコンであり、エアコン側の状態が取得できないため、
Shadow機能を利用してもあまりメリットがないと考えました

しかし、本当にコマンドが遅れたかどうかは、知りたいので、
ESP8266はコマンドに対して応答を返すようにしました。
1:if (response >= 0) {
2: MQTTPublishParams *pubResp;
3: char *pTopicMsg;
4:
5: if ((pubResp = calloc(sizeof(MQTTPublishParams), 1)) == NULL) {
6: WARN("AIRCON result alloc err");
7: }
8: else if ((pTopicMsg = calloc(20+50, 1)) == NULL) {
9: free(pubResp);
10: WARN("AIRCON result alloc err");
11: }
12: else {
13: irom_strcpy(&pTopicMsg[ 0], AIRCON_RESP_TOPIC);
14: irom_strcpy(&pTopicMsg[20], response_text[response]);
15: pubResp->pTopic = &pTopicMsg[0];
16: pubResp->MessageParams.qos = QOS_0;
17: pubResp->MessageParams.isRetained = false;
18: pubResp->MessageParams.pPayload = &pTopicMsg[20];
19: pubResp->MessageParams.PayloadLen = strlen(&pTopicMsg[20]);
20: aws_iot_mqtt_publish(pubResp);
21: INFO("AIRCON:%s", response_text[response]);
22:
23: free(pTopicMsg);
24: free(pubResp);
25: }
26:}
このコードが前記のコードの後に続いています。
応答用のトピックに応答結果をjson形式で入れて、Publishしています
応答文字列(response_text)は
1:static const char* response_text[] = {
2: "{\"result\":\"success\"}",
3: "{\"result\":\"command error\"}",
4: "{\"result\":\"format error\"}"
5:};
の3種類だけです

実験として、対抗機はいつものMQTT.fxを使用しました。
次のようにPublishして、
画像

Subscribeで結果を見てみると、
画像

ESP8266が応答をPublishしていることが確認できました

なんか、応答までの時間がやたら短いですが、
コマンドの時間は、こちらからの送信時間ではなく、AWSがSubscribe先に
送信したものを受信した時間だからだと思います。

ESP8266のログは、
画像

とあり、コマンドの受信と応答しています
エアコンもちゃんと、「ピッ」と言ってくれてます

ちなみに、前回の自作したIRのライブラリは、メモリリークしていましたので、
こっそり修正しておきました。

これで、ESP8266側のソフトは完了かと思います
参考までに、こちらに置きました。 ⇒ ここ

次は、スマホからエアコンを操作ですね
記事へなるほど(納得、参考になった、ヘー) ブログ気持玉 2 / トラックバック 0 / コメント 0


ESP8266 に 赤外線(IR) をつなげて、リモコる

2016/05/29 10:04
ESP8266 に IR を接続して、リモコンにしたいです

完成したIRサンプルプログラムは、こちらです。

まずは、本物のリモコンの信号を受信します。
対象は、こちらのパナソニックのエアコン用リモコンです。
画像

赤外線受信器は、SWITCH SCIENCEさんから
TSOP382を使ったSeedStudioのGROVEシリーズを購入。

この出力は、32kHzの変調信号を検出した結果になりますので、
単純にHighとLowを識別すればOKです

あとは、High区間とLow区間の時間を計測して、デコードします。

この時間計測は、立ち上がり、立下り両エッジで割り込みを入れ、
そのときの時間をシステムタイマーを使って記録しました。

まずは、割り込みGPIO受信ポートの設定は、
1:#define IR_RX_MUX PERIPHS_IO_MUX_GPIO4_U
2:#define IR_RX_NUM 4
3:#define IR_RX_FUNC FUNC_GPIO4
4:
5:void set_rx_port(void)
6:{
7: PIN_FUNC_SELECT(IR_RX_MUX, IR_RX_FUNC);
8: GPIO_REG_WRITE(GPIO_ENABLE_W1TC_ADDRESS, (1 << IR_RX_NUM)); // input
9:
10: _xt_isr_attach(ETS_GPIO_INUM, IRi_Interupt, NULL);
11:
12: pin_reg = GPIO_REG_READ(GPIO_PIN_ADDR(IR_RX_NUM));
13: pin_reg &= (~GPIO_PIN_INT_TYPE_MASK);
14: pin_reg |= (GPIO_PIN_INTR_ANYEDGE << GPIO_PIN_INT_TYPE_LSB);
15: GPIO_REG_WRITE(GPIO_PIN_ADDR(IR_RX_NUM), pin_reg);
16:
17: _xt_isr_unmask(1<<ETS_GPIO_INUM);
18:}
となります。IO4に入力しました。
やることは、入力ポートに設定、割り込み関数の登録、
両エッジ割り込みに設定、割り込み許可です。

そして、割り込み関数では、時間を計測します。
1:void IRi_Interupt(void)
2:{
3: uint32 gpio_status;
4: uint32 delt, cur;
5: uint32 rx;
6:
7: gpio_status = GPIO_REG_READ(GPIO_STATUS_ADDRESS);
8: //clear interrupt status
9: GPIO_REG_WRITE(GPIO_STATUS_W1TC_ADDRESS, gpio_status);
10:
11: rx = 1 - GPIO_INPUT_GET(IR_RX_NUM);
12: cur = system_get_time();
13:
14: if (irrx_idx == 0) {
15: delt = 0;
16: }
17: else {
18: delt = ((cur - irrx_bktime) >> 1) << 1;
19: }
20: irrx_bktime = cur;
21:
22: if (irrx_idx < MAX_DAT_NUM) {
23: irrx_data[irrx_idx++] = (uint16)(delt | rx);
24: }
25: else {
26: irrx_ovf = 1;
27: }
28:}
単純に割り込みごとに前回の時間との差を保存しています。
単位はusになります。High区間かLow区間かは、bit0に入れました。

あとのデコードは、タスクで、1秒ごとにバッファに時間データが
入っているかチェックして、入っていたら、さらに1秒待ってからデコードします。
今回のリモコンは、家電協フォーマットだったので、その時間でデコードしました。

デコード結果は次のようになりました。
1:冷房 26℃
2:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x00,0x00,0x06,IR_STOP_BIT,
3:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x31,0x34,0x80,0xaf,0x00,0x00,0x06,0x60,0x00,0x00,0x80,0x00,0x16,0x96,IR_STOP_BIT,
4:
5:冷房 27℃
6:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x00,0x00,0x06,IR_STOP_BIT,
7:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x31,0x36,0x80,0xaf,0x00,0x00,0x06,0x60,0x00,0x00,0x80,0x00,0x16,0x98,IR_STOP_BIT,
8:
9:冷房 28℃
10:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x00,0x00,0x06,IR_STOP_BIT,
11:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x31,0x38,0x80,0xaf,0x00,0x00,0x06,0x60,0x00,0x00,0x80,0x00,0x16,0x9a,IR_STOP_BIT,
12:
13:除湿 27℃
14:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x00,0x00,0x06,IR_STOP_BIT,
15:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x21,0x36,0x80,0xaf,0x00,0x00,0x06,0x60,0x00,0x00,0x80,0x00,0x16,0x88,IR_STOP_BIT,
16:
17:暖房 25℃
18:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x00,0x00,0x06,IR_STOP_BIT,
19:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x41,0x32,0x80,0xaf,0x00,0x00,0x06,0x60,0x00,0x00,0x80,0x00,0x06,0x94,IR_STOP_BIT,
20:
21:停止(冷房 27℃)
22:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x00,0x00,0x06,IR_STOP_BIT,
23:IR_READER_CODE,0x02,0x20,0xe0,0x04,0x00,0x30,0x36,0x80,0xaf,0x00,0x00,0x06,0x60,0x00,0x00,0x80,0x00,0x16,0x97,IR_STOP_BIT,
2行で1セットのコマンドです。
赤色部が動作モードを示し、緑色部が設定温度を示していることが分かります。
温度は、設定温度を2倍した数値が入っています。純正リモコンでは、
設定が1℃刻みですが、もしかすると0.5℃刻みが可能なのかもしれませんね
STOPビット手前は、すべてのデータを加算した結果(下位1バイト)が入っています

デコードしてみて分かりましたが、常に全部の設定情報を送っているのですね。
いつも、迷っていたのですよ。リモコンで温度設定を変えたときに、
「ピッ」ってならなかった場合、再設定はどうやって送るのかと

いままでは、温度の↑か↓を一回押して、
再度、希望の温度になるように送り直していました
正解の再送信は、冷房なら冷房ボタンを押せばいいんだねぇ〜

これで、リモコン学習完了です。こんどは、これを送信します。

赤外線送信器は、SWITCH SCIENCEさんからSeedStudioのGROVEシリーズを購入。

単なる赤外のLEDなので、リモコン用には38kHzの変調信号が必要です。
これをPWMを使って実現しました。
1:#define IR_TX_MUX PERIPHS_IO_MUX_GPIO5_U
2:#define IR_TX_NUM 5
3:#define IR_TX_FUNC FUNC_GPIO5
4:#define PWM_PERIOD 26 /* 38kHz = 26.32us */
5:
6:static uint32 pwm_info[][3] = {
7: {IR_TX_MUX, IR_TX_FUNC, IR_TX_NUM}
8:};
9:
10:void ir_tx_init(void)
11:{
12: /* setting tx port */
13: u32 duty[1] = {0};
14: pwm_init(PWM_PERIOD, duty, 1, pwm_info);
15: ir_tx_off();
16:}
17:
18:static void ir_tx_on(void)
19:{
20: pwm_set_duty(512, 0); /* duty = 50% */
21: pwm_start();
22:}
23:
24:static void ir_tx_off(void)
25:{
26: pwm_set_duty(0, 0); /* duty = 0% -> keep low */
27: pwm_start();
28:}
IO5を送信用ポートにしました。
pwmはOFF(Low固定)がないので、duty比を0にしてLow固定にしています。
送信時はduty比50%になるように設定しています。
このduty設定がマニュアル読んでも理解できませんでした
実際に動かした結果、0〜1024で指定するのでは?となりました
この範囲は、PWM周期を変えても同じでした。

あとは、指定時間だけHigh、Lowする関数を用意して、
1:static void ir_tx_signal(uint32 high_us, uint32 low_us)
2:{
3: uint32 start;
4:
5: /* HIGH */
6: start = system_get_time();
7: ir_tx_on();
8: while((system_get_time() - start) < high_us) continue;
9:
10: /* LOW */
11: start = system_get_time();
12: ir_tx_off();
13: while((system_get_time() - start) < low_us) continue;
14:}
READERコードとか、各ビットデータを順次送信していけばOKです
ループで時間計測しているので、100%ではないですが、
送信専用のタスクを作り、高優先度で実行させました
また、送信中はGPIOの割り込みを禁止して、
自分自身を受信しないようにしました

先ほど学習したデータを送り、無事にエアコンくんが「ピッ」と
なってくれました。「ピッ」、「ピッ」、「ピッ」、、、

試しに最後の値を1だけ変えた値を送ったところ、
エアコンくんは、何も言いませんでした

赤外線リモコン 完了です
記事へブログ気持玉 / トラックバック / コメント


Node.js を 使って Dynamodb と遊ぶ

2016/05/22 13:15
Node.js を使ったHTTPサーバーから、Dynamodb内のデータを
取得するところが目標です。

まずは、Node.jsでDynamodbへアクセスしました。

AWS Document を参考にして、 ⇒ ここ

資格情報を作成します。

IAMのユーザーから資格情報タブを開き、
使用するアクセスキーを確認します。

以前作成したキーが一覧で出てきます
このページからは、アクセスキーIDは見れますが、
秘密鍵は、アクセスキー作成時にしかダウンロードできませんので、
もし、無くしてしまったら、新しく作りましょう。
画像


PuTTY で EC2サーバーに接続し、

"~/.aws/credentials" ファイルを作成し、アクセスキーと秘密鍵の情報を書きます。
画像

この秘密鍵をサーバーに置くのに抵抗感があります
さらに、Dynamoにアクセスする権限は、このアクセスキーのユーザーに
なることも抵抗感があります

この方法しか EC2 からアクセスできないとすると、
今の開発用ユーザーではなく、最低限必要なロールを与えた
別のユーザーを作成して、そのアクセスキーをEC2サーバーに
設定するほうがよいかと思います

文句が多くなりましたが、

次に、テスト用フォルダに移り、

$ npm install aws-sdk

と入力して、aws-sdkを使えるようにします。

ドキュメントによると、Step1で、テーブルを作成します。
このページにあるコードを自分用にAWS.config部を修正します。
1:AWS.config.update({
2: region: "ap-northeast-1",
3:});
"region"は自分が使用している地域を設定します。
ドキュメントのendpoint はローカルが設定されてますので、
AWS上のdynamoにアクセスする場合は必要ないようです。
たぶん、資格情報を基に、endpointが設定されるのかな?
実行してみます。
画像
もっと表示は続きますが、特にエラーは出ていないようです

次の、Step.2 では、データをロードして追加します。
こちらも、AWS.config.updateの内容を先ほどお同じように修正します。
ダウンロードしたデータは量が多いので、そのまま実行すると、
途中からエラーになってしまいました。たぶん、書き込みキャパシティーユニットを
超えてしまうのかと思いますので、テストなので、ファイルサイズ50KBくらいに
なるように削除して試したほうが良いと思います。
実行します。
画像
実際に、AWSからDBを見てみると、確かに追加できているようです
画像


Step.3 は項目追加、更新等です。
ここは、より詳しくやるとき参照するってことでSkip

Step.4 はQueryです。
こちらも、AWS.config.updateの内容を先ほどお同じように修正します。
データを削ってしまったので、2012年のMoviesをQueryしてみました。
画像
Queryできました
より詳しいQueryは今後参照するってことでこれ以降はSkip

以上のことを EC2 上でやってましたが、
ローカルPC上でも、Node.jsをセットアップして、
資格情報を置けば、同じことができます

ということは、この方法は、EC2 と Dynamodb は連携していない?
ような気がして仕方がないです。。。

気を取り直して、EC2 上にHTTPサーバーを立てて、
HTTP経由でDynamodbを参照してみます。
次のファイルを、web_query01.jsとして保存して実行します。
1:var http = require('http'),
2: server = http.createServer(),
3: AWS = require("aws-sdk");
4:
5:AWS.config.update({
6: region: "ap-northeast-1",
7:});
8:
9:var docClient = new AWS.DynamoDB.DocumentClient();
10:
11:server.on('request', doRequest);
12:server.listen( 3000 );
13:console.log(
14: 'Server listening on port %d', server.address().port
15:);
16:// リクエストの処理
17:function doRequest(req, res) {
18: console.log("Querying for movies from 2012.");
19: var params = {
20: TableName : "Movies",
21: KeyConditionExpression: "#yr = :yyyy",
22: ExpressionAttributeNames:{
23: "#yr": "year"
24: },
25: ExpressionAttributeValues: {
26: ":yyyy":2012
27: }
28: };
29:
30: docClient.query(params, function(err, data) {
31: var str = "";
32: if (err) {
33: console.error("Unable to query. Error:", JSON.stringify(err, null, 2));
34: str = 'Unable to query. Error:' + JSON.stringify(err, null, 2);
35: }
36: else {
37: console.log("Query succeeded.");
38: data.Items.forEach(function(item) {
39: console.log(" -", item.year + ": " + item.title);
40: str += item.year + ": " + item.title + '\r\n';
41: });
42: }
43: res.writeHead(200, {'Content-Type': 'text/plain'});
44: res.write(str);
45: res.end();
46: });
47:}
48:

そして、実行します。
画像

ブラウザから、http://パブリックDNS:3000/へアクセスすると
画像
のように、無事にQuery結果を取得できました。

Dynamodb内のデータを自由にアクセス出来そうです
記事へブログ気持玉 / トラックバック / コメント


AWS EC2 にNode.js で HTTPサーバー立ててみた

2016/05/15 10:57
先週から温度データを無意味にDynamodbに貯めてます。

AWS EC2上にHTTPサーバーを立てて、
Dynamodbのデータをブラウザで表示したいです。

はい、がんばります

まずは、EC2を動かしてみました。
インスタンス作成は簡単でした。無料利用枠を選んでいけばOK?
画像
Windowsとかもあるようですが、折角(?)なのでAmazon Linuxで
セキュリティの設定では、一応IPアドレスの制限をかけてみました。
送信元に"マイIP"を選択すると自分のグローバルIPアドレスが勝手に入ってくれます
画像
我が家は固定IPではないので、あとで少し調整が必要かと思います
作成すると、しばらくして状態がrunningになります。
画像
ん〜簡単すぎますね。1台パソコンの完成です

で、このパソコンに接続する方法ですが、Amazonのドキュメントを参考にして、
PuTTYとWinSCPを使用しました。WinSCPを使えば、ほとんど
エクスプローラーと同じ感覚でファイル操作ができます

さて、何を使ってHTTPサーバーを立てるか迷った挙句、Node.js を選択しました
選択理由は、いつもの気まぐれです。
・なんとなく新しいっぽい
・Windowsでも使える
Phytonでも良さそうな感じですが、最大の理由は、この本
シングルページWebアプリケーション ―Node.js、MongoDBを活用したJavaScript SPA
オライリージャパン
Michael S. Mikowski

amazon.co.jpで買う
Amazonアソシエイト by シングルページWebアプリケーション ―Node.js、MongoDBを活用したJavaScript SPA の詳しい情報を見る / ウェブリブログ商品ポータル
を読んで、大きく影響されました。なんかすごいかっこいい
理由になってないです

Node.jsをEC2にインストールしました。
いくつかのサイトを参考にしながら・・・、まずgitをインストールしました。
$ sudo yum update
$ sudo yum install git gcc-c++ make openssl-devel

次に、nvm本家を参考にして、nvm をインストールしました。
$ git clone https://github.com/creationix/nvm.git ~/.nvm && cd ~/.nvm && git checkout `git describe --abbrev=0 --tags`

環境設定しました。
$vi ~/.bashrc
で.bashrcの最後に、

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm

を追加しました。そして、

$ source ~/.bashrc

として、設定を反映して、

$ command -v nvm

と入力して、”nvm”と表示されればOKだそうです
画像

Node.js はこのnvmを使ってインストールします。
利用可能なNode.jsのバージョンリストを

$ nvm ls-remote

で見てみると、いっぱいありますね。
Node.js本家を見ると、
通常ユーザーは、4.4.4を使えばよいらしいので、このバージョンをインストールします。

$ nvm install 4.4

これで、4.4の最新版が入るようです。
画像
コマンドを確認。
画像


Hello worldを表示するHTTPサーバー用のコード
1:var http, server;
2:http = require('http');
3:server = http.createServer(function(req, res) {
4: res.writeHead(200, {'Content-Type':'text/plain'});
5: res.end('Hello World!!');
6:}).listen(3000);
7:console.log('Listening on port %d', server.address().port);
8:
を、"hello.js"として保存して、実行します。

$ node hello.js
画像
ポートは3000ですので、このポートを開いてあげる必要があります。
作成したセキュリティーグループを選択して、インバウンドタブを選び、
編集して、ポート3000を開きます。
画像

これで、外から3000へアクセス可能になりました。

ブラウザから、パブリックDNSのポート3000へアクセスすると、
Hello Worldが表示されました
画像


次回はDynamodbにアクセスしたいですね
記事へブログ気持玉 0 / トラックバック 0 / コメント 1


温度データ(ダミー)をAWS IoT にアップ&保存する

2016/04/29 12:30
AWS IoTとMQTTで通信する方法はすでに出来ていますので、⇒ ここ参照
センサーからのデータを保存するイメージで、
温度データをAWS IoTへ投げて、保存してみました。

AWSにログインして、最初にDynamoDBを選択して、
データを保存するテーブル作成します。
画像

テーブル名とプライマリキーを入力して作成します。
画像
プライマリキーは検索に使用しますので、
デバイスのIDとするため、それらしい名前(DevId)にしました。
しばらくすると、テーブルの作成が完了します。

次に、AWS IoTサービスを開いて、"Create a rule"を選択します。
名前と説明を適当に入力して、Attribute、Topic filterを次のように入力しました。
画像
いろいろ、いじった結果、Topic filterにマッチした
PublishされたJSON形式のメッセージからAttributeにマッチした
キーを保存することと解釈しました

下にスクロールして、ActionにDynamoDBを選択して、
その他を次のように入力しました。
画像
Hash key valueの"${topic(2)}"は、
PublishされたTopicの2番目のレベル(?)名に変換されます。
つまり、Topicが”sensor/abc/def”の場合、${topic(2)}は、”abc”になります。
もちろん、${topic(3)}なら”def”となります。
したがって、デバイスからPublishするときに、TopicにDevIdを指定できることになります。

${timestamp()} は、メッセージを受信した時間に変換されます。
この時間は、日本時間ではなくUTCなので注意が必要です。
おそらく、どこの国のサーバーを使用しても困らないようにUTCにしていると考えられます。
なんとなく世界が一つになってきてる気がしますね

Payload fieldは、保存されるデータの列名になるようなので、
とりあえず何でもいいみたいです。

Role nameは、”Create a new role”をクリックして、
画像
そのまま、”許可”をクリックしました。
中身は、SensorDataTableへのアイテム書き込み許可
という感じなのでしょう。セキュリティ上あるいは誤操作防止用に
狭い範囲のみ許可していると考えられます。

Add actionをクリックして、Createをクリックして完了です。

では、MQTT.fxを使用して試したいと思います。
DevIdに、MQTT.fxを指定(Topicのレベル2に入力)して、
"sensor"キーに温度と湿度データを入れたメッセージをPublishします。
画像

AWS上のDynamoDBの項目タブに保存されたデータが確認できました
画像
2つあるのは、2回Publishボタン押しちゃったからです

AWS IoT側の設定は、これでOKでしよう
次は本物のデータをアップしましょう
記事へブログ気持玉 / トラックバック / コメント


タイトル 日 時
AWS-IoT-SDK が ESP8266 に入った!(成功編)
AWS-IoT-SDK が ESP8266 に入った!(成功編) 前回、AWS-IoT-SDK を ESP8266 に入れましたが、 RAM領域を不本意に使われていましたので、修正を行いました。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/04/24 10:52
AWS-IoT-SDK を ESP8266 に入れてみたが・・・(その2)
前回、ヒープメモリが足らず、 何がそんなにメモリを取っているのか調査しました。 ...続きを見る

なるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 0 / コメント 0

2016/04/10 14:40
AWS-IoT-SDK を ESP8266 に入れてみたが・・・
AWS-IoT-SDK を ESP8266 に入れてみたが・・・ 前回、SDK付属SSLがTLS1.2に対応しておらず、 AWS IoTに接続できなかったので、 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/04/03 08:47
AWS IoT に ESP8266で接続・・・
AWS IoT に ESP8266で接続・・・ 今回は、AWS IoT に ESP8266 で接続したけど、 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/03/26 14:00
AWSのIoTを試してみる
AWSのIoTを試してみる AWSを開始したよ。 ...続きを見る

ブログ気持玉 0 / トラックバック 1 / コメント 0

2016/03/20 10:09
クラウドサービスを試したい
クラウドサービスを試したい HDDは壊れるし、 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/03/13 10:16
ESP8266でSSL通信(その2)
ESP8266でSSL通信(その2) 以前、.NETで作成したSSLサーバーに対して、 ESP8266から接続しました。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/03/05 12:48
ESP8266でSSL通信(その1)
ESP8266でSSL通信(その1) 前回、SSL証明書をお勉強しましたので、 ESP8266でSSL通信させてみたいと思います。 ...続きを見る

なるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 0 / コメント 0

2016/02/28 17:23
SSLを学習 〜ローカル通信テスト編〜
SSLを学習 〜ローカル通信テスト編〜 前回、証明書を作成しましたので、 この証明書を使って、SSL通信のテストを行いました。 ...続きを見る

なるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 0 / コメント 0

2016/02/20 14:10
SSLを学習 〜証明書作成編〜
なにかとセキュリティがうるさい ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/02/11 14:11
ESP8266にMQTTを実装する (その2)
ESP8266にMQTTを実装する (その2) 前回の続きです。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/02/07 08:19
ESP8266にMQTTを実装する (その1)
ESP8266にMQTTを実装する (その1) MQTTが少しわかったところで、 そして、Ubuntu on VirtualBox上で Pushlish、Subscribeが出来るようになりましたので、 ...続きを見る

ブログ気持玉 0 / トラックバック 1 / コメント 0

2016/02/06 21:32
IoTの前にMQTTを試そう
IoTの前にMQTTを試そう ESP8266+BME280で温度も測定できるようになったし、 データをクラウドに上げたいです...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/01/30 19:18
ESP8266でIoT I2C+BME280ソフト編
ESP8266でIoT I2C+BME280ソフト編 ESP8266+BME280のソフトを作ってみます...続きを見る

ブログ気持玉 0 / トラックバック 0 / コメント 2

2016/01/23 11:39
ESP8266でIoT I2C編
ESP8266でIoT I2C編 無線が繋がりましたので、センサーを繋げてみたいと思います。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/01/16 09:24
ESP8266開発環境構築 WiFi接続編
ESP8266開発環境構築 WiFi接続編 無線LANモジュール ESP8266 の開発環境を構築しよう〜WiFi接続編〜です。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/01/11 13:03
ESP8266開発環境構築 Flash書き込み編
ESP8266開発環境構築 Flash書き込み編 無線LANモジュール ESP8266 の開発環境を構築しよう。 今回は、Flashへの書き込み編です。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/01/09 20:49
ESP8266開発環境構築 FirstBuild編
ESP8266開発環境構築 FirstBuild編 無線LANモジュール ESP8266 の開発環境を構築しよう〜初めてのビルド編〜です。 開発環境の構築は、こちらのサイトを参考にしました。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2016/01/04 13:49
ESP8266開発環境構築 Ubuntuセットアップ編
ESP8266開発環境構築 Ubuntuセットアップ編 クリスマスプレゼントと称して購入した 無線LANモジュール ESP8266 の開発環境を構築しよう 技適取得済みなので、安心してブログでも紹介できますね ときどき、技適取得してないモジュールをブログで使っている人いるけど、 公に、「犯罪してます!」って言ってるようなもんなんだけどね。 ...続きを見る

ブログ気持玉 / トラックバック / コメント

2015/12/26 10:38
クリスマスプレゼント
クリスマスプレゼント 今年のクリスマスプレゼントは、 ...続きを見る

なるほど(納得、参考になった、ヘー) ブログ気持玉 1 / トラックバック 0 / コメント 0

2015/12/23 10:56

トップへ | みんなの「電子工作」ブログ

迷える子羊の苦悩 電子工作のテーマ/BIGLOBEウェブリブログ
文字サイズ:       閉じる