sea side she side

写真と山、資格が好きなアラフォーエンジニアのブログ

Arduino + fon + OpenWRT + ser2net + NewSoftSerial + telnet

      2016/04/24

Arduino + FON2200 + ser2net Wi-Fi接続

原因は別だったので関係はなかったのですが、シリアルのレベルシフトをしていないのは気持ち悪いので抵抗とトランジスタを使ってレベルシフトを実施しました。参考にしたのはねがてぃぶぶろぐさん。偉大なる先人に今日も感謝。

Arduino + fon + OpenWRT + ser2net + NewSoftSerial + telnet Wi-Fi接続

前回までは温度センサーだけを試験的につけていたのですが、今回から本番のセンサー類を接続しました。

Arduino + fon + OpenWRT + ser2net + NewSoftSerial + telnet Wi-Fi接続

動くこと重視だったのでシリアル部分のスケッチが汚いのはお許しください。またSCP1000a.hはSCP1000.hに一部手を入れてあります。

#include <SCP1000a.h>
#include <SPI.h>
#include <NewSoftSerial.h>

/*----------------------------------------------
 * クラス: HumiditySensor
 * 概  要: 湿度計測
 * ---------------------------------------------*/
class HumiditySensor {
public:
  HumiditySensor();
  float Get();
  void CulculateValue(unsigned int);
private:
  volatile float value_;
};

HumiditySensor::HumiditySensor() {
  value_ = 0;
}

float HumiditySensor::Get(void) {
  return value_;
}

void HumiditySensor::CulculateValue(unsigned int p) {
  value_ = 0;
  for (unsigned int i = 0; i < 10; ++i) {
    value_ += analogRead(p);
  }

  value_ /= 10.0;
  value_ = value_ * 100 / 550;
}


/*----------------------------------------------
 initialize
 ----------------------------------------------*/
// インスタンス生成
SCP1000a scp1000a;
HumiditySensor CHSUGS;
NewSoftSerial mySerial(2, 3);

void setup() {
  mySerial.begin(9600);
  scp1000a.init();
}


/*----------------------------------------------
 main
 ----------------------------------------------*/
void loop() {
  if(mySerial.available()) {
    char val = mySerial.read();
    
    if(val == 'C') {
      scp1000a.readSensor();
      CHSUGS.CulculateValue(1);
      
      mySerial.println(scp1000a.TempC);
      mySerial.println(scp1000a.BaroP);
      mySerial.println(CHSUGS.Get());
      mySerial.println("END");
    }
  }
}

サーバー側はPerlでfon-Arduino経由でセンサーの値を取得させます。
こっちは特にやっつけなためエラー処理もなくかなり汚いです…。

またNet::PachubeとNet::Telnetライブラリを使用していますのでcpanなりで拾ってきてください。

#!/usr/bin/perl -w

use strict;
use Net::Telnet;
use Net::Pachube;


my $telnet = new Net::Telnet(Timeout => 10, Port => 3000);

$telnet->open("自宅のIPアドレス");

my $result;
$telnet->print("C");
($result) = $telnet->waitfor('/END/');


my $pachube = Net::Pachube->new();
$pachube->key("Pachube API key");
my $feed_id = "Feed ID";
my $feed = $pachube->feed($feed_id);

print $feed->title, " ", $feed->status, "\n";
foreach my $i (0..$feed->number_of_streams-1) {
  print "Stream ", $i, " value: ", $feed->data_value($i), "\n";
  foreach my $tag ($feed->data_tags($i)) {
    print " Tag: ", $tag, "\n";
  }
}

my @list = split(/\n/, $result);

# update one stream
$feed->update(data => [$list[0],$list[1],$list[2]]);

これをcronで適当な時間で動かします。私の場合1分毎や5分毎で設定しました。

とりあえず取れている様子。

  

 - Make , , , , , , , , , , , , , , , , ,