SDカードのソケットではちょっと図体が大きすぎるのでmicroSDに変更してみたが、SPIモードですんなり動いた。 WiFiの接続が不安定で、今朝は問題なく繋がったがdeep sleep modeの試験をすると、繋がっていない。 バッファローのルータのログの意味が良く分からずに頓挫していたが、ググっていると「ログの意味は何ですか」というのを見つけました。それによれば
reason 15 = "4 way handshake timeout"で「ノイズやその他の理由によりWPA2/WPAなどの認証時、またはKey(鍵)更新時に行われる鍵交換通信がうまく行かず、タイムアウトしてしまったことが考えられます。この場合は認証が失敗するため、無線の切断が発生します。無線子機では、通信が切断されると、再び無線接続動作をやり直します」
ー>要するに波の送受信がうまくいっていない(弱い)。
だったら、中継器を部屋につけてやってみたらどうだろう? ということで、実験台の直ぐそばに中継器を置いてみたら、すんなり接続できました。
ちょっと不安だったSDカードから接続情報を取得する方法も問題なく使えることが確認できました。
後は、回路を完成させて、動作試験と、土壌湿度の校正データの構築。 折角、風乾土壌を準備し始めたのに昨日の雨で振出しに戻りました(研究室と違い、自宅は土を広げる屋根のある場所などありませんので、、、)。
>> ESP.deepSleepの受け取る引数のサイズを意識せずに、指定していたところ何か動作がおかしいので、ググってみたらuint32だと!! これだとmicro sec単位での指定なので1時間がMaxということになりなります。 取りあえず30分毎に起きるようにすることにします。 ただ、これで単4電池2本でどのくらい持つのか、、、。
SoilMoistureMeasurement
/*
* This sketch sends data via HTTP GET requests to data.sparkfun.com service.
*
* You need to get streamId and privateKey at data.sparkfun.com and paste them
* below. Or just customize this script to talk to other HTTP servers.
*
*/
#include
extern "C" {
#include "user_interface.h"
}
#include
#include
#include
#include
#define SWITCH 15 // use pin 15 as the switch to temp/moist - Low: moist, High:temp
Sd2Card card;
ST7032 lcd;
const int chipSelect = 2;
char ssid[30] = "Buffalo-G-4CC0";
char password[30] = "**********";
char Id[30] = "*************************";
char host[20] = "192.168.1.3";
const char* streamId = "Baffalo-G-4CC0";
const char* privateKey = "";
const float vref = 1.00; // ESP8266 ADC(Tout) reference is 1.00, declare globally
char conversionTable[100]; // Convert voltage to moisture (0 - 100) %
int measure_temp(){
float offset = 0.424; // volts at 0 degree
float v = 0.0;
float vc = 0.00625; // delta volts per degree
uint ADC_Value = 0;
float temp = 0.0;
int i;
for(i = 0;i < 30; i++){
ADC_Value = system_adc_read();
v = float(ADC_Value)/1024.0 * vref;
temp = temp + (v-offset) / vc;
delay(30);
}
return (int)temp/30;
}
void read_ssid(){
// open the file for reading:
File myFile = SD.open("ssid.txt", FILE_READ);
char *s = ssid;
if (myFile) {
// read from the file until there's nothing else in it:
while (myFile.available()) {
*s++ = myFile.read();
}
*s = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening ssid.txt");
}
}
void read_password(){
File myFile = SD.open("password.txt");
if (myFile) {
char *p = password;
// read from the file until there's nothing else in it:
while (myFile.available()) {
*p++ = myFile.read();
}
*p = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening password.txt");
}
}
void read_Id(){
File myFile = SD.open("Id.txt");
char *p = Id;
if (myFile) {
// read from the file until there's nothing else in it:
while (myFile.available()) {
*p++ = myFile.read();
}
*p = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening Id.txt");
}
}
void read_host(){
File myFile = SD.open("host.txt");
char *p = Id;
if (myFile) {
// read from the file until there's nothing else in it:
while (myFile.available()) {
*p++ = myFile.read();
}
*p = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening host.txt");
}
}
void setup_conv_table(){
File myFile = SD.open("conv.dat");
if (myFile){
for(int i=0, j=0; i < 100; i++, j++){
conversionTable[i] = myFile.read(); // put one byte into the table. tobe binary 0 to 255 (8 bit)
}
myFile.close();
}else{ // If no data available, make one to one fake one.
for(int i=0, j=0; i < 100; i++, j++){
conversionTable[i] = j;
}
}
}
int measure_moist(){
float v = 0.0;
uint ADC_Value = 0;
float temp = 0.0;
int i;
for(i = 0;i < 30; i++){
ADC_Value = system_adc_read();
v = float(ADC_Value)/1024.0 * vref; // milli volts
temp = temp + v;
delay(30);
}
return (int)temp/30*1000; // rounded milli volts in decimal
// return (int)conversionTable[(int)temp/30*1000)]; // In future, % moisture.
}
void setup() {
Serial.begin(115200);
delay(10);
pinMode(SWITCH, OUTPUT); // set SWITCH(IO15) pin as an output
byte mac_addr[6];
WiFi.macAddress(mac_addr);
char buff[20];
Serial.print("Mac address: ");
sprintf(buff, "%02X:%02X:%02X:%02X:%02X:%02X",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.println(buff);
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
Serial.println("");
Serial.println("Started");
// Read ssid, password, Id from SD card and put 'em to global variables
read_ssid();
read_password();
read_Id();
read_host();
delay(500); //Why?, but need this, otherwise WiFi cannot connect to
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Set up LCD display
lcd.begin(8,2);
lcd.setContrast(25);
delay(40);
}
void loop() {
// Display data to LCD first
String s1;
String s2;
int temp;
int moist;
digitalWrite(SWITCH, HIGH);
temp = measure_temp();
digitalWrite(SWITCH, LOW);
moist = measure_moist();
digitalWrite(SWITCH, HIGH);
s1 = String(temp) + " C";
s2 = String(moist) + " %";
lcd.clear();
lcd.setCursor(2,0);
lcd.print(s1);
lcd.setCursor(2,1);
lcd.print(s2);
Serial.println(" ==== Temp = " + s1 );
Serial.println(" ==== Moisture = " + s2);
/*
// Use WiFiClient class to create TCP connections
Serial.print("connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url = "/data/data_logger.php";
url += "?Identifier=" + Id;
url += "&data1="+String(temp);
url += "&data2=" +String(moist);
url += "&data3=" +String("");
url += "&data4="+String("");
url += "&data5=" +String("");
url += "&data6=" +String("");
Serial.print("Requesting URL: ");
Serial.println("GET "+url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n\r\n");
delay(50);
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
*/
//DEEP SLEEPモード突入命令
Serial.println("DEEP SLEEP START!!");
//1:μ秒での復帰までのタイマー時間設定 2:復帰するきっかけの設定(モード設定)
ESP.deepSleep( 60 * 1000 * 1000 * 60 * 3 , WAKE_RF_DEFAULT); // 3 hours
//deepsleepモード移行までのダミー命令
delay(1000);
/*
// QRX
for(int i=0; i < 60 ; i++){
delay(1000);
}
*/
}
reason 15 = "4 way handshake timeout"で「ノイズやその他の理由によりWPA2/WPAなどの認証時、またはKey(鍵)更新時に行われる鍵交換通信がうまく行かず、タイムアウトしてしまったことが考えられます。この場合は認証が失敗するため、無線の切断が発生します。無線子機では、通信が切断されると、再び無線接続動作をやり直します」
ー>要するに波の送受信がうまくいっていない(弱い)。
だったら、中継器を部屋につけてやってみたらどうだろう? ということで、実験台の直ぐそばに中継器を置いてみたら、すんなり接続できました。
ちょっと不安だったSDカードから接続情報を取得する方法も問題なく使えることが確認できました。
後は、回路を完成させて、動作試験と、土壌湿度の校正データの構築。 折角、風乾土壌を準備し始めたのに昨日の雨で振出しに戻りました(研究室と違い、自宅は土を広げる屋根のある場所などありませんので、、、)。
>> ESP.deepSleepの受け取る引数のサイズを意識せずに、指定していたところ何か動作がおかしいので、ググってみたらuint32だと!! これだとmicro sec単位での指定なので1時間がMaxということになりなります。 取りあえず30分毎に起きるようにすることにします。 ただ、これで単4電池2本でどのくらい持つのか、、、。
SoilMoistureMeasurement
/*
* This sketch sends data via HTTP GET requests to data.sparkfun.com service.
*
* You need to get streamId and privateKey at data.sparkfun.com and paste them
* below. Or just customize this script to talk to other HTTP servers.
*
*/
#include
extern "C" {
#include "user_interface.h"
}
#include
#include
#include
#include
#define SWITCH 15 // use pin 15 as the switch to temp/moist - Low: moist, High:temp
Sd2Card card;
ST7032 lcd;
const int chipSelect = 2;
char ssid[30] = "Buffalo-G-4CC0";
char password[30] = "**********";
char Id[30] = "*************************";
char host[20] = "192.168.1.3";
const char* streamId = "Baffalo-G-4CC0";
const char* privateKey = "";
const float vref = 1.00; // ESP8266 ADC(Tout) reference is 1.00, declare globally
char conversionTable[100]; // Convert voltage to moisture (0 - 100) %
int measure_temp(){
float offset = 0.424; // volts at 0 degree
float v = 0.0;
float vc = 0.00625; // delta volts per degree
uint ADC_Value = 0;
float temp = 0.0;
int i;
for(i = 0;i < 30; i++){
ADC_Value = system_adc_read();
v = float(ADC_Value)/1024.0 * vref;
temp = temp + (v-offset) / vc;
delay(30);
}
return (int)temp/30;
}
void read_ssid(){
// open the file for reading:
File myFile = SD.open("ssid.txt", FILE_READ);
char *s = ssid;
if (myFile) {
// read from the file until there's nothing else in it:
while (myFile.available()) {
*s++ = myFile.read();
}
*s = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening ssid.txt");
}
}
void read_password(){
File myFile = SD.open("password.txt");
if (myFile) {
char *p = password;
// read from the file until there's nothing else in it:
while (myFile.available()) {
*p++ = myFile.read();
}
*p = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening password.txt");
}
}
void read_Id(){
File myFile = SD.open("Id.txt");
char *p = Id;
if (myFile) {
// read from the file until there's nothing else in it:
while (myFile.available()) {
*p++ = myFile.read();
}
*p = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening Id.txt");
}
}
void read_host(){
File myFile = SD.open("host.txt");
char *p = Id;
if (myFile) {
// read from the file until there's nothing else in it:
while (myFile.available()) {
*p++ = myFile.read();
}
*p = '\0';
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening host.txt");
}
}
void setup_conv_table(){
File myFile = SD.open("conv.dat");
if (myFile){
for(int i=0, j=0; i < 100; i++, j++){
conversionTable[i] = myFile.read(); // put one byte into the table. tobe binary 0 to 255 (8 bit)
}
myFile.close();
}else{ // If no data available, make one to one fake one.
for(int i=0, j=0; i < 100; i++, j++){
conversionTable[i] = j;
}
}
}
int measure_moist(){
float v = 0.0;
uint ADC_Value = 0;
float temp = 0.0;
int i;
for(i = 0;i < 30; i++){
ADC_Value = system_adc_read();
v = float(ADC_Value)/1024.0 * vref; // milli volts
temp = temp + v;
delay(30);
}
return (int)temp/30*1000; // rounded milli volts in decimal
// return (int)conversionTable[(int)temp/30*1000)]; // In future, % moisture.
}
void setup() {
Serial.begin(115200);
delay(10);
pinMode(SWITCH, OUTPUT); // set SWITCH(IO15) pin as an output
byte mac_addr[6];
WiFi.macAddress(mac_addr);
char buff[20];
Serial.print("Mac address: ");
sprintf(buff, "%02X:%02X:%02X:%02X:%02X:%02X",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
Serial.println(buff);
Serial.print("Initializing SD card...");
if (!SD.begin(chipSelect)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
Serial.println("");
Serial.println("Started");
// Read ssid, password, Id from SD card and put 'em to global variables
read_ssid();
read_password();
read_Id();
read_host();
delay(500); //Why?, but need this, otherwise WiFi cannot connect to
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Set up LCD display
lcd.begin(8,2);
lcd.setContrast(25);
delay(40);
}
void loop() {
// Display data to LCD first
String s1;
String s2;
int temp;
int moist;
digitalWrite(SWITCH, HIGH);
temp = measure_temp();
digitalWrite(SWITCH, LOW);
moist = measure_moist();
digitalWrite(SWITCH, HIGH);
s1 = String(temp) + " C";
s2 = String(moist) + " %";
lcd.clear();
lcd.setCursor(2,0);
lcd.print(s1);
lcd.setCursor(2,1);
lcd.print(s2);
Serial.println(" ==== Temp = " + s1 );
Serial.println(" ==== Moisture = " + s2);
/*
// Use WiFiClient class to create TCP connections
Serial.print("connecting to ");
Serial.println(host);
WiFiClient client;
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url = "/data/data_logger.php";
url += "?Identifier=" + Id;
url += "&data1="+String(temp);
url += "&data2=" +String(moist);
url += "&data3=" +String("");
url += "&data4="+String("");
url += "&data5=" +String("");
url += "&data6=" +String("");
Serial.print("Requesting URL: ");
Serial.println("GET "+url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + server + "\r\n" +
"Connection: close\r\n\r\n");
delay(50);
// Read all the lines of the reply from server and print them to Serial
while(client.available()){
String line = client.readStringUntil('\r');
Serial.print(line);
}
Serial.println();
Serial.println("closing connection");
*/
//DEEP SLEEPモード突入命令
Serial.println("DEEP SLEEP START!!");
//1:μ秒での復帰までのタイマー時間設定 2:復帰するきっかけの設定(モード設定)
ESP.deepSleep( 60 * 1000 * 1000 * 60 * 3 , WAKE_RF_DEFAULT); // 3 hours
//deepsleepモード移行までのダミー命令
delay(1000);
/*
// QRX
for(int i=0; i < 60 ; i++){
delay(1000);
}
*/
}
0 件のコメント:
コメントを投稿