LoginSignup
0
3

More than 3 years have passed since last update.

ESP32とMySQLとXAMPPを使ってWiFi強度(RSSI)をリアルタイムで閲覧したい

Last updated at Posted at 2020-11-17

たまにネットワークが途切れるがどのネットワークが強いのか接続しないと分からないなぁ。のひとことから勉強のつもりで作ってみました。
esp32でRSSIを取得するコードがなかなかみつからなかったのでここに残します。
arduino ideのソースコードに関してはほぼ初心者でhtmlは今回の件で初めて触りました。
自分で見てもかなり見にくいのでアドバイスもいただけますと幸いです。
もちろん市販品のほうが性能もよく見やすいのは承知です。

今回の目標

①esp32でRSSIを取得しMySQLへ蓄積。
②MySQLに蓄積されたデータをxamppを使い社内のみブラウザで閲覧できるようにする。

①の攻略

まずソースコードは以下の通り。
環境設定をしたarduino ideへ。

esp32_wifi_power_complete.ino

 #include <SPI.h>
#include <WiFi.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

const char ssid[] = "*******";
const char pass[] = "*******";

//ESP32のIPアドレス
IPAddress ip(***, **, **, ***);
IPAddress gateway(***, **, **, *);
IPAddress subnet(255, 255, 255, 0);

// Wifi 通信用
WiFiClient client;

// SQLサーバーのIPアドレス
IPAddress server( ***, **, **, ***);
// SQLユーザー名
char user[] = "*******";
// SQLパスワード
char password[] = "*********";

// SQLコマンド用
MySQL_Connection conn ((Client *)&client);

char INSERT_SQL[] = "INSERT INTO schemas名.テーブル名(要素①, 要素②, 要素③, RSSI) VALUES('***', '***', '****', %ld)";

long get_current(void);
void insert_data(long);


void setup()
{

 Serial.begin(115200);

 WiFi.config(ip, gateway, subnet);

 WiFi.begin(ssid, pass);

 Serial.println("WiFi connecting");

 Serial.println(WiFi.localIP());

 //SQLサーバへの接続
 Serial.println("Connecting Database");
 if (conn.connect(server, 3306, user, password)) {
   delay(10000);
 }
 else {
   Serial.print("Connection failed!");

 }
 //SQLサーバの切断
  conn.close();

}

void loop () {

  int i;

  while (WiFi.status() != WL_CONNECTED) {
    Serial.println("Couldn't get a wifi connection");
    WiFi.begin(ssid, pass);
    delay(1000);

  }

  long rssi = WiFi.RSSI();
  Serial.print("RSSI:");
  Serial.println(rssi);
   Serial.println(ssid);
  delay(1000);

    //SQLサーバへの接続
  Serial.println("Connecting Database");
  if (conn.connect(server, 3306, user, password)) {
    delay(1000);
    //データの書き込み
    insert_data(rssi);
  }
  else {
    delay(1000);
    Serial.print("Connection failed!");

  }

  conn.close();

  //26秒待つ
  for (i = 0; i < 26; i++) {
    delay(1000);
  }

}

//SQLサーバへの書き込み
void insert_data(long rssi)
{

  char buf[600];

  Serial.print("Recording data=");
  Serial.println(rssi);

  sprintf(buf, INSERT_SQL, rssi);

  //SQLの書き込みオブジェクトの作成
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  //SQLの書き込み
  cur_mem->execute(buf);
  //SQLの書き込みオブジェクトの開放
  delete cur_mem;

}

MySQLの使い方やarduino ideでのESP32の環境設定などはわかりやすいサイトが多くありますのでそちらをご覧ください。

いろんなところから引き抜いてきたコードなので不要な箇所もあるかもしれませんが一応正常に動作しています。

以前まで動作中にWiFi接続が切れてしまうことやMySQLへの接続がきれてしまうことがありましたが、このプログラムに変更してから切断されても再接続できるようになりました。

私は初心者なのでMySQL Workbenchで確認をしていますがもちろんコマンドプロンプトからも可能です。

データが送られていることが確認できれば①は攻略です。

自分の努力の割に説明することが少ないので不明な点はご質問ください。

随時更新します。

②の攻略

MySQLにデータを蓄積することは今までも経験があったのですが、正直そこで満足していました。
でもせっかく時間があるので社内のみで見れないかな~と考えていた時に出会ったのがxamppです。
xamppについては以下のページが鬼分かりやすかったのでリンクを貼っておきます。

markdown:https://www.adminweb.jp/xampp/
Markdown:https://techacademy.jp/magazine/1722

これらの基礎を踏まえて以下のコードになりました。

test.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>タイトル</title>


<style>

h1{ color: blue; }

h1{ background: white}

body{ background: black }

body{ text-align: center }

.first{ border: double 10px brown }

h1{ border-bottom: dotted 5px brown }

.side{ display: flex;
 justify-content: space-around; }

body{ color: white;}

</style>

</head>

<body>

<h1>表題</h1>

<div class="first">
<h2>強度の見方</h2> 
<p>RSSI=0 ・・・世界最強</p>
<p>RSSI=-50 ・・・結構いい</p>
<p>RSSI=-75 ・・・普通</p>
<p>RSSI=-100 ・・・接続不可</p>
</div>

<div class="data">

<h2>IPアドレス</h2>

<?php

$dsn = 'mysql:dbname=*******;host=localhost';
$user = '******';
$password = '*******';

try{
    $dbh = new PDO($dsn, $user, $password);

    $sql = 'select * from **** where **** = "*********" order by PK desc limit 1';
    foreach ($dbh->query($sql) as $row) {
        print($row['*****'].' *****');
        print($row['*****'].' *****');
        print($row['****']);
        print('<br />');
    }
}

catch (PDOException $e){
    print('Error:'.$e->getMessage());
    die();
}
?>

</div>

</body>
</html>

そして
http://*****/test.phpにアクセスするとまあ見れるぐらいのものが表示されるはずです。

終わりに

もし興味があればご連絡下さい。
一応ほぼ0からの素人が作ったのである程度は説明できると思うのですが投稿するのになれてなさ過ぎてなにを書けばいいかさっぱりです。
連絡いただければ必ず返答しますのでお許しください。。。

今後はHTMLの勉強をしてかっこいいページをつくりたいですね

0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3