Pomiar wilgotności gleby

Dużo się ostatnio obserwuje różnych projektów wspomagających uprawę roślin. Jak wiadomo potrzebują one m.in. wody, a co za tym idzie właściwej wilgotności gleby. Czujników wilgotności jest bardzo wiele i różnią się wykonaniem i dokładnością. W tym artykule wykorzystam chyba najtańszy z nich, dostępny m.in. w naszym sklepie na Allegro.

Czujnik ma wyjście cyfrowe oraz analogowe. Na wyjściu cyfrowym pojawia się stan wysoki (1) w momencie osiągnięcia wartość ustalonej wbudowanym potencjometrem precyzyjnym. Wówczas też zapala się zielona dioda LED. Natomiast na wyjściu analogowym pojawia się sygnał w czasie rzeczywistym. Oczywistym jest że czujnik należy wyskalować samodzielnie metodą prób i błędów 🙂

Przedstawię jak podłączyć i wykonać prosty wykres w Processing.

Czujnik podłączamy do wyjścia analogowego w Arduino oraz programujemy kodem:


const int LED= 13;//Digital pin that the LED is connected

void setup(){
Serial.begin(9600);
pinMode(LED,OUTPUT);
}

void loop() {
int sensorReading= analogRead(A0); //reads the sensor value

Serial.println (sensorReading); //prints out the sensor reading
delay(200);

if (sensorReading > 800){//if reading is above 800, LED blinks on and off
digitalWrite(LED,HIGH); //turns the LED on
delay(1000); //waits for a second
digitalWrite(LED,LOW); //turns the LED off
delay(1000); //waits for a second
}
}

Do wizualizacji zmiany wykorzystałem projekt Processing. Należy pobrać aplikację, a w zasadzie całe IDE które przypomina te z Arduino i uruchomić kod:


// Graphing sketch

import processing.serial.*;

Serial myPort; // The serial port
int xPos = 1; // horizontal position of the graph
float inByte = 0;
PFont font;

void setup () {
// set the window size:
size(640, 480);
font = createFont(PFont.list()[12], 32);
textFont(font);
frameRate(30);

// List all the available serial ports
// if using Processing 2.1 or later, use Serial.printArray()
println(Serial.list());

// I know that the first port in the serial list on my mac
// is always my Arduino, so I open Serial.list()[0].
// Open whatever port is the one you're using.
myPort = new Serial(this, Serial.list()[35], 9600);

// don't generate a serialEvent() unless you get a newline character:
myPort.bufferUntil('\n');

// set inital background:
background(0);
}
void draw () {
// draw the line:
stroke(127, 34, 255);
line(xPos, height, xPos, height - inByte);

// at the edge of the screen, go back to the beginning:
if (xPos >= width) {
xPos = 0;
background(0);
} else {
// increment the horizontal position:
xPos++;
}
fill(0);
noStroke();
rect(0, 0, width, 75);
fill(255);
text("Wilgotność gleby", 15, 30);
text(str(inByte), 15, 70);
}
void serialEvent (Serial myPort) {
// get the ASCII string:
String inString = myPort.readStringUntil('\n');

if (inString != null) {
// trim off any whitespace:
inString = trim(inString);
// convert to an int and map to the screen height:
inByte = float(inString);
//println(inByte);
inByte = map(inByte, 1023, 0, 0, height);

}

}

W kodzie należy zwrócić uwagę na linijkę „myPort = new Serial(this, Serial.list()[35], 9600);” w której wskazujemy port UART (u mnie /dev/ttyUSB0).

Po uruchomieniu otrzymujemy piękny wykres:

Wizualizacja wilgotności gleby w Processing

 

Co dalej ? Czujnik należy wyskalować, czyli podlać roślinkę/plantację :-), odczytać wartość z pomiaru i dalej ją wykorzystać w aplikacji, ewentualnie wyskalować potencjometrem i wykorzystywać wyjście cyfrowe. Otrzymane dane pozwolą na wykonanie dalszych czynności czyli np. wyłączenia zraszacza 🙂

 

Posted in arduino and tagged , , , .

Artur Wronowski

Właściciel firmy digi-led. Od młodych lat jego pasją jest elektronika, informatyka i programowanie(Python).