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

MT05S представляет собой датчик влажности почвы с интерфейсом 1-Wire, измеряющий влажность почвы, температуру и проводимость. Он герметизирован полимерным пластиковым корпусом с чувствительными стержнями, которые можно вставлять прямо в почву, и характеризуется долговременной стабильностью. Датчик имеет относительно небольшие размеры и может использоваться для горшечных культур и лотков для рассады. Датчик применим для научных исследований, орошения, теплиц, интеллектуального сельского хозяйства и т. д.
Интерфейс шины 1-Wire подобен DS18B20. Это обеспечивает непосредственное подключение к микроконтроллерам, платам Arduino, Raspberry PI или другим модулям с помощью только одного контакта ввода/вывода, при этом никакая другая плата согласования сигналов не требуется, программную библиотеку OneWire для DS18B20 можно использовать для записи/чтения данных из датчика.
Соответствующие схемы подключения датчика влажности почвы MT05S к 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