
みなさんこんにちは。
約1年前、私はNinjaBlocksサーバーを使用してインターネット経由でArduinoを制御する短いレビュー記事を書きました。 これは非常に優れた便利なソリューションであり、ある時点で接続の問題が発生するまで問題なく機能しました。 フォーラムを通じて問題を解決するように開発者を説得する試みは無駄でした-彼らは単に私の要求を無視し、答える気さえしませんでした。
その瞬間から、代替品を探すためにインターネット全体がスキャンされ、多くの非常に興味深いプロジェクトが見つかりましたが、実装するには複雑すぎてプログラミングの分野でかなりの知識が必要であるか、単に不便でした。 そしてここで、すべてを自分でやるのではないかと考えました。
もちろん、リアルタイムですべてのプロセスを制御できる最新のデータ転送プロトコルwebsocketsまたはmqttを使用したかったのですが、arduinoのクライアントに問題がない場合-優れたライブラリの存在が良かった場合、サーバー側に問題がありました-サーバーが必要でした通常のホスティング事業者にはなかった必要なプロトコルのサポート。 また、LEDを点灯するために自分のサーバーを起動したくありませんでした。 そして、選択肢は古き良きhttpにかかっていました。
1.すべての仕組み。
私たちが持っています:
-ドメイン名に関連付けられているホスティングにあるPHPサーバー
-arduinoとしてのクライアント
-コントロールパネル
Arduinoはサーバーに接続し、温度センサーの値を含むGETリクエストを送信します。
サーバーは要求を受け入れ、温度値をテキストファイルに書き込みます。 同時に、インストールされたarduinoの出力の値をテキストファイルから読み取り、コントローラーの要求に応じて送信します。
Arduinoはサーバーから応答を受信し、それに応じて、出力のステータスを設定します
コントロールパネルは、Ajaxを使用して、テキストファイルから温度値を読み取り、センサーの読み取り値を更新します。 また、テキストファイルの出力ステータスを読み取り、ページ上で更新します。 同じAjaxを使用して、コントローラーの出力値がフォームを介してテキストファイルに書き込まれ、サーバーはそこから値を取得してコントローラーに送信します。
2. Arduinoのクライアント
スケッチは非常に単純で、センサーを収集してサーバーに送信し、応答を受信し、出力を有効または無効にするだけです。
スケッチArduino
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
ダラス温度センサー(&oneWire);
バイトmac [] = {0x54、0x34、0x41、0x30、0x30、0x31};
EthernetClientクライアント。
char server [] = "*************"; //サーバー名
int buff = 0;
const int led = 5;
ボイド設定()
{
Ethernet.begin(mac);
sensor.begin();
pinMode(led、OUTPUT);
digitalWrite(led、LOW);
}
ボイドループ()
{
sensor.requestTemperatures();
if(client.connect(server、80))
{
client.print( "GET /add_data.php?");
client.print( "temperature =");
client.print(sensors.getTempCByIndex(0));
client.print( "&");
client.print( "&");
client.print( "temperature1 =");
client.print(sensors.getTempCByIndex(1));
client.println( "HTTP / 1.1");
client.print( "Host:");
client.println(サーバー);
client.println( "接続:閉じる");
client.println();
client.println();
遅延(200);
while(client.available())
{
char c = client.read();
if(c == '1')
{
バフ= 1;
}
if(c == '0')
{
バフ= 0;
}
}
client.stop();
client.flush();
遅延(100);
}
他に
{
client.stop();
遅延(1000);
client.connect(サーバー、80);
}
if(buff == 1)
{
digitalWrite(led、HIGH);
}
他に
{
digitalWrite(led、LOW);
}
遅延(500);
}
#include <Ethernet.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
ダラス温度センサー(&oneWire);
バイトmac [] = {0x54、0x34、0x41、0x30、0x30、0x31};
EthernetClientクライアント。
char server [] = "*************"; //サーバー名
int buff = 0;
const int led = 5;
ボイド設定()
{
Ethernet.begin(mac);
sensor.begin();
pinMode(led、OUTPUT);
digitalWrite(led、LOW);
}
ボイドループ()
{
sensor.requestTemperatures();
if(client.connect(server、80))
{
client.print( "GET /add_data.php?");
client.print( "temperature =");
client.print(sensors.getTempCByIndex(0));
client.print( "&");
client.print( "&");
client.print( "temperature1 =");
client.print(sensors.getTempCByIndex(1));
client.println( "HTTP / 1.1");
client.print( "Host:");
client.println(サーバー);
client.println( "接続:閉じる");
client.println();
client.println();
遅延(200);
while(client.available())
{
char c = client.read();
if(c == '1')
{
バフ= 1;
}
if(c == '0')
{
バフ= 0;
}
}
client.stop();
client.flush();
遅延(100);
}
他に
{
client.stop();
遅延(1000);
client.connect(サーバー、80);
}
if(buff == 1)
{
digitalWrite(led、HIGH);
}
他に
{
digitalWrite(led、LOW);
}
遅延(500);
}
3.サーバーとコントロールパネル
サーバーはいくつかのファイルのみで構成されています。

index.php-コントロールパネル
add_data.php-コントローラーからのファイル処理要求およびarduinoへの応答の送信
style.css-パネルの外観を定義します
転送フォルダー -テキストファイルからの値の読み取りと書き込みが行われるファイルが含まれます。
led.php-コントロールパネルのフォームを介して送信されたout-1.txtファイルに出力ステータスを書き込みます
ledstate.php -out-1.txtテキストファイルから状態を読み取り、「ON」または「OFF」としてパネルに表示します
temp-1.phpおよびtemp-2.php -in-1.txtおよびin-2.txtファイルから温度値を読み取り、コントロールパネルに送信します。
txtフォルダーは、情報を保存するための一種のデータベースです。
サーバーは実際には非常にシンプルで、たとえば私のような最小限の知識を持つ人なら誰でもインストールできます。 このプロジェクトに取り組む前は、arduinoのみを使用した経験があったため、php、ajax、html、およびcssは文字通りゼロから研究する必要がありました。
インストールはとても簡単です。 ファイルをサーバーにコピーして、スケッチをコントローラーにアップロードするだけで、スケッチ内のドメイン名を編集し、センサーとLEDを接続すれば、すべてが機能するはずです。
熟練したプログラマーが私を蹴り、コードをより簡潔かつ正確に書くことができる場所で鼻を突くでしょう。 私はこれだけを歓迎します!!!
いくつかのことがより簡単かつ迅速に行えることをご覧になった場合は、お知らせください。
最後に何がありますか?
長所:
-すべてがシンプルで明確です
-ニーズとタスクに合わせてカスタマイズ可能
-良好な安定性
-サーバーは無料のホスティングにデプロイできます
短所:
-サーバーへの多数のリクエスト(一部のホスティング事業者はこれを好まない場合があります。この場合、スケッチ内のリクエスト間の一時停止を増やす必要があります)
-クライアントからのトラフィックを大量に消費します(1秒間に1回のリクエストで、1日あたり約300 MBが出ます)
-出力の切り替えにわずかな遅延があります(場合によっては重要になることがあります)
今後の計画:
-コントローラのボタンを追加して、サーバーの状態を変更してリレーをオンおよびオフにします
-承認を追加
-リクエストに識別キーを追加する
-1つのコントロールパネルで複数のボードの作業を同時に整理する
-コントローラから確認を追加して、出力を有効にします
-websocketまたはmqttプロトコルを使用したいのですが、socket.ioを使用してwebsocketを使用する傾向があります
おそらく、興味深い場合は、インターネット経由でwifiモジュールesp8266を管理することに関する記事を書きます。 私はすでにそれをうまくテストし、すべてが機能することを確認しましたが、作業には独自のニュアンスがあります。
そして、書きたい人が十分にいる場合は、センサー付きの新しいユニットを追加し、コントロールパネルへの追加出力を制御することを検討する詳細な記事があります。
比較的簡単で明確なインストールと許容できるレベルのセキュリティを確保するために、コントロールパネルで承認を実装する最善の方法についてアドバイスを求めます。
誰でも自分のサーバーページにアクセスして、 arduino.zhodinovel.comのアクションを確認できます。
!!! コントローラーの出力を変更するには、マーカーを目的の値に合わせて「送信」を押します!!!
ビデオを見る
ファイルをダウンロードする
1. サーバー
2. arduinoのスケッチ
ご清聴ありがとうございました!
UPD。 フォトレジスタの形でパネルにフィードバックを追加しました。 ライトがオフの場合、測定値は約130、オンの場合-900です。