« 2015年7月 | トップページ | 2015年9月 »

2015年8月

2015年8月19日 (水)

ESP8266 に SD カードと DS3231 リアルタイムクロックをつなぐ

ESP8266 に SD カードと DS3231 リアルタイムクロックをつなぐ

ESP8266 にSDカードインターフェースをつなぎ動作OKとなる。
ESP8266 にDS3231 リアルタイムクロックをつなぎ動作OKとなる。

SDカードとDS3231を両方接続し両方をイニシャライズすると片方が動作しない。

SD.begin(sdCardCS)
Wire.begin(2, 14);

の順にイニシャライズするとSDカードが使用できない。

Wire.begin(2, 14);
SD.begin(sdCardCS)

の順にイニシャライズするとDS3231が使用できない。

先日書いたようにIO14がSDカードのクロック(HSPIのCLK)とDS3231のクロック(I2CのSCL)で共通に使用している。このへんが問題の様なきがします。
動作したという情報が有ったら教えてください。

2015年8月17日 (月)

ESP8266 にリアルタイムクロック DS3231 を接続する

ESP8266 にリアルタイムクロック DS3231 を接続する

Arduino NanoでリアルタイムクロッくとしてDS1307を使用していたが、これは5Vで動作している。ESP8266は3.3Vのためデータをレベル変換しなければならない。しかし、I2Cインターフェースでは双方向の信号をレベル変換しなければならないのでちょっと難しそう。
そこで3.3Vで動作するDS3231を使用したモジュールをアマゾンで購入したのでESP8266に接続してみた。

ESP8266は「ESP8266EX搭載 WiFi-UARTモジュール(技適取得済み)ESP-WROOM-02」を使用している

データ線は以下の2本を接続、GNDとVCCも接続する。

ESP8266PinESP8266PinNameDS3231モジュール
3 IO14(SCL) SCL
7 IO2(SDA) SDA

そして以下のページに同じモジュールを使ったサンプルコードがあるので参照。

http://tronixstuff.com/2014/12/01/tutorial-using-ds1307-and-ds3231-real-time-clock-modules-with-arduino/

ただし、このスケッチのコードは標準のARDUINO UNOなど用のためそのままではESP8266で操作しない。といっても変更は簡単で setup() 内の Wire.begin() に IO ピン番号を指定するだけで良い。

  Wire.begin(2, 14);

以上でサンプルのスケッチが動作した。

現状では以上でDS3231に時間をセットしたり、時間を取り出したり出来ています。
気になるのはI2Cインターフェースの 3 番ピンの SCL は HSPI インターフェースのHSPI_CLK と共通になっている。SD カードはこれを使用しているため SDWebServer スケッチの SD 書き込み時のファイル更新時間に使用できるかこれからテストします。

以上、DS3231モジュールを入手して3時間弱でした。

32BitCPUとWiFiモジュール(680円)とリアルタイムクロックモジュール(600円)が80円違い(2015/8/17時点)CPUが安いのかリアルタイムクロッくモジュールが高いのか・・・

2015年8月12日 (水)

Arduino の ESP8266をwebサーバーでSDカードのファイルを返す

Arduino の ESP8266をwebサーバーでSDカードのファイルを返す

今回の修正はSDカード内のindex.htmをクライアントに返すための修正です。
機能説明を目的として最小限の動作のみのコードのためエラー処理や汎用的な処理はしていません。実際に使用するときはSDWebServerスケッチなどを参考にしてください。

SDカードにアクセスできるように include 追加

#include <SPI.h>
#include <SD.h>

SDの有無を示すstatic変数追加

static bool hasSD = false;

SDからファイルを読み出す関数追加

bool loadFromSdCard(String path) {
  String dataType = "text/html";
  File dataFile = SD.open(path.c_str());
  if (dataFile.isDirectory()) {
    path += "/index.htm";
    dataFile = SD.open(path.c_str());
  }
  if (!dataFile) return false;
  server.sendHeader("Content-Length",String(dataFile.size()));
  server.sendHeader("Connection","close");
  server.sendHeader("Access-Control-Allow-Origin","*");
  server.send(200, dataType.c_str(), "");
  WiFiClient client = server.client();
  size_t totalSize = dataFile.size();
  client.write(dataFile, HTTP_DOWNLOAD_UNIT_SIZE);
  dataFile.close();
  return true;
}

onNotFound_()に1行追加

void onNotFound_() {
  if(hasSD && loadFromSdCard(server.uri())) return;

setup()にSDのイニシャライズ追加

void setup() {

  if (SD.begin(4)) {
    hasSD = true;
  }


setup()のserver.on()のコメントアウト

//  server.on("/",onRoot);
//  server.on("/index.htm",onRoot);
//  server.on("/index.html",onRoot);
  server.onNotFound(onNotFound_);
  server.begin();
}

これでブラウザからhttp://192.168.0.99/にアクセスするとSDカードのルートのindex.htmgが表示される。

以上の追加した全コードは以下の通りです。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <SPI.h>
#include <SD.h>
#include "myssid.h"

ESP8266WebServer server(80);
static bool hasSD = false;

void onRoot() {
  String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>Hello</h1></body></html>";
  server.send(200,"text/html",msg);
}
bool loadFromSdCard(String path) {
  String dataType = "text/html";
  File dataFile = SD.open(path.c_str());
  if (dataFile.isDirectory()) {
    path += "/index.htm";
    dataFile = SD.open(path.c_str());
  }
  if (!dataFile) return false;
  server.sendHeader("Content-Length",String(dataFile.size()));
  server.sendHeader("Connection","close");
  server.sendHeader("Access-Control-Allow-Origin","*");
  server.send(200, dataType.c_str(), "");
  WiFiClient client = server.client();
  size_t totalSize = dataFile.size();
  client.write(dataFile, HTTP_DOWNLOAD_UNIT_SIZE);
  dataFile.close();
  return true;
}
void onNotFound_() {
  if(hasSD && loadFromSdCard(server.uri())) return;
  String message = "Not Detected\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}
void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("");

  pinMode(5, OUTPUT);  // オリジナルは13だがテスト環境の都合で5に変えてある。

  if (SD.begin(4)) {
    hasSD = true;
  }

  WiFi.mode(WIFI_STA);
  WiFi.begin(mySSID, myPASSWORD);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  WiFi.config(IPAddress(192, 168, 0, 99), WiFi.gatewayIP(), WiFi.subnetMask());

  Serial.println("");
  Serial.print(WiFi.localIP());

//  server.on("/",onRoot);
//  server.on("/index.htm",onRoot);
//  server.on("/index.html",onRoot);
  server.onNotFound(onNotFound_);
  server.begin();
}

void loop() {
  server.handleClient();
}

2015年8月 8日 (土)

Arduino の ESP8266をwebサーバーで定義以外のファイルが指定され場合の処理

Arduino の ESP8266をwebサーバーで定義以外のファイルが指定され場合の処理

「  server.on("xxx",yyy);」で定義していないファイルが呼ばれた場合に呼ばれた アドレス、メソッド、アーギュメントを表示します。

  1. onNotFound_() 関数を追加します。最後に"_"が付いているのはIDEのエディタがonNotFoundと間違えて色が関数の色に変ってしまうためです。
    onNotFound_()の内容はSDWebServerスケッチの内容を参考に(ほぼコピー)しています。
  2. server.onNotFound(onNotFound_); 定義を server.begin(); の直前に追加する。

全体のソースコードは以下の通りです。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include "myssid.h"

ESP8266WebServer server(80);

void onRoot() {
  String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>Hello</h1></body></html>";
  server.send(200,"text/html",msg);
}
void onNotFound_() {
  String message = "Not Detected\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " NAME:" + server.argName(i) + "\n VALUE:" + server.arg(i) + "\n";
  }
  server.send(404, "text/plain", message);
}
void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("");
 
  pinMode(5, OUTPUT);  // オリジナルは13だがテスト環境の都合で5に変えてある。
  WiFi.mode(WIFI_STA);
  WiFi.begin(mySSID, myPASSWORD);
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
 
  WiFi.config(IPAddress(192, 168, 0, 99), WiFi.gatewayIP(), WiFi.subnetMask());
 
  Serial.println("");
  Serial.print(WiFi.localIP());
 
  server.on("/",onRoot);
  server.on("/index.htm",onRoot);
  server.on("/index.html",onRoot);
  server.onNotFound(onNotFound_);
  server.begin();
}

void loop() {
  server.handleClient();
}

2015年8月 7日 (金)

Arduino の ESP8266をwebサーバーでip address を固定する

Arduino の ESP8266をwebサーバーでip address を固定する

ほとんどの場合dhcpでIPアドレスを取得しても同じアドレスが取得できます。しかし、ルータを再起動した後には新しいIPアドレスになる場合があります。

IPアドレスを固定できると便利です。

アクセスポイントに接続した後次のコードを追加します。

  WiFi.config(IPAddress(192, 168, 0, 99), WiFi.gatewayIP(), WiFi.subnetMask());

全ソースコードは以下の通りです。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

void onRoot() {
  String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>Hello</h1></body></html>";
  server.send(200,"text/html",msg);
}
void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("");

  pinMode(5, OUTPUT);  // オリジナルは13だがテスト環境の都合で5に変えてある。
  WiFi.mode(WIFI_STA);
  WiFi.begin("ssid","password");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  WiFi.config(IPAddress(192, 168, 0, 99), WiFi.gatewayIP(), WiFi.subnetMask());

  Serial.println("");
  Serial.print(WiFi.localIP());

  server.on("/",onRoot);
  server.on("/index.htm",onRoot);
  server.on("/index.html",onRoot);
  server.begin();
}

void loop() {
  server.handleClient();
}

Arduino の ESP8266をwebサーバーで/ と /index.html で同じ処理をする。

/ と /index.html で同じ処理をする。 通常のWebサーバーではhttp://192.168.0.2/を指定されると、http://192.168.0.2/index.htmlが呼び出されるような設定になっています。ここでは、/と/index.htm、/index.htmlで同じ処理を呼び出すように設定する方法を示します。 setup() の最後を次のように変更する。

  server.on("/",onRoot);
  server.on("/index.htm",onRoot);
  server.on("/index.html",onRoot);
  server.begin();

全ソースコードは以下の通りです。 #include

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

ESP8266WebServer server(80);

void onRoot() {
  String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>Hello</h1></body></html>";
  server.send(200,"text/html",msg);
}
void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("");

  pinMode(5, OUTPUT);  // オリジナルは13だがテスト環境の都合で5に変えてある。
  WiFi.mode(WIFI_STA);
  WiFi.begin("ssid","password");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  WiFi.config(IPAddress(192, 168, 0, 99), WiFi.gatewayIP(), WiFi.subnetMask());

  Serial.println("");
  Serial.print(WiFi.localIP());

  server.on("/",onRoot);
  server.on("/index.htm",onRoot);
  server.on("/index.html",onRoot);
  server.begin();
}

void loop() {
  server.handleClient();
}

2015年8月 5日 (水)

ESP8266の電源電圧(3V3端子の電圧)の読み取り

ESP8266の電源電圧(3V3端子の電圧)の読み取り

3V3端子の電圧を測定するには、ADC_MODE(ADC_VCC)マクロの記述と、ESP.getVcc()から値を取得します。この値を1/1000すると3V3端子の電圧値になります。

7/24の「Arduino の ESP8266をwebサーバーにしてみよう」を改造してWebブラウザーに端子電圧を表示するプログラムに変更すると。

以下のようになる。
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>

ADC_MODE(ADC_VCC)

ESP8266WebServer server(80);

void onRoot() {
  int adc = ESP.getVcc();
  String msg = "<html><head><title>ESP8266WebSerber</title></head><body><h1>V3V端子電圧:";
        msg += String(adc / 1000.0);
        msg += "V</h1></body></html>";
  server.send(200,"text/html",msg);
}
void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.println("");

  pinMode(14, OUTPUT);
  digitalWrite(14,HIGH);
  WiFi.mode(WIFI_STA);
  WiFi.begin("*****","********");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print(WiFi.localIP());
  digitalWrite(14,LOW);

  server.on("/",onRoot);
  server.begin();
}

void loop() {
  server.handleClient();
}

シリアルモニタに表示されたIPアドレス http://192.168.0.2/ などにアクセスすると

3V3端子電圧:3.24V

のように表示する。3.24の値が3.3V電源の値により変わるはずです。

« 2015年7月 | トップページ | 2015年9月 »