田んぼセンサ回収

9/30 田んぼセンサ回収

 

田んぼから水無くなり、収穫が近いのでセンサを回収しました。

サーバーシステム/スマフォアプリ含め、課題発見&修正を繰り返しましたが、結果意義のある実験でした。

やっぱりスマフォがUXにあってると新ためて思いましたが、

PCブラウザビューワーも進めます。

次は、WiFiバージョンですね。

IMG_20150929_120753

IMG_20150929_121815

IMG_20150929_121821

ESP-WROOM-02 HTTP/POSTする

IMG_20150922_120127

 

昨日作ったボードで一旦 POSTしてみます。

電源はお馴染みのftdi(3.3v)ケーブルでいれます。

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <WiFiClient.h>
#include <WiFiServer.h>
#include <WiFiUdp.h>


void postData(String ip_addr, int port,String sid, float value );

//=== WiFi ===
const char* ssid = "wifi ssid";
const char* password = "wifi password";

//=== SENSOR ===
const String API_KEY = "uuid";
const String SID = "this sensor id";
const char* server= "server ip addr";
const int port = 8000;

void setup() {

  pinMode(16, OUTPUT);

  Serial.begin(115200);
  delay(100);
  
  Serial.println("");
  Serial.println("Start");
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);
  delay(3000);
}

int cnt=0;

void loop() {

  if (WiFi.status() != WL_CONNECTED) {
  
    delay(3000);
    Serial.print(".");
 
  }else{
    
    Serial.println("");
    Serial.println("WiFi connected");
    
    postData(server, port, SID, cnt);
    cnt++;
    delay(60000);
  }
}

void postData(String ip_addr, int port,String sid, float value ) {

  WiFiClient client;
  
  if (client.connect(ip_addr.c_str(), port) ) {
  
    Serial.println("connected.");
    
    String param = "sid=" + sid + "&value=" + value + "&api_key=" + API_KEY;

    String data = "POST /api/data/add/ HTTP/1.1\r\n";
    data += "Host: " + ip_addr + "\r\n";
    data += "User-Agent: ESP-WROOM-002\r\n";
    data += "Connection: close\r\n";
    data += "Content-Type: application/x-www-form-urlencoded;\r\n";
    data += "Content-Length: " + String(param.length()) + "\r\n";
    data += "\r\n";
    data += param;

    Serial.println(data);

    client.print(data.c_str());
  
  } else {
    Serial.println("Connection failed");
    client.stop();
  }
}

 

ESP-WROOM-02

IMG_20150921_214507

ESP-WROOM-02+マイクロテクニカのブレッドボード基盤です。

まず、接続部分。

FTDIの3.3Vケーブルからの、5Vをレギュレータで、3.3Vに変換してボードに入れてます。

あと、RESETはスイッチにしました。

GPIO 0,2,15があって、このピンの組み合わせでUART書き込みモードか、Flash動作モードに

なるかを変更します。

UART Download Mode

GPIO0  L

GPIO2 H

GPIO15 L

 

Flash Boot Mode

GPIO0  H

GPIO2 H

GPIO15 L

 

http://akizukidenshi.com/download/ds/espressifsystems/0C-ESP8266__WROOM_WiFi_Module_Datasheet__EN_v0.3.pdf

流れとしてはプログラムを変更したらGPIO0をLにして書き込んから、

GPIO0をHをにしてフラッシュブートします。

 

で、ソフトもArduino資産が使えるのがいいです。

環境はArduino 1.6.5でやりました。

BoardManagerから「esp8266」を検索窓にいれて、該当モジュールをinstallします。

スクリーンショット 2015-09-21 午後10.04.46

メニューからボード選択ができるようになり、設定そのままでボードにロードします。

このときはUART書き込みモードにします。

で、書き込み終了したら、Flash Bootモードにして、起動します。

 

ブレッドボードでは、書き込み時にピンを差し替えてH/L切り替えしていたんですが

書き込みSWあったほうがいいなって思って、勢いで作りました。

2mmピッチの部分ってなんとかなんないんかな。

IMG_20150922_002302

 

 

【Django】Send Mail

setting.py
EMAIL_HOST = ‘domain name’
EMAIL_HOST_PASSWORD = ‘xxxxxxx’
EMAIL_HOST_USER = ‘xxxxxxx’
EMAIL_PORT = 25

 

xxx.py

from django.core.mail import send_mail

send_mail(‘Subject here’, ‘Here is the message.’,’from@mknod.jp’, [‘to@mknod.jp’], fail_silently=False)

 

【Arduino】I2C OLED

 

 

IMG_20150912_170143IMG_20150912_165742

http://www.seeedstudio.com/wiki/Grove_-_OLED_Display_128%2a64

 

 

a.001

pro miniのI2CはA4:SDA A5:SDLです。

Pinは真ん中のホールから出してI2C機器に接続します。

I2Cの他VCC/GND線をつなぎます。

 

#include <Wire.h>
#include <SeeedOLED.h>


void setup()
{
  Wire.begin();
  SeeedOled.init();  //initialze SEEED OLED display
  DDRB|=0x21;        
  PORTB |= 0x21;

  SeeedOled.clearDisplay();          //clear the screen and set start position to top left corner
  SeeedOled.setNormalDisplay();      //Set display to normal mode (i.e non-inverse mode)
  SeeedOled.setPageMode();           //Set addressing mode to Page Mode
  SeeedOled.setTextXY(0,0);          //Set the cursor to Xth Page, Yth Column  
  SeeedOled.putString("Hello World!"); //Print the String

}

void loop()
{
  
}

 

【Arduino】WDT

#include <Watchdog.h>
#include <Sleep.h>

SoftwareSerial ss(2, 3); // RX, TX
int a=0;


WatchdogClass WD = WatchdogClass();

void setup() {

  pinMode(8,INPUT);
  pinMode(9,OUTPUT);
  
  WD.systemResetEnable(false);          
  WD.enable(WatchdogClass::TimeOut8s); 

  Serial.begin(38400);
  Serial.println("Hello, world?");
}
int i=0;
void loop() {

  Serial.write("A");

  digitalWrite(9,HIGH);        // LED点灯開始
  delay(3000);                  // 3秒間
  digitalWrite(9,LOW);         // LED点灯停止

  WatchdogClass::timerReset();  // Watchdogタイマーリセット
  SleepClass::powerDown();      // パワーダウン

}

 

【Arduino】GPS

IMG_20150912_152353

 

GPS: GMS-G9  ランニングエレクトロニクス

1:GND

9:TXD

12:VCC

 

Arduino Pro mini

9: RX(software serial)

#include <avr/sleep.h>
#include <avr/interrupt.h> 
#include <SoftwareSerial.h>
#include <TinyGPS.h>

#define __DEBUG__

TinyGPS gps;
SoftwareSerial ss(9, 8);

void setup()
{
  Serial.begin(38400);
  ss.begin(9600);  // GMS-G9 
  
  Serial.print("Hello!!!");
}

void loop()
{
  bool newData = false;
  unsigned long chars;
  unsigned short sentences, failed;

  // For one second we parse GPS data and report some key values
  for (unsigned long start = millis(); millis() - start < 1000;)
  {
    while (ss.available())
    {
      char c = ss.read();
//      Serial.write(c); // uncomment this line if you want to see the GPS data flowing
      if (gps.encode(c)) // Did a new valid sentence come in?
        newData = true;
    }
  }

  if (newData)
  {
    float flat, flon;
    unsigned long age;
    gps.f_get_position(&flat, &flon, &age);
    
    Serial.print("LAT=");
    Serial.print(flat == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flat, 6);
    Serial.print(" LON=");
    Serial.print(flon == TinyGPS::GPS_INVALID_F_ANGLE ? 0.0 : flon, 6);
    Serial.print(" SAT=");
    Serial.print(gps.satellites() == TinyGPS::GPS_INVALID_SATELLITES ? 0 : gps.satellites());
    Serial.print(" PREC=");
    Serial.print(gps.hdop() == TinyGPS::GPS_INVALID_HDOP ? 0 : gps.hdop());
  }
  
#ifdef __DEBUG__  
  gps.stats(&chars, &sentences, &failed);
  Serial.print(" CHARS=");
  Serial.print(chars);
  Serial.print(" SENTENCES=");
  Serial.print(sentences);
  Serial.print(" CSUM ERR=");
  Serial.println(failed);
#endif  
  if (chars == 0)
    Serial.println("** No characters received from GPS: check wiring **");
}