<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>植物澆水自動化開源分享

植物澆水自動化開源分享

2022-11-03 | zip | 0.27 MB | 次下載 | 免費

資料介紹

描述

介紹

也許這發生在你身上,但在過去的幾年里,當我離開家去度假或忘記給它們澆水時,我殺死了很多植物。因此,我考慮將任務自動化以挽救未來的植物生命。本文描述了生成的項目。

我將 Arduino Uno 與 Infineon 的TLE94112 多半橋一起使用,為我的家庭植物創建了一個自動水泵。

有關這些部分的介紹以及如何熟悉相應的庫,請參閱這篇 hackster 文章。我還假設您對 Arduino 和 C++ 編程有一些基本知識。

硬件

Arduino 和 TLE94112 像任何其他 Arduino 盾牌一樣組合在一起。

poYBAGNiAv-AdV3WAAeTyNWMBxo046.jpg
?

棘手的部分是泵與TLE94112的連接,因為我們需要幾個半橋來為泵提供足夠的電流。就我而言,總共有 8 個,4 個高側和 4 個低側半橋,為泵提供高達 3.6A 的電流。問題是,這是我的泵產品頁面中列出的電流的兩倍多,因為大多數制造商只包括他們產品的平均電流負載,但對我們來說,開關期間的峰值電流是有限的,因為TLE94112如果超過每半橋 0.9A 的限制,將進入緊急關斷狀態。

這就是為什么我從三個螺絲端子中焊接了一個從 2 x 4 到 2 根電線的適配器:

?
?
?
poYBAGNiAxKAczqRAAF1r9LTPos900.jpg
?
1 / 2 ?適配器的詳細視圖。一個長螺絲端子將四個半橋連接在一起。
?

泵上的連接取決于您選擇的泵。就我而言,它帶有預連接的電線。

關于直流泵的另一個注意事項:在我的例子中,泵中的電機以相同的方向旋轉,而不管連接的極性如何。對于這個項目,這不是問題,但如果您想適應其他應用程序,請記住這一點。

最后,將軟管連接到泵上,并將一端放在水箱(例如噴壺)中,另一端放在植物的花盆中:

?
?
?
poYBAGNiAxWAWaFxAAD0Ftebx8M703.jpg
?
1 / 2
?

現在,我使用我的實驗室工作臺電源作為整個設置的電源。根據您的泵選擇合適的來源(可以是電池供電的)。請記住,TLE94112 將您的電源連接到泵。

軟件

由于我使這個項目相當可擴展,因此代碼被分成了幾個文件,但別擔心,它非常簡單,我們將詳細介紹所有細節。

該項目可以在任何與 arduino 兼容的 IDE 中設置,我們將使用默認的Arduino IDE ,但例如 Platformio 也可以。

前兩個文件,helpers.cpphelpers.hpp包含一些包裝器,用于啟用和關閉可切換到串行終端的日志記錄。

使用此處提供的功能,您可以簡單地使用

logger.log("hello world");

代替

Serial.print("hello world");

該類Logger 包裝 Serial.print等,并且僅logger.logging在設置為時打印/記錄true。需要創建該類的一個實例,然后您可以像通常的Serial類一樣使用它:

Logger logger(500, true); //logger wraps Serial.print in order to disable logging with one variable, here it is enabled.

logger.logln("Init ready");

第一個變量設置應將 TLE94112的錯誤消息提取并記錄到串行終端的時間段(以毫秒為單位)(請參閱本文,第 5 節以了解有關板的錯誤消息的說明)。第二個完全啟用/禁用日志記錄。

第二組文件是包含植物類的基本功能定義的文件plant.cpp,plant.hpp以支持通過同一設置澆灌多個植物。

class Plant {
private:
  /* data */
  uint32_t pump_duration; //pump powered time in millis
  uint8_t pump_interval_days; //nr of days between pumping
  Tle94112Motor *pump_motor;
  

public:

  void pump(); //function to pump water for pump_time length

  Plant(Tle94112Motor* pump_motor_p, uint32_t pump_duration_p, uint8_t pump_interval_days_p); //constructor
  
  void setPump_duration(uint32_t t_milli);
  uint32_t getPump_duration();
  
  void setPump_interval_days(uint8_t interval);
  uint8_t getPump_interval_days();
};

標題是不言自明的。

每株植物都有一個泵(Tle94112Motor *pump_motor;),應該uint32_t pump_duration;每隔幾天激活一次()一段時間( uint8_t pump_interval_days;

這些函數是這兩個變量的 getter 和 setter,以及激活泵送的函數。

我要特別注意void pump();.cpp文件中函數的函數定義:

void Plant::pump(){

    pump_motor->rampSpeed(255, pump_duration);
    delay(pump_duration);
    pump_motor->coast();//coast the motor to save power (as opposed to forced holding)
}

如您所見,泵電機并未立即完全啟動,但泵送速度在泵持續時間內上升至全速。這種“軟開關”是必要的,因為同時打開電機會消耗比TLE94112能夠處理的更多的電流。這通常也超過了電機/泵的電流消耗標簽。

現在我們已經來到了plant_watering.ino文件,代碼的核心。

前幾行只是庫包含和串行波特率的定義。

#include 
#include 
#include 
#include 

#include "plant.hpp"
#include "helpers.hpp" //Logger

#define BAUD 115200

接下來是為 TLE94112、記錄器和工廠創建所有類對象。在此示例中,我只使用一種植物,但您可以以相同的方式添加其他植物:

// Tle94112 Object on Shield 1
Tle94112Ino controller = Tle94112Ino();

// Tle94112Motor Objects on controller
Tle94112Motor motor_0(controller);

Logger logger(500, true); //logger wraps Serial.print in order to disable logging with one variable, here it is enabled.

Plant p1(&motor_0, 2000, 1); //attach the motor, the watering time and the days between watering

const uint8_t plant_nr = 1;

Plant* plants[plant_nr] = { //array of all plants, for iteration purposes
  &p1
};

所有植物都必須保存到一個plantssize 的數組中plant_nr。

接下來是一些有助于安排澆水任務的變量。這被排除在工廠類之外,以便輕松切換到不同的計時方案,例如實時時鐘。但是,在這種情況下,我們將使用該millis();函數。

//Timing:
uint32_t millis_in_day = (uint32_t)1000*60*60*24; //calculate the milliseconds in a day, for timekeeping
// uint32_t millis_in_day = (uint32_t)1000*5; //this is the testing version to see immediate results
uint32_t last_pumped[plant_nr] = {0}; //this is not a plant::variable since timing method is independent of plant class

出于測試目的,您可以通過減少一天中的毫秒數來模擬更快的時間流逝。

setup()函數初始化之前創建的所有對象。每個電機的半橋數量也在此處設置。在我的情況下,我必須使用最多四個,但根據您的泵,您可能可以使用更少。我建議您查看這篇文章以了解錯誤代碼和調試TLE94112 。

void setup()
{
  // Switch on communications
  Serial.begin(BAUD);
  while (!Serial){};

  // Enable MotorController on all Shields and Motors
  controller.begin();

  // IMPORTANT connect PWM to Lowside as higside is active Free wheeling
  motor_0.initConnector(motor_0.HIGHSIDE, controller.TLE_NOPWM, controller.TLE_HB1, controller.TLE_HB2, controller.TLE_HB7, controller.TLE_HB8);
  motor_0.initConnector(motor_0.LOWSIDE,  controller.TLE_PWM1,  controller.TLE_HB3, controller.TLE_HB4, controller.TLE_HB5, controller.TLE_HB6);

  // start the motor controller
  motor_0.begin();
  motor_0.coast();

  // end the setup function
  logger.logln("Init ready");
}

反復檢查陣列中的loop()所有植物,最后一次澆水的時間,以及該時間是否超過所需的澆水間隔(以天為單位)。如果是這樣,則給植物澆水。最后的延遲減少了這些檢查之間的時間。

void loop()
{
  uint32_t ct = millis();
  for(int i = 0; i < plant_nr; i++){
    if((ct - last_pumped[i]) >= (plants[i]->getPump_interval_days()) * millis_in_day){
      logger.log("Pumping Pump ");
      logger.log(i);
      logger.log(" at ");
      logger.logln(ct);

      plants[i]->pump();
      last_pumped[i] = ct;
    }
  }
  logger.error_status(controller);
  delay((uint32_t)1000); //this can be increased even more
}

這就是這個項目的全部內容。隨意在您自己的設置中使用代碼并通過例如使用 RT-Clock 或包括多個泵來擴展它。

在這里你可以看到我的設置:

?

?

?

?


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關電源設計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數字電路基礎pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅動電路設計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>