цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Работа Arduino / ESP32 / Raspberry PI с датчиком влажности почвы по одному проводу


Работа Arduino / ESP32 / Raspberry PI с датчиком влажности почвы по одному проводу

Автор: Mike(admin) от 17-11-2021, 03:55

В данном проекте будет показано, как использовать однопроводный (1-Wire) датчик влажности почвы MT05S с Arduino, ESP32 и Raspberry Pi, используя только одну линию ввода/вывода.


Работа Arduino / ESP32 / Raspberry PI с датчиком влажности почвы по одному проводу

MT05S представляет собой датчик влажности почвы с интерфейсом 1-Wire, измеряющий влажность почвы, температуру и проводимость. Он герметизирован полимерным пластиковым корпусом с чувствительными стержнями, которые можно вставлять прямо в почву, и характеризуется долговременной стабильностью. Датчик имеет относительно небольшие размеры и может использоваться для горшечных культур и лотков для рассады. Датчик применим для научных исследований, орошения, теплиц, интеллектуального сельского хозяйства и т. д.


Интерфейс шины 1-Wire подобен DS18B20. Это обеспечивает непосредственное подключение к микроконтроллерам, платам Arduino, Raspberry PI или другим модулям с помощью только одного контакта ввода/вывода, при этом никакая другая плата согласования сигналов не требуется, программную библиотеку OneWire для DS18B20 можно использовать для записи/чтения данных из датчика.


Соответствующие схемы подключения датчика влажности почвы MT05S к Arduino, ESP32 и Raspberry Pi приведены далее.


Работа Arduino с датчиком влажности почвы по одному проводу

Работа ESP32 с датчиком влажности почвы по одному проводу

Работа Raspberry PI с датчиком влажности почвы по одному проводу

На макетной плате такие схемы могут иметь следующий вид.


Работа Arduino с датчиком влажности почвы по одному проводу

Работа ESP32 с датчиком влажности почвы по одному проводу

Работа Raspberry PI с датчиком влажности почвы по одному проводу

Далее приведен код для Arduino и ESP32 в Arduino IDE. Не забудьте с помощью менеджера библиотек найти и загрузить библиотеку однопроводного интерфейса OneWire.



#include <OneWire.h>

#define TEST_MT05S_ONEWIRE_CONVERT_T            1

OneWire  ds(2);  

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  Serial.println("//-------------------------");
  Serial.println("// Start Testing MT05S     ");
  Serial.println("//-------------------------");
  uint8_t i;

#ifdef TEST_MT05S_ONEWIRE_CONVERT_T

  Serial.print("Test Function Command- Convert T [0x44]  & Read Scratchpad [0xBE]: \n");
  byte scratchpad[9];

  Serial.print("Convert T [0x44]: ");
  ds.reset();
  ds.skip();
  ds.write(0x44);

  while(ds.read_bit() == 0)
  {
    delay(10);
    Serial.print(".");
  }
  Serial.print("Conversion Done\n");

  Serial.print("Read Scratchpad [0xBE]: ");
  ds.reset();
  ds.skip();
  ds.write(0xBE);
  for (int i = 0; i < 9; i++) {
    scratchpad[i] = ds.read();
  }
  for (int i = 0; i < 9; i++) {
    Serial.print(scratchpad[i],HEX);
    Serial.print(" ");
  }
  Serial.print(" CrcCalculated=");
  Serial.print(OneWire::crc8(scratchpad, 8),HEX);
  Serial.println();

  if(OneWire::crc8(scratchpad, 8) == scratchpad[8])
  {
    int16_t temperature = makeWord(scratchpad[0],scratchpad[1]);
    int16_t moisture = makeWord(scratchpad[2],scratchpad[3]);
    int16_t conductivity = makeWord(scratchpad[4],scratchpad[5]);
    Serial.print("TEMP(C) = "); Serial.print(temperature/100.00);
    Serial.print("  MOISTURE(%) = "); Serial.print(moisture/100.00);
    Serial.print("  CONDUCTIVITY(ms/cm) = "); Serial.print(conductivity/1000.00);
    Serial.print("  CONFIG0 = "); Serial.print(scratchpad[6],HEX);
    Serial.print("  CONFIG1 = "); Serial.print(scratchpad[7],HEX);
    Serial.print("  CRC8 = "); Serial.print(scratchpad[8],HEX);
  }
  else
  {
    Serial.print("CRC ERROR!");
  }
  Serial.print("\n\n");
  
  delay(1000);
#endif
}

Далее приведен код для Raspberry Pi.



#!/usr/bin/python3
import os,time

ROMCODE='28-060504030201'
device_file ='/sys/bus/w1/devices/'+ROMCODE+'/w1_slave'
print("//----------------------------------------------------------------");
print("// Start Testing MT05S");
print("// Rom Code= " + ROMCODE);
print("// Change ROM CODE FOR YOUR SENSOR !!!!!!");
print("//----------------------------------------------------------------");

def read_raw():
    f = open(device_file,'r')
    lines = f.readlines()
    f.close()
    return lines

def read_mt05s():
    lines = read_raw()
    while lines[0].strip()[-3:] != 'YES':
        print('Incorrect Data')
        time.sleep(0.2)
        lines = read_raw()
    byteList = lines[1].rsplit((' '))
    if len(byteList) >9 :
        soilTempHi8=int(byteList[0], 16)
        soilTempLo8=int(byteList[1], 16)
        soilTemp = soilTempHi8*256+soilTempLo8

        soilMoistureHi8=int(byteList[2], 16)
        soilMoistureLo8=int(byteList[3], 16)
        soilMoisture = soilMoistureHi8*256+soilMoistureLo8

        soilECHi8=int(byteList[4], 16)
        soilECLo8=int(byteList[5], 16)
        soilEC = soilECHi8*256+soilECLo8
    return [ soilTemp, soilMoisture, soilEC  ]

while True:
    values = read_mt05s()
    print('Soil Temp(C)= %.2f  Moisture(%%)= %.2f  EC(ms/cm)= %.3f' %(values[0]/100.0,  values[1]/100.0,  values[2]/1000.0))
    time.sleep(1)



© digitrode.ru


Теги: Arduino, ESP32, Raspberry Pi, 1-Wire, датчик влажности




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий