巧妙な花ori栽培、または庭でITshnikをしましょう...パート2

友人、ホームガーデニングおよびオフィスガーデニングの分野での技術的な発掘は、あなたの側に明白な関心を引き起こしました(前の記事Clever FloricultureまたはLet IT Schnick to the Garden ... Part 1 )。 したがって、約束どおり、私たちはあなたの質問に答えます。



しかし、最初に、コンポーネントの写真。 マイクロコントローラ脳自体:









自己給電リアルタイムクロック:











土壌水分センサー(強制終了):









LCDモジュール、4本のネジ:)









1.そして、詳細自体はどこにありますか? コード、松葉杖、問題?

実際、コード自体は単一のリレー回路用にやり直されています。 見出しには、使用するライブラリへのリンクが含まれています。



/* Pich Irrigation Box (c) Mikhail Pichugin 2016 */ #include <avr/sleep.h> #include <Wire.h> #if defined(ARDUINO) && ARDUINO > 18 // Arduino 0019 or later #include <SPI.h> #endif #include <Sodaq_DS3231.h> // rep/ https://github.com/SodaqMoja/Sodaq_DS3231 #include <LiquidCrystal_I2C.h> // https://github.com/marcmerlin/NewLiquidCrystal #include <LcdBarGraph.h> // rep/ https://github.com/prampec/LcdBarGraph #include <Streaming.h> // http://arduiniana.org/libraries/streaming/ // ------------------------------------------------------------------------- // -- character with one bar byte ch_level1[8] = { B10000, B10000, B10000, B10000, B10000, B10000, B10000, B10000 }; // -- character with two bars byte ch_level2[8] = { B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000 }; // -- character with three bars byte ch_level3[8] = { B11100, B11100, B11100, B11100, B11100, B11100, B11100, B11100 }; // -- character with four bars byte ch_level4[8] = { B11110, B11110, B11110, B11110, B11110, B11110, B11110, B11110 }; #define I2C_ADDR 0x27 #define BACKLIGHT_PIN 3 #define En_pin 2 #define Rw_pin 1 #define Rs_pin 0 #define D4_pin 4 #define D5_pin 5 #define D6_pin 6 #define D7_pin 7 //#define SD_pin 4 boolean last_hour_irrig = false; boolean errorFlag = false; boolean errorPulse = false; boolean dispPulse = false; byte int0Button = 0; byte int0ButtonPin = 7; //pin   byte irrig_hours[] = {9,20}; //   xx  yy byte lcdNumCols = 20; //       int sensorPin = A0; //pin    int sensorValue = 0; //   int last_hour_sensor = 0; //      int moisturemin = 850; //       int irrig_delay = 10; //   . int pinINT0 = 2; //pin  INT0     int Relay1 = 4; unsigned long prevMillis =0; const long dispInterval =1000; DateTime last_date_irrig; LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin); LcdBarGraph lbg(&lcd,lcdNumCols, 0, 3); volatile boolean alarmFlag; void alarm() { alarmFlag = true; } // ------------------------------------------------------------------------- void setup() { // Initialize common Serial.begin(57600); //while (!Serial) { // ; // wait for serial port to connect. Needed for native USB port only //} Wire.begin(); // Initialize Real Time Clock rtc.begin(); pinMode(pinINT0, INPUT); last_date_irrig = rtc.now(); //if(last_date_irrig.year() == 2000){ //DateTime t(2016,2,28,11,0,0,6); //rtc.setDateTime(t); //Serial.println(F("-Setting date&time")); } // Initialize INT0 for accepting interrupts PORTD |= 0x04; DDRD &=~ 0x04; attachInterrupt(0, alarm, FALLING); rtc.enableInterrupts(EveryHour); //interrupt at EverySecond, EveryMinute, EveryHour or rtc.enableInterrupts(18,4,0); // interrupt at (h,m,s) // Initialize LCD lcd.begin (lcdNumCols,4); lcd.createChar(1, ch_level1); lcd.createChar(2, ch_level2); lcd.createChar(3, ch_level3); lcd.createChar(4, ch_level4); lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE); lcd.setBacklight(HIGH); lcd.home (); // go home //lcd.print("Start"); // Initialize Relay & Button pinMode(Relay1, OUTPUT); // relay init digitalWrite(Relay1, HIGH); // relay off pinMode(int0ButtonPin, INPUT_PULLUP); // int0button //Serial.println(F("-Init OK")); } // ------------------------------------------------------------------------- void loop() { unsigned long currentMillis = millis(); // -- Input circut ------------------------------------------------------- int0Button = digitalRead(int0ButtonPin); //int0 button if (int0Button == LOW) { alarmFlag = true; errorFlag = false; } rtc.convertTemperature(); DateTime now = rtc.now(); //get the current date-time sensorValue = analogRead(sensorPin); // -- Output circut ------------------------------------------------------ if (currentMillis-prevMillis>= dispInterval) { prevMillis = currentMillis; lcd.setCursor (0,0); lcd.print(int(rtc.getTemperature())); lcd.write((byte)223); lcd.setCursor (4,0); lcd.print(now.year(), DEC); lcd.print('/'); lcd.print(now.month(), DEC); lcd.print('/'); lcd.print(now.date(), DEC); lcd.print(' '); lcd.print(now.hour(), DEC); if (dispPulse) { dispPulse = false; lcd.print(F(":")); } else { dispPulse = true; lcd.print(F(" ")); } if (now.minute()<=9) {lcd.print("0");} lcd.print(now.minute(), DEC); lcd.setCursor (0,1); lcd.print(F("Sensor:")); lcd.print(sensorValue); lcd.print(F(" ")); lcd.print(F("min:")); lcd.print(moisturemin); lcd.setCursor (0,2); if (errorFlag) { if (errorPulse) {errorPulse = false; lcd.print(F("Relay :OFF, ERROR ")); } else {errorPulse = true; lcd.print(F("Relay :OFF, ERROR")); } Serial.println(F("ERROR")); } else { lcd.print(F("irH:")); lcd.print(irrig_hours[0], DEC); lcd.print(F(" to ")); lcd.print(irrig_hours[1], DEC); lcd.print(" "); lcd.print(irrig_delay); lcd.print(F("Sec ")); } lcd.setCursor (0,3); lcd.print(F("Lst:")); lcd.print(last_date_irrig.year(), DEC); lcd.print('/'); lcd.print(last_date_irrig.month(), DEC); lcd.print('/'); lcd.print(last_date_irrig.date(), DEC); lcd.print(' '); lcd.print(last_date_irrig.hour(), DEC); lcd.print(':'); if (last_date_irrig.minute()<=9) {lcd.print("0");} lcd.print(last_date_irrig.minute(), DEC); } // -- Action circut ------------------------------------------------------- if (alarmFlag && !errorFlag && now.hour()>=irrig_hours[0] && now.hour()<=irrig_hours[1]) { alarmFlag = false; //reset alarmFlag for next interrupt Serial.println(F("Moisture check Interrupt")); lcd.clear(); lcd.setCursor (0,0); lcd.print(F("Moisture check Int.")); if (sensorValue>=moisturemin) { lcd.setCursor (0,1); lcd.print(F("Sensor data :")); lcd.print(sensorValue); if (last_hour_irrig && abs(last_hour_sensor-sensorValue)<=5) { errorFlag = true; } else { Serial.println(F("-Irrigation")); lcd.setCursor (0,2); lcd.print(F("Relay :ON")); lcd.setCursor (0,3); lcd.print(F("Irrigation ")); lcd.print(irrig_delay); lcd.print(F(" Sec ")); digitalWrite(Relay1, LOW); // Relay ON for (int x=1; x<irrig_delay*5; x++) { lbg.drawValue( x, irrig_delay*5); delay(200); } digitalWrite(Relay1, HIGH); // Relay OFF last_date_irrig = rtc.now(); last_hour_irrig = true; last_hour_sensor = sensorValue; } } else { last_hour_irrig = false; last_hour_sensor = 0; } lcd.clear(); } rtc.clearINTStatus(); Serial.println(sensorValue); }
      
      





松葉杖と問題はハードウェアのみに影響しました。 たとえば、特にLCDモジュールでは、このライブラリのみが正しく機能しました。



2. WiFiとAndroid / iOSのアプリケーションはどこにありますか? クラウドのデータを使用した水の消費量の統計はどこにありますか? 220Vの接続を解除すると、花はどのくらい生き残りますか?

Wi-FiおよびBluetoothを介した接続は、初期段階では計画されていませんでした-このコントローラーのリソースは十分ではありません。 花は十分に生きるので、それを知っている人は誰でも水やりに問題があると思い込み、貧しい人を酔わせることができます



自宅でイーサネットモジュールを接続し、システムがTwitterで私の行動を報告したとしか言えません。 職場では、このモジュールを無効にする必要がありました。情報サポート部門のアプリケーションに何を書くかが明確ではないためです。「ゴムタイプのゴム工場をLANに接続してください。 ちなみに、これはどんな現実ですか、誰がそれを言うのでしょうか?



3.ワッシャーモーターの過剰な電力に対処する方法は? アクアリウムポンプを使用する考えはありましたか? 自動車も同じです。

強力な水が土壌を侵食するのではないかという懸念がありました。ヘッドライトウォッシャー用のノズルも用意しました。 しかし、Tコネクターを介して通常1つのスレッドを2つに分離するだけで十分でした。



4.湿度センサーの腐食の問題をどのように解決しますか? 湿度センサーが設置されている場所。

実際、センサーはそれほど腐食せず、電気分解によって非常に破壊されます。 多くの場合、花が土壌にこのプロセスの痕跡を残すことは有用ではないという理解がありますが、他に何も提供することはできません。 測定、計量、誘導センサー、温度差センサーなどの間、しばらくの間センサーを切断するというアイデアがありました-まだ覚えていません;)



標準的なセンサーで約3〜4週間は十分と言えますが、ここでは特定の土壌の鉱化作用を考慮する必要があります。 今、ステンレス鋼の新しい自家製バージョンがあります。 どれくらい続くか見てみましょう。



5.灌漑率はどのように計算されましたか?

水の消費量は実験的に計算されました。 イチジクに関する対応する文献を読み、彼が必要とする水量を実験的に計算しました。 次に、彼らは同様にポンプの流量が何であるかを見つけました。 この例では、ポンプが必要な量の水を汲み上げるのに10秒かかります。 この期間はファームウェアに組み込まれています。 現在のバージョンでは、設定をインタラクティブに変更することはできません。



All Articles