2013年7月30日 星期二

水耕自己動手作 Part 4 (肥料)


接下來就是肥料問題了
上網買了電子秤


順便買了化學原料

再把每個原料依比例分別溶到1公升的水裡,然後再外瓶寫上比例和日期,
至於要施多少量就要看種什麼作物而定,

針對濃度換算,做了一個試算表
假設每 1000公升的水裡,要加入的硝酸鈣量為 354 公克(g),
且我要調的肥料量以一公升的水為主,假設一次就以100g的硝酸鈣加入一公升的水裡
這樣的溶液太濃,還要再加水稀釋,
可是我的水耕沒那麼大,頂多只有 20公升,
就要加入硝酸鈣濃縮營養液 3.54*20(公升)= 70.8 cc

例如:
我由農業局的網頁上找到蕃茄的水耕營養液比例如下:
每 1000公升 要加入的肥料量(g)
硝酸鈣 354 g
硝酸鉀 606 g
磷酸一銨 114 g
硫酸鎂 246 g
硼酸 1.5 g

於是我把每種原料溶到一公升的水裡
硝酸鈣 100 g
硝酸鉀 100 g
磷酸一銨 50 g
硫酸鎂 100
硼酸 1.5 g

由試算表中算出,每公升的水裡,我可以加入多少濃縮營養液
硝酸鈣 3.54 cc
硝酸鉀 6.06 cc
磷酸一銨 2.28 cc
硫酸鎂 2.46 cc
硼酸 1 cc

今天我用的水箱只有 20 公升,
所以我要把試算表裡的每公升加入濃縮營養液 *20(公升)
也就是我每次要加入的濃縮營養液量如下
硝酸鈣 70.8 cc
硝酸鉀 121.2 cc
磷酸一銨 45 cc
硫酸鎂 49 cc
硼酸 20 cc

下載水耕肥料比 試算表

水耕自己動手作 Part 3 (光照度)

過了一段時間
蕃茄開始出現黃葉現象,
2013/2/20


上網問了前輩,好像是缺鈣,所以買了兩包珊瑚石,再拿個洗衣袋裝進去,
直接丟到下方的水箱裡,
讓鈣慢慢釋出。

比對了土耕和水耕,同時期種下的蕃茄,
土耕沒有黃葉,水耕有,
土耕成長較慢,水耕較快,
土耕較綠,莖葉距離較短
土耕 2013/3/5
水耕 2013/3/5

猜想是否陽光照射也有差別,所以又買了照度計來測試。

測量結果,陽台外和陽台內,大約差了 1萬 燭光(LUX)
土耕和水耕大約差了 5000 (LUX),土耕比較能照到陽光!
水耕的日照果然少了很多,
所以將陽台窗戶全開,讓陽光多照一點進來。



水耕自己動手作 Part 2 (種植)

好不容易把水耕的虹吸鐘弄好,
再來就把布丁的空盒挖孔,並放上發泡煉石,
先試跑一段時間,結果發現發泡煉石會被虹吸鐘給吸下來,
所以在下層的水箱上再蓋上一層洗衣袋(拉鍊壞掉拿來利用!),把煉石接住,才不會被沈水馬逹給吸過去,


整個水耕雛型出來了...

再來就是種田時間,
我拿了包心萵苣的種子,直接放到發泡煉石上,
等了兩三天就發芽了
2012/11/7

2012/11/13

順便種了幾顆蕃茄
2012/11/22

一開始還覺得很順利,
但是到後來萵苣芽開始死掉了,
最後存活只剩下四顆,死亡率 50%
到是蕃茄存活率 100%
後來連紅鳳菜都順便來插花一下,也都活下來了。
2013/1/14

蕃茄,紅鳳菜 繼續快樂生長...
2013/2/5

萵苣剩下兩顆存活,死亡率 75%
2013/2/20



2013年7月29日 星期一

水耕自己動手作 Part 1 (設備)

很早以前就一直想玩水耕試試看,
在網路上也看了一些前輩 DIY 水耕設備,感覺並不難,
所以就自己動手做了一組水耕。
首先,到資源回收場撿兩個塑膠箱和架子,
我則是到外婆家撿了一些可用的材料
把其中一個箱子鑽孔,再把管子插上,並用熱熔膠封住接縫處。


再拿一個不要的飲料瓶,切掉頭部的蓋子部份,
做一個虹吸鐘(Bell Siphon)

把它套進剛才的接管處就完成了,

經過測試發現沒法達到虹吸現象,所以另外拿一個小礦泉水瓶,切下瓶蓋口,倒插進管子上,
仔細調好切口的水平,終於可以了。

調了好久,終於完成,試 Run 看看,真的有虹吸現象。

水耕終於有一點樣子了。

[Arduino] 將溫度寫入 SD 卡並以 Http 送給 Linux Server 以 PHP 寫入 MySQL 資料庫

前陣子玩了一些水耕的設備, 因為要天天記錄溫度、EC(電導度)、PH(酸鹼度), 顯得有點麻煩,所以打算自己 DIY 一些設備來玩玩。 首先考慮到程式開發的速度,選擇使用 Arduino 的板子來 DIY 我所購買的板子是 Arduino Leonardo,

另外購買 Arduino Ethernet W5100 網路擴展板,含 miniSD 座 以及 DS18B20 溫度感測器 不鏽鋼封裝 防水型
電路接法請參考Arduino 溫度感應
首先下載 OneWire Library Dallas Temperature Control Library 將這兩個檔案解壓縮後放到 Sketchbook 的資料夾下 相關說明請參考 葉難(Arduino 教學部落格) 或是開啟 Arduino 的 IDE 主程式,點選 File → Preferences 找到 Sketchbook 的路徑,
前置作業完成後就可以開始複製貼上了 程式碼如下:
#include 
#include 
#include 
#include "floatToString.h"
#include 
#include 

byte mac[] = {  0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x02 };
IPAddress ip(192,168,1,38);
IPAddress server( 192, 168, 1, 37 );
String strGet="GET /~webuser/hydroponics/TempDeg2DB.php?degree=";
String strHttp=" HTTP/1.1";
String strHost="Host: 192.168.1.37";  //OK
int serverPort=80;
//IPAddress mydns(168,95,1,1);  //OK
EthernetClient client;
#define ONE_WIRE_BUS 2
File myFile;
// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
// arrays to hold device address
DeviceAddress insideThermometer;


void connect(String tempdeg){
         if (client.connect(server, serverPort)) {
             Serial.print("Make a HTTP request ... ");
             myFile.print("Make a HTTP request ... ");
             //### Send to Server
             String strHttpGet = strGet + tempdeg + strHttp;

             client.println(strHttpGet);
             client.println(strHost);
             client.println();

             SD.println(strHttpGet);
             SD.println(strHost);
             SD.println();
           } 
           else {
         }
}

void setup(void)
{
  // start serial port
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.print("Initializing SD card...");
  pinMode(4, OUTPUT);
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  //Serial.println("initialization done.");
  myFile = SD.open("Temp.txt", FILE_WRITE);
  if (myFile) {
    sensors.begin();
    
  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
  sensors.setResolution(insideThermometer, 9);
 
  //### Init Net
  //Ethernet.begin(mac, ip, mydns);
  Ethernet.begin(mac, ip);
  
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);

  char mybuffer[6];
  connect(floatToString(mybuffer, tempC, 2));
  
}

void loop(void)
{ 
  myFile = SD.open("Temp.txt", FILE_WRITE);
  if (myFile) {
    sensors.requestTemperatures(); // Send the command to get temperatures
    printTemperature(insideThermometer);
    delay(15000);
    myFile.close();
  }
}
//====== 下面的程式碼不屬於本程式,而是網站本身帶出的 =====

因為我的板子是 Arduino Leonardo 所以 Compile 時檔案會太大,
因此上網找了一些方式可以再縮小檔案,雖然減少的量不大(2K),但不無小補。
移除 DNS 以減少檔案大小 參考文章(Reducing code size on Arduino Ethernet boards)
為了進一步減小檔案,再將浮點數轉換方式換掉。 浮點數轉字串
以上步驟做完時,重新 Compile 就可以過了。

修改過的程式碼請自行下載
浮點數轉字串Source Code(Flot2String.7z)
移除 DNS 的 Net Library Source Code(Ethernet_NoDNS.7z)

這時只要寫個 PHP 網頁程式,把資料寫入資料庫就可以囉~
//取出網址列所帶入的參數
    $send_degree=$_GET[degree];
 // 設定地區時間
 date_default_timezone_set("Asia/Taipei");
    echo strftime("%Y-%m-%d %H:%M:%S");
 //取得主機日期和時間
    $Login_Date=date("Y-n-j");
    $Login_Time=date("H:i:s");
 //資料庫登入資料
 $dbhost = 'localhost';
    $dbuser = 'testuser';
    $dbpass = '12345';
 $dbname = 'hydroponics';
 //登入資料庫
    $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die('Error with MySQL connection');
    mysql_query("SET NAMES 'utf8'");
    mysql_select_db($dbname);
 $sql = "INSERT INTO `Hydroponics`.`Temperature` (`degree`, `ServerDate`, `ServerTime`) VALUES ('$send_degree', '$Login_Date', '$Login_Time');";
 $result = mysql_query($sql) or die('MySQL query error');