Moist sensor
Leestijd: 3 MinutenOm te meten of mijn bonsai boom water nodig heeft wil ik in de grond een moist sensor maken. Een moist sensor is een weerstand sensor. Het gebruikt twee sondes die je in de grond steekt. Door de weerstand te meten tussen de twee sondes weet je hoe vochtig de grond is. Hoe vochtiger de grond hoe minder weerstand dit biedt en hoe droger hoe meer weerstand.
Echter de weerstand van een materiaal of in dit geval de grond, veranderd naarmate de temperatuur ook veranderd. Wanneer de Zon de grond opwarmt de weerstand wordt lager van de grond waardoor de grond droger lijkt dan dat hij is. Daarom gebruik ik ook een temperatuur sensor om de temperatuur van de grond te meten. Op deze manier kan je pieken in de weerstand eruit filteren.
Er is nog één probleem die ik nog niet helemaal heb opgelost. Wanneer je constant stroom laat lopen van één sonde naar de andere, tast dit het metaal aan. Dit proces heet elektrolyse. Het idee wat ik heb is om de stroom uit te zetten wanneer ik het niet gebruik en om te draaien elke keer dat het wordt gemeten. Dit wil ik gaan doen door een H Bridge te gebruiken. Normaal zou je dit gebruiken om de richting van een motor te keren, maar hier kan het ook nuttig voor zijn.
De temperatuur sensor die ik hiervoor gebruik is de Dallas DS18B20 omdat dit één pin gebruikt en accuraat is. Ook heeft deze sensor geen last van fluctuerende voltage wanneer deze module vanaf een batterij wordt gevoed.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include "OneWire.h" #define moist_pin A1 #define temp_pin 2 OneWire ds(temp_pin); void setup() { Serial.begin(9600); pinMode(moist_pin, INPUT); pinMode(temp_pin, INPUT); } void loop() { //Temperature Serial.print("Temp:"); Serial.print(getTemp()); // read the value from the sensor: int val1 = analogRead(moist_pin); delay(1000); Serial.print(": Moisture:"); Serial.println(val1); } float getTemp(){ //returns the temperature from one DS18S20 in DEG Celsius byte data[12]; byte addr[8]; if ( !ds.search(addr)) { //no more sensors on chain, reset search ds.reset_search(); return -1000; } if ( OneWire::crc8( addr, 7) != addr[7]) { Serial.println("CRC is not valid!"); return -1000; } if ( addr[0] != 0x10 && addr[0] != 0x28) { Serial.print("Device is not recognized"); return -1000; } ds.reset(); ds.select(addr); ds.write(0x44,1); // start conversion, with parasite power on at the end byte present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for (int i = 0; i < 9; i++) { // we need 9 bytes data[i] = ds.read(); } ds.reset_search(); byte MSB = data[1]; byte LSB = data[0]; float tempRead = ((MSB << 8) | LSB); //using two's compliment float TemperatureSum = tempRead / 16; return TemperatureSum; } |