 
 はじめに
Arduinoの測候所については複数回記述されています。 私の弁護では、 ハッカソンがあったと言います-私たちのチーム(私とhaArraiser ViArtで構成されています )はArduinoでの作業を試みました。 さらに、データの視覚化は気象観測所にボルトで固定されています。 Webサーバー、ファイル、またはその他のトリックの形式の中間リンクなしで、com-portでデータを受信できるデータベースを知りたい場合は、catにようこそ。
デバイスを操作する
InterSystemsCachéは、多数の物理および論理デバイスタイプと直接連携できます。 ここにあります:
- ディスク
- 磁気テープ
- ファイル
- ターミナル
- TCPポート
- COMポート
- その他
作業は5段階で行われます。
- まず、 OPENコマンドは、現在のプロセスがデバイスにアクセスしているという事実を登録します
- 次に、デバイスで作業する必要がある場合、 USEコマンドを使用してデバイスを最新の状態にします。
- デバイスを操作します。 READコマンドでデバイスからデータを受信し、 WRITEコマンドでデバイスにデータを送信
- 別のI / Oデバイスへの切り替え(再びUSE)
- CLOSEコマンドでデバイスを閉じる
実際にはどのように見えますか?
Cachéからのライトの点滅
そこで、COMポートからデータを読み取り、指定されたミリ秒数の間LEDをオンにする回路をArduinoで収集しましょう。
  スキーム  
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    
      
  Cコード 
        
        
        
      
    
      /* Led.ino * *     COM  *     ledPin * */ //   () #define ledpin 8 // ""   String inString = ""; void setup() { Serial.begin(9600); pinMode(ledpin, OUTPUT); digitalWrite(ledpin, LOW); } void loop() { //    COM  while (Serial.available() > 0) { int inChar = Serial.read(); if (isDigit(inChar)) { //  1 , //     inString += (char)inChar; } //     if (inChar == '\n') { //   digitalWrite(ledpin, HIGH); int time = inString.toInt(); delay(time); digitalWrite(ledpin, LOW); //    inString = ""; } } }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     Cachéでは、comポートに接続して文字列1000 \ nを送信するメソッドを作成します。
 ///     1000\n ClassMethod SendSerial() { set port = "COM1" open port:(:::" 0801n0":/BAUD=9600) //   set old = $IO //    - use port //   com  write $Char(10) //     hang 1 write 1000 _ $Char(10) //   1000\n use old //     close port //   }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      行「0801n0」は、Comポートに接続するためのパラメーターのリストです。詳細については、 ドキュメントを参照してください 。 A / BAUD = 9600はボーレートです。
その結果、ターミナルでこのメソッドを呼び出すと:
 do ##class(Arduino.Habr).SendSerial()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      その後、何も出力されませんが、LEDが1秒間点灯します。
Cachéでのデータの取得
次に、キーボード(キーパッド)をCachéに接続し、データを転送します。 これは、たとえば、 許可の委任とZAUTHENTICATE.macのルーチンを使用した追加のユーザー認証として使用できます。
  スキーム  
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
    
      
  Cコード 
       /* Keypadtest.ino * *    Keypad *  Keypad   Arduino   * rowPins[] and colPins[]. * */ //  : // https://github.com/Chris--A/Keypad #include <Keypad.h> const byte ROWS = 4; //   const byte COLS = 4; //   //      char keys[ROWS][COLS] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; //   keypad 1-8 (-)  Arduino  11-4. 1->11, 2->10, ... , 8->4 //  keypad ROW0, ROW1, ROW2  ROW3    Arduino byte rowPins[ROWS] = { 7, 6, 5, 4 }; //  keypad COL0, COL1 and COL2    Arduino byte colPins[COLS] = { 8, 9, 10, 11 }; //  Keypad Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS ); #define ledpin 13 void setup() { Serial.begin(9600); } void loop() { char key = kpd.getKey(); //    if(key) { switch (key) { case '#': Serial.println(); default: Serial.print(key); } } }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
     Cachéでは、comポートに接続してデータ文字列を受け取るメソッドを記述します。
 ///     (  ) ClassMethod ReceiveOneLine() As %String { port = "COM1" set str="" try { open port:(:::" 0801n0":/BAUD=9600) set old = $io //    - use port read str // ,       use old close port } catch ex { close port } return str }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      ターミナルで、次を実行します。
 write ##class(Arduino.Habr).ReceiveOneLine()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      そして、キーパッドで「#」を押すまで待機モードに入り(行の終わりが送信される場所をクリックする)、その後、入力された行が端末に表示されます。
それで、これらはデバイスとのやり取りの基本でした。次に、気象ステーションに移りましょう。
気象観測所
ウェザーステーションを組み立てるために、 フォトレジスタとDHT11センサー(温度と湿度)が使用されました。 配線図:
 
        Cコード 
       /* Meteo.ino * * ,  ,    *    COM port *  : H=1.0;T=1.0;LL=1; */ //  () int lightPin = 0; //  DHT-11 () int DHpin = 8; // ,   DHT-11 byte dat[5]; //   void setup() { Serial.begin(9600); pinMode(DHpin,OUTPUT); } /* *   setup() *    */ void loop() { delay(1000); //   1    int lightLevel = analogRead(lightPin); //   temp_hum(); //       dat //    Serial.print("H="); Serial.print(dat[0], DEC); Serial.print('.'); Serial.print(dat[1],DEC); Serial.print(";T="); Serial.print(dat[2], DEC); Serial.print('.'); Serial.print(dat[3],DEC); Serial.print(";LL="); Serial.print(lightLevel); Serial.println(";"); } //    DHT-11  dat void temp_hum() { digitalWrite(DHpin,LOW); delay(30); digitalWrite(DHpin,HIGH); delayMicroseconds(40); pinMode(DHpin,INPUT); while(digitalRead(DHpin) == HIGH); delayMicroseconds(80); if(digitalRead(DHpin) == LOW); delayMicroseconds(80); for(int i=0;i<4;i++) { dat[i] = read_data(); } pinMode(DHpin,OUTPUT); digitalWrite(DHpin,HIGH); } //     DHT-11 byte read_data() { byte data; for(int i=0; i<8; i++) { if(digitalRead(DHpin) == LOW) { while(digitalRead(DHpin) == LOW); delayMicroseconds(30); if(digitalRead(DHpin) == HIGH) { data |= (1<<(7-i)); } while(digitalRead(DHpin) == HIGH); } } return data; }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      コードをArduinoにダウンロードした後、次の形式でデータをCOMポートに送信し始めます。
H = 34.0; T = 24.0; LL = 605;
どこで:
- H-湿度(0〜100パーセント)
- T-摂氏温度
- LL-イルミネーション(0〜1023)
何らかの方法でCachéに保存する必要があります。 これを行うには、保存されたArduino.Infoクラスを記述します。
  Arduino.Info 
       Class Arduino.Info Extends %Persistent { Parameter SerialPort As %String = "com1"; Property DateTime As %DateTime; Property Temperature As %Double; Property Humidity As %Double(MAXVAL = 100, MINVAL = 0); Property Brightness As %Double(MAXVAL = 100, MINVAL = 0); Property Volume As %Double(MAXVAL = 100, MINVAL = 0); ClassMethod AddNew(Temperature = 0, Humidity = 0, Brightness = 0, Volume = 0) { set obj = ..%New() set obj.DateTime=$ZDT($H,3,1) set obj.Temperature=Temperature set obj.Humidity=Humidity set obj.Brightness=Brightness/1023*100 set obj.Volume=Volume write $SYSTEM.Status.DisplayError(obj.%Save()) }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      そして、そこにArduino形式のデータを受け取り、オブジェクトをArduino.Infoクラスに変換するメソッドを追加します。
 ///      H=34.0;T=24.0;LL=605;\n ///       Arduino.Info ClassMethod ReceiveSerial(port = {..#SerialPort}) { try { open port:(:::" 0801n0":/BAUD=9600) set old = $IO use port for { read x //   set Humidity = $Piece($Piece(x,";",1),"=",2) set Temperature = $Piece($Piece(x,";",2),"=",2) set Brightness = $Piece($Piece(x,";",3),"=",2) if (x '= "") { do ..AddNew(Temperature,Humidity,Brightness) //   } } } catch anyError { close port } }
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      その後、Arduinoを起動し、ターミナルでReceiveSerialメソッドを実行する必要があります。
 write ##class(Arduino.Info).ReceiveSerial()
      
      
        
        
        
      
    
        
        
        
      
      
        
        
        
      
    
      
      無限ループのこのメソッドは、Arduinoからのデータを収集して保存します。
データの可視化
気象観測所が収集された後、私たちのチームはそれを路上で打ち上げ(すでに夜だった)、朝までデータを収集するために出発しました。
 
      朝までには、データが蓄積され(約36,000レコード)、 BI DeepSeeでそれらを視覚化したのです。
明るさのグラフ。 夜明けは5:50頃にはっきりと見える:
温度と湿度のグラフ。
温度センサーを直射日光に当てる価値はありませんでしたが、それでも温度と湿度の関係は明らかに追跡されています。
デモ
こちらから入手できます 。
結論
InterSystemsCachéを使用すると、多数のデバイスとの対話を直接整理できます。 データ収集および視覚化ソリューションの迅速な開発が可能です。
参照資料
» ドキュメント
» コード付きリポジトリ