Eigenbau Bodenfeuchte-Sensor | Wireless | Batterie | < 20€

Begonnen von Ekkehard, 23 Februar 2016, 21:02:08

Vorheriges Thema - Nächstes Thema

tante ju

Zitat von: sash.sc am 04 August 2016, 15:44:31
Hörts sich sehr interessant an, mit dem sensor von Tante Ju.

Wie hast du den Sensor den in FHEM eingebunden, bzw. wie wird der erkannt ? Welches Protokoll bzw Typ?

MySensors.
Ich habe ein MQTT Gateway, aber es gibt auch ein FHEM MySensors Modul für ein wired Gateway.

micky0867

Hier einige Fotos von meinem Sensor.
Die Edelstahlgewindestangen sind extra lang, damit man sie gut im Boden halten und unten mit Schrumpfschlauch überzogen, damit man die Feuchtigkeit nur in den oberen Schichten misst.
Für meine Tomaten ist das egal, die brauchen soviel Wasser, dass da wahrscheinlich ein heftiges Vakuum entsteht ;-)

Micky

sash.sc

Zitat von: micky0867 am 04 August 2016, 19:55:32
Hier einige Fotos von meinem Sensor.
Die Edelstahlgewindestangen sind extra lang, damit man sie gut im Boden halten und unten mit Schrumpfschlauch überzogen, damit man die Feuchtigkeit nur in den oberen Schichten misst.
Für meine Tomaten ist das egal, die brauchen soviel Wasser, dass da wahrscheinlich ein heftiges Vakuum entsteht ;-)

Micky
Welche Komponenten hat du verbaut? Wie wird der Sensor in fhem erkannt?

Ich möchte den Bodensensor am besten über 868mhz als LaCrosse Sensor einbinden. 433 mhz würde auch gehen, über nen nano cul.

@all
Würde es mit nen einfachen Sender 433mhz auch gehen?

Gruß Sascha


Gesendet von meinem SM-T560 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

micky0867

Ich benutze dafür ebenfalls Mysensors.
Seit der Version 2.0 bin ich wirklich beeindruckt, wie aufgeräumt und simpel die API ist.

Micky

sash.sc

Die gewindestangen sind mit nen Schrumpfschlauch versehen oder blank?

Gesendet von meinem SM-T560 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

tante ju

Zitat von: Bastelbernd am 04 August 2016, 13:45:14
Hallo tante ju

finde ich sehr interessant, könntest du den Sketch und die eagle Dateien auch hier einstellen ?
Würde ich gerne nachbauen.

Der Source ist ziemlich trivial. Du benötigst MySensors 2.0 dazu:
/*
* Soil humidity sensor
* Attached to the ATMEGA is an astable multivibrator with an NE555
* where C is the determined by insulated copper planes in the soil, so that
* frequency is depending on the humidity of the soil
* The higher the humidity, the lower the frequency and v.v.
*
*/


#define SN "Bodenfeuchte-Sensor"
#define SV "1.1"

#define MY_RADIO_NRF24

#define MY_RF24_CE_PIN    5   // radio chip enable
#define MY_RF24_CS_PIN    6   // radio SPI serial select
#define MY_SOFTSPI

#define POWERAMV          9   // Output line to provide power for the AMV
#define INPUTFREQ         2   // IRQ input for frequency count. Must be 2 or 3

#define MY_NODE_ID        5   // Initial fixed Id of the sensor child
#define CHILD_ID 0

#define MAXBATTERY        36  // Maximum voltage of Battery in 100 mV, for percentage calculation

#include <SPI.h>
#include <MyConfig.h>
#include <MySensors.h>

unsigned long SLEEP_TIME = 300000; // Sleep time between reads (in milliseconds)

// How long to count pulses, for a fixed frequency this should be 998 ms (for a total runtime of 1 sec with 1 MHz oscillator)
#define MainPeriod 1000

// Waiting time in ms between powering up AMV and stable frequency
#define SETTLETIME  1000


/*
* Internals to follow, nothing to adjust
*/
volatile unsigned int pulsecount=0;   // Counter for pulses
unsigned int average;                 // IIR floating average filter
unsigned long statestart;             // Storage for statemachine timer
int my_state;                         // actual state of statemachine

MyMessage msg(CHILD_ID, V_HUM);

void setup() 

  pinMode(POWERAMV, OUTPUT);
  digitalWrite(POWERAMV,LOW);
#ifdef MY_DEBUG
  digitalWrite(POWERAMV,HIGH);        // Send trigger pulse out
  digitalWrite(POWERAMV,LOW);
#endif
  my_state=0;                         // start statemachine with 0
  average=0;                          // reset IIR filter
}


void presentation() {
  // Send the sketch version information to the gateway and Controller
  sendSketchInfo(SN, SV);

  present(CHILD_ID, S_HUM);
}



/*
* Main program loop
*/
void loop()
{
  unsigned long now = millis();
 
  switch(my_state) {
    case 0: // Initialization
      {
        // Send battery level percentage on every state 0, which should be beginning of each measurement cycle
        long voltlevel = readVcc();
        int pct = voltlevel/MAXBATTERY;
        sendBatteryLevel(pct);
      }
      my_state++;   // Increase for next round
      break;

    case 1: // Start up astable multivibrator
      statestart=now;
      pinMode(INPUTFREQ, INPUT);
      pinMode(POWERAMV, OUTPUT);
      digitalWrite(POWERAMV, HIGH);   // Power up electronics
      my_state++;                     // Next state
      break;

    case 2: // Wait for AMV to settle
      if(now - statestart > SETTLETIME)
        my_state++;
      break;

    case 3: // Prepare measurement
      pulsecount = 0;
#if INPUTFREQ == 2
      attachInterrupt(0, myinthandler, FALLING); // IRQ D2 low to high
#elif INPUTFREQ == 3
      attachInterrupt(1, myinthandler, FALLING); // IRQ D2 low to high
#else
#error "Frequency input must be D2 or D3"
#endif
      statestart=now;
      my_state++;
      break;

    case 4: // Wait for measurement to finalize
      if(now - statestart >= MainPeriod) my_state++;
      break;

    case 5: // register counts per period (frequency) and calculate IIR
      {
        // Store actual counter value
        unsigned long _pulsecount = pulsecount;
        pulsecount = 0;

        // Simple IIR, floating average
        average += _pulsecount;
        if(average != _pulsecount)    // During startup both are equal
          average >>= 1;
      }
      my_state++;
      break;

    case 6: // Stop measuring and AMV
      digitalWrite(POWERAMV, LOW);
#if INPUTFREQ == 2
      detachInterrupt(0);
#elif INPUTFREQ == 3
      detachInterrupt(1);
#else
#error "Frequency input must be D2 or D3"
#endif
      pinMode(INPUTFREQ, INPUT);
      my_state++;
      break;

    case 7: // Send value out
      {
        send(msg.set(average), true);
      }
      my_state++;
      break;

    case 8: // Nothing to do
      my_state++;
      break;

    case 9: // Go to sleep
      sleep(SLEEP_TIME);
      my_state=0;     // Start over again
      break;

    default:
      my_state=0;     // Just in case
      break;
  }
}


void myinthandler() // interrupt handler
{
    pulsecount++;
}


/*
* Read Vcc against internal Vref
*/
long readVcc() {
  // Read 1.1V reference against AVcc
  // set the reference to Vcc and the measurement to the internal 1.1V reference
#if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
    ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
    ADMUX = _BV(MUX5) | _BV(MUX0);
#elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__)
    ADMUX = _BV(MUX3) | _BV(MUX2);
#else
    ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1);
#endif 

  delay(2); // Wait for Vref to settle
  ADCSRA |= _BV(ADSC); // Start conversion
  while (bit_is_set(ADCSRA,ADSC)); // measuring

  uint8_t low  = ADCL; // must read ADCL first - it then locks ADCH 
  uint8_t high = ADCH; // unlocks both

  long result = (high<<8) | low;

  result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000
  return result; // Vcc in millivolts
}



tante ju

Da ich einige (wenige) Anfragen bekommen habe, mal eine Frage in die Runde:
Besteht Bedarf an professionell produzierten Platinen für meinen simplen Bodenfeuchte-Sensor? Das wären dann wohl zwei Platinen: eine für die Elektronik und eine nur mit den Kupferbahnen für den kapazitiven Sensor. Schätze mal, würden beide zusammen so 3-4 EUR kosten. Könnte aber auch ein Layout als SMD machen (will ich sowieso), dann wird es schön klein. Das mit einem NRF24L01 in SMD dürfte nicht viel größer als eine AA Batterie sein. Dann könnte ich mehrere auf einen Nutzen packen, fürs gleiche Geld.

MadMax-FHEM

Hi tante ju,

ich wäre interessiert.

SMD bestücken wäre halt evtl. ein Problem...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

PeMue

Hallo Tante Ju,

ich wäre an 2-3 Platinen interessiert. Wenn Du das Layout fertig hast, schaue ich gerne noch mal drüber. Schön klein klingt echt gut, denn ich sollte für den Winter etwas haben, was die Blumen im DG überwachen kann  ;)

Gruß PeMue
RPi3Bv1.2 rpiaddon 1.66 6.0 1xHM-CC-RT-DN 1.4 1xHM-TC-IT-WM 1.1 2xHB-UW-Sen-THPL-O 0.15 1x-I 0.14OTAU  1xCUNO2 1.67 2xEM1000WZ 2xUniroll 1xASH2200 3xHMS100T(F) 1xRFXtrx 90 1xWT440H 3xTFA30.3150 5xFA21
RPi1Bv2 LCDCSM 1.63 5.8 2xMAX HKT 1xMAX RT V200KW1 Heizung Wasser

RappaSan

#24
Löst sich der Kupferbelag im Boden nicht sehr schnell auf?
Abgesehen davon sind Kupfer-Ionen der Pflanzenwelt nicht sehr zuträglich... die töten nicht nur Pilze ab... zumindest in höherer Konzentration.
Abgesehen davon: Schöner und vor allem preiswerter Sensor.

tante ju

Zitat von: RappaSan am 05 August 2016, 08:16:58
Löst sich der Kupferbelag im Boden nicht sehr schnell auf?
Abgesehen davon sind Kupfer-Ionen der Pflanzenwelt nicht sehr zuträglich... die töten nicht nur Pilze ab... zumindest in höherer Konzentration.
Abgesehen davon: Schöner und vor allem preiswerter Sensor.

Von welchem Sensor redest Du?
Meiner ist ein kapazitiver Sensor. Die Metalleile kommen nicht mit dem Boden in Berührung. Der Boden wird als Dielektrikum wie in einem Kondensator betrachtet. Das bedeutet, die Kapazität des Kondensator mit dem Luftspalt zwischen den Elektroden und dem darin eingebrachten Dielektrikum verändert sich mit dem Feuchtigkeitsgehalt. Genau genommen verändert es sich auch mit ein paar Änderungen der Inhaltsstoffe, aber die größte Veränderung ist über die Feuchtigkeit. Hierbei findet kein Ionen-Austausch mit dem Boden statt.

Das ist ein anderes Prinzip als das mit den zwei Drähten im Boden und der Widerstandsmessung. Hierbei würde ein Austausch stattfinden.

sash.sc

Habe auch Interesse an 2 Boden Sensoren. Habe aber nicht die Möglichkeit SMD zu löten. Könntest du das auch übernehmen? Also 2 komplette Sensoren!  Preis?

Gruß Sascha

Gesendet von meinem SM-T560 mit Tapatalk

Raspi 4B+ Bullseye ;LaCrosse; HomeMatic; MapleCUL; ZigBee; Signalduino ESP32 ; Shellys; MQTT2; Grafana mit Influxdb

RappaSan

Hallo tante ju,

ich dachte, daß der rechte Teil der Platine abgetrennt und im Boden versenkt würde.

tante ju

Zitat von: RappaSan am 05 August 2016, 10:09:41
Hallo tante ju,

ich dachte, daß der rechte Teil der Platine abgetrennt und im Boden versenkt würde.

Ja, muß aber isoliert werden (z.B. im Schrumpfschlauch), damit keine leitende Verbindung mit dem Boden hergestellt wird. Dann würde nämlich aus dem C ein R werden und der 555 aufhören zu schwingen.

RappaSan

Alles klar. Kapazitiv. Dann können die Kupferionen nicht entfleuchen. :)