MoleNet/Auxiliary Boards/Uart-Sdi12 Conversion Board/Code/SDI12.py
2024-09-18 15:25:35 +02:00

64 lines
No EOL
1.9 KiB
Python

#Pins:
#SDI_Marking: 37
#TX: 43
#Rx: 44
#RX_Enable: 36 Pull high to activate RX
#TX_Enable: 35 Pull low to activate TX
#Timing: Enable tx -> 12ms break (pull line high) followed by 8.33ms marking(line low) then data -> in less than 7.5ms enable RX
#https://www.sdi-12.org/current_specification/SDI-12_version-1_4-Jan-30-2021.pdf page 41
#puling optocopler high via Jumper
from machine import UART, Pin
import utime
class SDI12:
def __init__(self):
print("Init SDI12")
#define pins, start with TX activated
self.RX = Pin(44)
self.TX = Pin(43)
self.SDI_Marking = Pin(37, Pin.OUT, value=1)
self.RX_Enable = Pin(36, Pin.OUT, value=0)
self.TX_Enable = Pin(35, Pin.OUT, value=0)
#define UART
self.sdi12 = UART(1, baudrate=1200, bits=7, parity=0, stop=1, tx=self.TX, rx=self.RX, invert=UART.INV_RX)
self.command()
utime.sleep(1)
self.command("0I!")
def write(self, msg):
print("writing")
#enter write mode
self.RX_Enable = Pin(36, Pin.OUT, value=0)
self.TX_Enable = Pin(35, Pin.OUT, value=0)
#12ms break
self.SDI_Marking.value(0)
utime.sleep_ms(13)
#8.33ms marking
self.SDI_Marking.value(1)
utime.sleep_ms(9)
#transmit command
self.sdi12.write(msg)
self.sdi12.flush() #wait for all data to be sent, if errors occur, try utime.sleep_ms(50)
def read(self):
print("reading")
#enter reading mode
self.RX_Enable = Pin(36, Pin.OUT, value=1)
self.TX_Enable = Pin(35, Pin.OUT, value=1)
utime.sleep_ms(500)
#read
response = self.sdi12.read()
print(response)
def command(self, command = "?!"):
#send SDI12 command
self.write(command)
#read sensor answer
self.read()
sdi12 = SDI12()