2020年4月24日金曜日

温湿度モニター(センサーをSHTに変更)

センサーをDHTからSHTに変更して、センサー部分の構造をむき出しから、アクリルパイプ(16φ 10cm)の中に入れる方法にしてみました。 
また、SHTだけですが供給電圧を計測時にonして終了すればoffするようにして、省電力化をさらに進めてみました。 
また、計測時間間隔を凡そ10分にしています。 (何故か、一つの計測点のDHTがうまく動作しなくなってしまったので、この際2つ共にSHTに変更しました。)
 また、実験中にhttpd-access.logに408が記録され、データがちゃんと受信できていなかった時があったので、Li電池を新しいものに交換してみました。
回路図を添付するほどの物ではないので、以下結線の記述;
SHT VIN -> D6(GPIO12)
      G     -> Ground
      SCL -> D1(GPIO5)
      SDA -> D2(GPIO4)
ESP-WROOM-32
     RST -> D0(GPIO16)  deepsleep wakeup の為、

>> 408のエラーを調べてみると、Headerが送られて来てから中身が送られて来るまでの間隔が長いと、攻撃とみなして、Timeoutさせる、仕様になっているようなので、外部にexposeするサーバーでは無いので、取り敢えず、/usr/local/etc/apache24/httpd.confのmod_reqtimeout.soをコメントアウトして様子を見ることにしました。
また、SHTの電源のoffは、サーバーとのコネクションを切ってからにしました。
>> これも解決には至っていない! 何が原因だろう?
何故か、手こずるなー、、、。
>> deepsleep で4時間半(10分毎なので、25,6回)位で止まってしまうので、別の8266に替えてみると、問題なく動いています。 結局は原因が良くわからず、8266自身が不良品だったのかもしれません。 
色々弄っているときにESP8285でもやってみましたが、此方はdeepsleepから立ち上がりませんでした。 ググるとdeepsleepが動かない、と言う書き込みがあったので、8266と同じものとして扱うことは出来なさそうです。
>>使用していた1000mAhのLi電池の出力が3.7V位に下がってしまう(劣化?)とNJU7223が3.3V作ってくれなくて起動できなくなっている物があることに気が付きました。NJUは入力電圧が0.6V以上高い必要がある為に、Liが3V台に落ちてしまうとアウト!




/*
    This sketch establishes a TCP connection to a "quote of the day" service.
    It sends a "hello" message, and then prints received data.
*/
#include "ESP8266WiFi.h"


#ifndef STASSID
#define STASSID "Buffalo-G-4CC0"
#define STAPSK  "65rhwrit3nnee"
//#define IDENTIFIER "GardenCenter"
#define IDENTIFIER "GardenEast"
//#define IDENTIFIER "GardenWest"
#endif
#define SHT 12  //  D6=GPIO12 set to SHT power. DTH11 was broken and replaced to SHT10 2020/04/21
#define DHTpin 14

#ifdef DHT  
  #include "DHTesp.h"
  DHTesp dht;
#else
  #include "SHTSensor.h"
  #include "Wire.h" 
  SHTSensor sht;

#endif
const char* ssid     = STASSID;
const char* password = STAPSK;
const char* Identifier = IDENTIFIER;
const char* host = "192.168.1.3";
const uint16_t port = 80;

void setup() {
  Serial.begin(115200);
  delay(1000);  //let sercial console settle.
  pinMode(SHT,OUTPUT); // Control SHT power to minimize the consumption.  
  // We start by connecting to a WiFi network
  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
#ifdef SHT  
  digitalWrite(SHT, HIGH);
  delay(100);  // need to wait a while ...
  Wire.begin();
  if (sht.init()) {
    Serial.print("init(): success\n");
  } else {
    Serial.print("init(): failed\n");
  }
#endif
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
#ifdef DHT
  dht.setup(DHTpin, DHTesp::DHT11);  //Connect DHT sensor to GPIO 14
#else
  sht.setAccuracy(SHTSensor::SHT_ACCURACY_MEDIUM); // only supported by SHT3x
#endif
}
void loop() {

  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    delay(5000);
    return;
  }
#ifdef DHT
  delay(dht.getMinimumSamplingPeriod());
  // Reading temperature or humidity takes about 250 milliseconds!
  // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  float h = dht.getHumidity();
  // Read temperature as Celsius (the default)
  float t = dht.getTemperature();
  // Check if any reads failed and exit early (to try again).
#else
  float h = sht.getHumidity();
  float t = sht.getTemperature();

#endif

  if (isnan(h) || isnan(t)) {
    Serial.println("Failed to read from DHT/SHT sensor!");
    delay(100);
    return;
  } 

  // WEB serverにデータをアップロードする。
  String url = "/weather/weather_log.php";
        url += "?location=" + String(Identifier); // ID to identify location
        url += "&temperature="+String(t);
        url += "&humidity=" +String(h);
        url += "&pressure=" +String("-----");     
  Serial.print("Requesting URL: ");
  Serial.println("GET "+ url);
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                "Host: " + host + "\r\n" +
                "Connection: close\r\n\r\n");
  delay(50); 
  // Read all the lines of the reply from server and print them to Serial
  Serial.println("Returned message from server: ");
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
  client.stop();  
  
  digitalWrite(SHT, LOW);  // turn off SHT power.

  // 15分deepsleepする。
  ESP.deepSleep(10*60*1000*1000, WAKE_RF_DEFAULT); // 60*1000*1000 = 1min, 10 min
  delay(1000); // execute once every 5 minutes, don't flood remote service
}

0 件のコメント:

アンテナ切り替えの自動化 (続き)

 調子よく動いていると思っていたら、インジケータのLEDが次々と点かなくなってゆく、、、。 不精して、出力端子(14Vのon/off)にLEDを直列抵抗と入れていたのですが、これではダメっぽい。 LEDが死んでいる。 では、という事でFETのスイッチを入れて、ゲート電圧で検出して...