最近、私は「スマートホーム」を作成するアイデアに興味を持ちました。 これまでのところ、必要なコンポーネントはarduinoとAndroidフォンのみであるため、コントロールパネルを作成し、システムの残りの部分と接続することから始めることにしました。
システムの私のビジョンは次のようになります。

静的IPを購入してホームサーバーとWebサーバーを組み合わせる価値はあると思いますが、初めてそれを実現します。 簡単なものから始めましょう-LEDとLCDディスプレイをリモートで制御する方法を学びます。
Webサーバー
Webサーバー上で、2つのテーブル(ledとtext)を持つデータベースを作成します。 ledsテーブルには、idとstatusの2つのフィールドが含まれます。 これには、LEDの現在のステータスを持つ1つのエントリが含まれます。 textsテーブルには、idとtextの2つのフィールドが含まれます。 また、現在LCDに表示されているテキストを含む1つのエントリが含まれています。
次に、電話から呼び出してデータベースに情報を送信するスクリプトをいくつか作成します。 phpで記述します。
スクリプトled.php(LEDコントロール):
<?php $hostname = "localhost"; $username = "_"; $password = ""; $database = "_"; $connect_DB = mysql_connect($hostname, $username, $password); // if (!$connect_DB) { // exit; // } mysql_select_db($database); // changeLED(); // , mysql_close($connect_DB); // function changeLED() // { $query = "SELECT `status` FROM leds WHERE `id` = '1'"; // leds (id = 1 - ) $result = mysql_query($query); while ($_row = mysql_fetch_array($result,MYSQL_NUM)) // { // $st = (int)$_row[0]; if ($st == 0) $st = 1; else $st = 0; } $query = "UPDATE leds SET `status` = '$st' WHERE `id` = '1'"; // $result = mysql_query($query); } ?>
スクリプトmsg.php(LCDコントロール):
<?php $hostname = "localhost"; $username = "_"; $password = ""; $database = "_"; $connect_DB = mysql_connect($hostname, $username, $password); // if (!$connect_DB) { // exit; // } mysql_select_db($database); // changeText(); // , , LCD- mysql_close($connect_DB); // function changeText() { $st= $_GET["msg"]; //GET- msg , $query = "UPDATE texts SET `text` = '$st' WHERE `id` = '1'"; // texts id = 1 ( LCD-) $result = mysql_query($query); } ?>
これらのスクリプトがどのように機能するかはコメントから明らかだと思います。 Webサーバー上にあるのはそれだけです。 それでは、ホームサーバー(より簡単には、arduinoが接続されているコンピューター)に移りましょう。
ホームサーバー
プログラムは常に動作し(デーモンと呼ぶこともできます)、クエリをデータベースに送信し、情報が変更されると、対応するコマンドをarduinoからCOMポートに送信します。 プログラムを処理言語で作成します。
import processing.serial.*; // COM- import de.bezier.data.sql.*; // MySQL Serial port; MySQL dbconnection; int prevLEDState = 0; // String prevS = ""; // , LCD- void setup() { port = new Serial(this, "COM4", 9600); // COM- 4 ( ), - 9600 port.bufferUntil('\n'); String user = "_"; String pass = ""; String database = "_"; dbconnection = new MySQL( this, "_.ru", database, user, pass ); // dbconnection.connect(); } void draw() { // dbconnection.query( "SELECT * FROM leds WHERE id = '1'" ); // leds while (dbconnection.next()) // { int n = dbconnection.getInt("status"); // status if (n != prevLEDState) // "" , COM- { prevLEDState = n; port.write('1'); // : 1 - , 2 - LCD- port.write(n); } } // LCD- dbconnection.query( "SELECT * FROM texts WHERE id = '1'" ); // texts while (dbconnection.next())// { String s = dbconnection.getString("text"); // text if (s != prevS) { prevS = s; port.write('2'); port.write(s); } } delay(50); // 50 , }
このコードも説明しません。すべてが明確です。
もう一つの重要なポイント。 コンピューターからのプログラムがリモートサーバーにあるデータベースにアクセスするには、これを有効にする必要があります。 許可リストにIPを入力してください:

次は電話アプリです。
電話アプリ
私はアンドロイド携帯を持っています、私たちはそれのために書きます。 あまり詳しく説明しません(プログラミング環境をセットアップすることと、この記事の最初のアプリケーションを作成すること、 リンクの両方が非常に良いことです)。
アプリケーションの外観はかなり控えめに見えますが、この場合は主なものではありません。

Android用のプログラムコードの断片のみを提供します。 LEDを制御するスクリプトを呼び出す関数:
public void changeLED() { try { URL url1 = new URL("http://_.ru/led.php"); HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection(); try { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); } finally { urlConnection.disconnect(); } } catch (Exception e) { } }
LCDに表示されるテキストを送信する機能:
public void submitMsg() { final EditText tt = (EditText) findViewById(R.id.editText1); try { URL url1 = new URL("http://_.ru/msg.php?msg="+tt.getText()); HttpURLConnection urlConnection = (HttpURLConnection) url1.openConnection(); try { InputStream in = new BufferedInputStream(urlConnection.getInputStream()); } finally { urlConnection.disconnect(); } } catch (Exception e) { } }
さて、イベントハンドラーがボタンにバインドされる主な機能は次のとおりです。
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button btn1 = (Button) findViewById(R.id.button1); btn1.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) // { changeLED(); } }); final Button btn2 = (Button) findViewById(R.id.button2); btn2.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) // { submitMsg(); } }); }
もう1つの重要なポイントは、インターネットにアクセスするための許可をアプリケーションに追加することです。 これを行うには、AndroidManifest.xmlファイルに行を追加します(Androidアプリケーションのディレクトリにあります)。
<uses-permission android:name="android.permission.INTERNET"/>
アプリケーションをAPKファイルにエクスポートし、電話にインストールします。 スマートホームコントロールパネルの準備ができました!
Arduino
最後に、最後になりましたが、重要なことは、arduinoとそのファームウェアの接続です。 Arduino UnoへのLCDスクリーンとLEDの接続図は次のとおりです。

抵抗は220オームにします。 LCDスクリーンの接続について詳しくは、こちらをご覧ください- リンク
そして、これが実際にどのように見えるかです:

本当に美しいですか?
arduinoのタスクは、デーモンプログラムがarduinoが接続されているCOMポートに送信する内容をリッスンすることです(実際、接続はUSBケーブルを介して行われますが、コンピューターはシリアルポートとして認識します)。 コンピューターからデータを受信した後、コントローラーは送信された情報の最初の文字(つまり、現在制御されるもの-LCDディスプレイまたはLED)によってコマンドコードを認識します。 さらに、コードとそれに続く情報に応じて、LEDがオン/オフされるか、送信されたメッセージが表示されます。 したがって、実際のコードは次のとおりです。
#include <LiquidCrystal.h> // LCD- boolean isExecuting = false; //, , - //C , . "" loop COM- . // . ( ) // (1 2 ). ( ), // . LiquidCrystal lcd(4,5,10,11,12,13); // int ledPin = 8; // , int prevLEDStatus = 0; // (/) int newLEDStatus = 0; // int cmd = 0; // void setup() { Serial.begin(9600); // COM- (9600 - ) pinMode(ledPin,OUTPUT); // 8- lcd.begin(20,4); // LCD- (4 20 ) } void loop() { if (Serial.available() > 0) // COM- - { if (isExecuting == false) // { cmd = Serial.read() - '0'; // isExecuting = true; // , } if (cmd == 1) // { newLEDStatus = (int) Serial.read(); // if (newLEDStatus != prevLEDStatus) // , { digitalWrite(ledPin,newLEDStatus); prevLEDStatus = newLEDStatus; } } else // { if (isExecuting == false) // { lcd.clear(); // } else { lcd.print((char)Serial.read()); // } } } else // COM- { delay(50); // 50 if (Serial.available() <= 0) // - isExecuting = false; //, } }
コメントですべてを詳細に説明しているので、説明する必要はないと思います。 注目に値する唯一のことは、表示のために送信される行に関するいくつかの制限です。 スペースを含めるべきではありません(この制限は私のアルゴリズムの不完全性によって課せられます)、キリル文字を含めるべきではありません(すべてのディスプレイでサポートされていないため、サポートされている場合、独自のエンコーディングで文字コードを送信する必要があるため、文字を変換する必要はありません)欲望)。
おわりに
まあ、それだけです。 それは非常に簡単であることが判明しました。
仕組みのビデオ:
最後に、使用したリソースへのリンクを提供します。
非常に良いArduinoレッスン- リンク
処理環境へのリンク - リンク
もう一度、最初のAndroidアプリケーションの作成に関する記事へのリンク - リンク
皆さんに幸運を!