ESP8266と2つのバッテリーの土壌水分を測定する年。 パート2

みなさんこんにちは! この記事では、2つのバッテリー(AAA)で2年間土壌水分センサーを動作させ、同時にすべてを正しくしない方法を説明します。 最初の記事は、開発環境(Arduino IDE)とBlynkプラットフォームの選択に関するものです









注目を集めるホームオークの写真



庭師アマチュア



まず第一に、ちょっとした認識-私はプログラマーではなく、家の庭師です。 両方とも私の趣味です。 棚は私の窓辺に作られており、特別な青赤のLEDバックライトがあり、その下で植物はより熱狂的に成長するはずです。 光合成やその他の植物学の詳細に触れることなく、LEDバックライトは1つの問題を引き起こし、この記事が対象とするデバイスが生まれた問題を解決したと言えます。



ネタバレ
LEDが温まり、地球が乾燥し、何とか水をやります。



LEDライン(約6ワットの電力)、彼らは非常に強く自分自身を加熱し、その上に立つ植物で棚と鍋を加熱します。 植物自体、加熱された土壌は不快感をもたらしませんが、土壌が急速に乾燥するという問題があります。



同時に、窓辺に立つだけの鉢の地球は、よりゆっくりと乾燥します。 上部棚では、灌漑中に土壌の状態が見えないため、オーバーフローや干ばつが定期的に発生します。



もちろん、すべてがすでに発明されており、Ebayではさまざまな土壌水分計の台車を購入できます。 たとえば、ブザー付きの水分計のインスタンスを1つ購入しました(価格は約300ルーブルです)。









デバイスは動作しますが、いくつかありますが:



  1. ブザーがどの湿度レベルに設定されているかは明確ではありません。
  2. 複数のデバイスが存在する場合は、歩いて聞く必要があります。
  3. 私もできます。


そして、経験があるので、Ostapは苦しみました( 12 )。 そのため、土壌の水分、光、温度、および空気湿度を測定し、測定結果をモバイルアプリケーションに転送し、かなり長い間バッテリーで作業できるデバイスが誕生しました。 鉄についてはこちら 。 この記事では、ソフトウェア機能について詳しく説明します。



消費電力の分析



データシートによると、ESP8266はWiFiモードで最大170 mA、モデムがオフ(モデムスリープ)で15 mA消費し、ディープスリープモードではまったく消費しません-約10μA。



デバイスの消費者から、WiFiモデム、AM2302センサー(TPS60240DGKR拡張経由で3.3 Vが供給される)、およびADC入力を切り替えるためのマルチプレクサ(CD74HC4051M96)を選択できます。



WiFiは電力消費に最も大きく貢献するため、最初に行うことは、ESP8266を無線をオフにして起動させることです。 モデムスリープモードで起動した後、すべての測定を行ってから、モデムをオンにしてデータをBlynkサーバーに転送するだけで(MQTTは消費を最適化するために今のところ無効にしています)、その後は次回までスリープ状態になります。



深い眠り



すべてのレッグがハードウェアで正しく接続されている(RSTピンがGPIO16に接続されている)場合、1つのコマンドでESPをディープスリープモードにできます。



ESP.deepSleep(sleep_time, WAKE_RF_DISABLED);

      
      





sleep_time – , , , ( blynk) – 5-10 . , .



WAKE_RF_DISABLED — , WiFi .



WiFi



Captive . , , WiFiManager, . . UART — :



  1. ( ).
  2. ( ).
  3. WiFiManager.


Captive , WiFi Blynk token.

, WiFi ESP.



// 
WiFi.forceSleepWake(); 
//  
WiFi.mode(WIFI_STA); 
//  
delay(100);
//,       begin
if (WiFi.SSID()) WiFi.begin(); 

      
      





ESP8266 WiFi.disconnect(); WiFi . , SSID() , .



AM2302



\ DHT Sensor Library Adafruit. , , , GPIO. , , ( 99%) 5 . «» , AM2302 , .. \ .





: , . — ().



ESP8266 10-, 0..1 . , 1 . — . , .









4 . .



, , . , 3.3 2.5 ( ) .





\



\ :



q_w = (adcbattery * 4) / 15; //

q_l = (adcbattery * 25) / 101; //



( ) . , ( ) .



float adcRead[3];
void quickSort(float *s_arr, int first, int last){
  if (first < last){
      int left = first, right = last, middle = s_arr[(left + right) / 2];
      do{
        while (s_arr[left] < middle) left++;
        while (s_arr[right] > middle) right--;
        if (left <= right){
          int tmp = s_arr[left];
          s_arr[left] = s_arr[right];
          s_arr[right] = tmp;
          left++;
          right--;
        }
      } 
      while (left <= right);
      quickSort(s_arr, first, right);
      quickSort(s_arr, left, last);
  }
}

void analogReadMedian(){
  adcRead[0] = analogRead(ADCPin);
  delay(10);
  adcRead[1] = analogRead(ADCPin);
  delay(10);
  adcRead[2] = analogRead(ADCPin);
}

void readADC_median(int input){
  switch(input){
    case 1 :
      digitalWrite(BPin, HIGH);
      digitalWrite(C_DHTPin, LOW);
      delay(50);
      analogReadMedian();
      quickSort(adcRead, 0, 2);
      adcbattery = adcRead[1] * 4;
      q_w = (adcbattery * 4) / 15;
      q_l = (adcbattery * 25) / 101; 
      digitalWrite(BPin, LOW);
      break;
    case 2 :
      digitalWrite(BPin, LOW);
      digitalWrite(C_DHTPin, LOW);
      analogWrite(PWMPin, 412);
      delay(50);
      analogReadMedian();
      quickSort(adcRead, 0, 2);
      adcwater = 5*(100 - 100*(adcRead[1] / q_w));
      if (adcwater > 100) adcwater = 100;
      if (adcwater < 0) adcwater = 0;
      analogWrite(PWMPin, 0);
      break;      
    case 3 :
      digitalWrite(BPin, LOW);
      digitalWrite(C_DHTPin, HIGH);
      delay(50);
      analogReadMedian();
      quickSort(adcRead, 0, 2);
      adclight = 100*(adcRead[1] / q_l);
      if (adclight > 100) adclight = 100;
      if (adclight < 0) adclight = 0;
      break;
    default :
      delay(1);
   }
}

      
      







, , , «» . , «» — , - 100 . , 100 50% .



, ESP8266 78 , 75 .



:



// GPIO  
pinMode(PWMPin, OUTPUT); 
//    
analogWriteFreq(75000); 
// ,  512   50%
analogWrite(PWMPin, 512);
// 
// 
analogWrite(PWMPin, 0);

      
      







, 1 , (2 ) 4 5760 . 12 ( ), (480 ).



, WiFi «», . , . , .. Deep sleep . EEPROM, ESP ( ).



, 512 RTC , , Deep sleep. .



ESP.rtcUserMemoryWrite(offset, &data, sizeof(data))
ESP.rtcUserMemoryRead(offset, &data, sizeof(data))
      
      





, () () . . , , , .





.



.









.



PS. .



All Articles