
Publicarea software de parți embedded respectiv scheme tehnice şi/sau rezultate cercetări, în regim de acces liber pentru transfer de cunoștințe şi utilizarea acestora în alte proiecte.
Ca si exemple am dat citirea senzorilor ambientali si sol:
#00-SOIL
RD_STS_3LMT= b’\x02\x03\x00\x00\x00\x06\xc5\xfb’#$02$03$00$00$00$06$c5$fb #string citire senzor 485
RD_SCO2R_01= b’\x03\x03\x00\x00\x00\x01\x85\xe8’#$03$03$00$00$00$01$85$e8
RD_SPHAG_RD= b’\x04\x03\x00\x00\x00\x03\x05\x9e’#$04$03$00$00$00$03$05$9e
RD_SCH2H4R_01= b’\x06\x03\x00\x00\x00\x01\x85\xbd’#$06$03$00$00$00$01$85$bd
RD_S7= b’\x07\x03\x00\x00\x00\x07\x04\x6e’#$07$03$00$00$00$07$04$6e
RD_S8IN1= b’\x08\x03\x00\x00\x00\x08\x44\x95’#$08$03$00$00$00$08$44$95 #string citire senzor sol 8in1 pe 485
RD_S4= b’\x09\x03\x00\x00\x00\x04\x45\x41’#$09$03$00$00$00$04$45$41
RD_ALLSOIL_INIT=b’\x0A\x06\x00\x00\x00\x7F\xC9\x51’#$0A$06$00$00$00$7F$C9$51 #oinitializare placa Teros
RD_ALLSOIL_SLP= b’\x0A\x06\x00\x00\x00\x80\x89\x11’#$0A$06$00$00$00$80$89$11
RD_ALLSOIL_RD= b’\x0A\x03\x00\x00\x00\x18\x44\xBB’#$0a$03$00$00$00$18$44$bb #citire de la placa Teros valoare senzori Teros12
#10-SUN
RD_PAS_01= b’\x13\x03\x00\x00\x00\x01\x87\x78′
RD_TSR_02= b’\x14\x03\x00\x00\x00\x01\x86\xcf’
RD_UVS_01= b’\x15\x03\x00\x00\x00\x03\x06\xdf’
RD_W_O_01= b’\x16\x03\x00\x00\x00\x01\x87\x2d’
RD_PSR_01= b’\x17\x03\x00\x00\x00\x01\x86\xfc’
#20-WATER
RD_WPSP01_1= b’\x21\x03\x00\x04\x00\x01\xC2\xAB’
RD_WPSP01_2= b’\x22\x03\x00\x04\x00\x01\xC2\x98′
RD_WPH_IT= b’\x23\x03\x00\x00\x00\x01\x82\x88′
RD_UWLDH3_01= b’\x24\x03\x00\x03\x00\x01\x73\x3f’
#30-AIR
RD_AOTCNN4IN1= b’\x31\x03\x00\x02\x00\x05\x21\xF9′
RD_AOCNOS4IN1= b’\x32\x03\x00\x07\x00\x04\xf0\x0b’ #in manual e RD-AQ4IN1
RD_WSM_ASA= b’\x33\x03\x00\x00\x00\x01\x80\x18′
RD_WDM_ASA= b’\x34\x03\x00\x01\x00\x01\xd0\x6f’
RD_LTH_01= b’\x35\x03\x00\x00\x00\x02\xc0\x7f’
RD_RG15_01= b’\x36\x03\x00\x00\x00\x01\x80\x4D’
#40 – VALVES
#valve1=41, valve2=42… valve8=48 #decala electrovane
import machine
class sensors_485(object):
def __init__(self):
return
def calc_16bit(self,value,pos):
try:
return (value[pos]<<8)|value[pos+1]
except:
return 0
def print_hex(self,value):
print(” „.join(hex(n) for n in value))
#00-SOIL
def rdsts3lmt(self,resp,to_send):
to_send[„soil_hum0”] =self.calc_16bit(resp,3)/10
to_send[„soil_temp0”] =self.calc_16bit(resp,5)/10
to_send[„soil_hum1”] =self.calc_16bit(resp,7)/10
to_send[„soil_temp1”] =self.calc_16bit(resp,9)/10
to_send[„soil_hum2”] =self.calc_16bit(resp,11)/10
to_send[„soil_temp2”] =self.calc_16bit(resp,13)/10
return to_send
def rdsco2r01(self,resp,to_send):
to_send[„soil_coo”] =self.calc_16bit(resp,3)
return to_send
def rdsphagrd(self,resp,to_send):
to_send[„soil_ph”] =self.calc_16bit(resp,3)/100
to_send[„soil_ph_temp”] =self.calc_16bit(resp,7)/10
return to_send
def rdsch2h4r(self,resp,to_send):
to_send[„soil_c2h4”] =self.calc_16bit(resp,3)
return to_send
def rds4(self,resp,to_send):
temp=self.calc_16bit(resp,3)
if temp:
to_send[„soil_humidity”] =temp/10
temp=self.calc_16bit(resp,5)
if temp:
to_send[„soil_temperature”] =temp/100
temp=self.calc_16bit(resp,7)
if temp:
to_send[„soil_ec”] =temp
temp=self.calc_16bit(resp,9)
if temp:
to_send[„soil_salinity”] =temp
return to_send
def rds7(self,resp,to_send):
temp=self.calc_16bit(resp,3)
if temp:
to_send[„soil_temperature”] =temp/10
print(‘Rs7in1Tmp’)
print(temp)
print(resp)
temp=self.calc_16bit(resp,5)
if temp:
to_send[„soil_humidity”] =temp/10
temp=self.calc_16bit(resp,7)
if temp:
to_send[„soil_ec”] =temp
print(‘Rs7in1’)
print(temp)
temp=self.calc_16bit(resp,9)
if temp:
to_send[„soil_salinity”] =temp
temp=self.calc_16bit(resp,11)
if temp:
to_send[„soil_n”] =temp
temp=self.calc_16bit(resp,13)
if temp:
to_send[„soil_p”] =temp
temp=self.calc_16bit(resp,15)
if temp:
to_send[„soil_k”] =temp
return to_send
def rds8in1(self,resp,to_send): #trimite string citire senzor 8in1
temp=self.calc_16bit(resp,5) #scoate valorile din stringul primit de la senzor
if temp: #de la pozitia 5 citeste 2 octeti pentru umiditate sol
to_send[„soil_humidity”] =temp/10 #valoare citita se imparte la 10 ca sa obtii o zecimala
temp=self.calc_16bit(resp,3) #de la pozitia 3 citeste 2 octeti pentru temperatura sol
if temp:
to_send[„soil_temperature”] =temp/10
temp=self.calc_16bit(resp,7) #de la pozitia 7 citeste 2 octeti pentru conductivitate sol
if temp:
to_send[„soil_ec”] =temp
temp=self.calc_16bit(resp,9) #de la pozitia 9 citeste 2 octeti pentru Ph sol
if temp:
to_send[„soil_ph”] =temp/100
temp=self.calc_16bit(resp,11) #de la pozitia 11 citeste 2 octeti pentru continut azot din sol
if temp:
to_send[„soil_n”] =temp
temp=self.calc_16bit(resp,13) #de la pozitia 13 citeste 2 octeti pentru continut phosphor din sol
if temp:
to_send[„soil_p”] =temp
temp=self.calc_16bit(resp,15) #de la pozitia 15 citeste 2 octeti pentru continut potasiu din sol
if temp:
to_send[„soil_k”] =temp
temp=self.calc_16bit(resp,17) #de la pozitia 17 citeste 2 octeti pentru salinitatea din sol
if temp:
to_send[„soil_salinity”] =temp
return to_send
def rdallsoil(self,resp,to_send):
temp=self.calc_16bit(resp,5)
if temp:
to_send[„soil_hum0”] =temp/10
temp=self.calc_16bit(resp,7)
if temp:
to_send[„soil_temp0”] =temp/10
temp=self.calc_16bit(resp,9)
if temp:
to_send[„soil_ec0”] =temp/1000
temp=self.calc_16bit(resp,11)
if temp:
to_send[„soil_hum1”] =temp/10
temp=self.calc_16bit(resp,13)
if temp:
to_send[„soil_temp1”] =temp/10
temp=self.calc_16bit(resp,15)
if temp:
to_send[„soil_ec1”] =temp/1000
temp=self.calc_16bit(resp,17)
if temp:
to_send[„soil_hum2”] =temp/10
temp=self.calc_16bit(resp,19)
if temp:
to_send[„soil_temp2”] =temp/10
temp=self.calc_16bit(resp,21)
if temp:
to_send[„soil_ec2”] =temp/1000
temp=self.calc_16bit(resp,23)
if temp:
to_send[„soil_hum3”] =temp/10
temp=self.calc_16bit(resp,25)
if temp:
to_send[„soil_temp3”] =temp/10
temp=self.calc_16bit(resp,27)
if temp:
to_send[„soil_ec3”] =temp/1000
temp=self.calc_16bit(resp,29)
if temp:
to_send[„soil_hum4”] =temp/10
temp=self.calc_16bit(resp,31)
if temp:
to_send[„soil_temp4”] =temp/10
temp=self.calc_16bit(resp,33)
if temp:
to_send[„soil_ec4”] =temp/1000
temp=self.calc_16bit(resp,35)
if temp:
to_send[„soil_hum5”] =temp/10
temp=self.calc_16bit(resp,37)
if temp:
to_send[„soil_temp5”] =temp/10
temp=self.calc_16bit(resp,39)
if temp:
to_send[„soil_ec5”] =temp/1000
return to_send
#10-SUN
def rdpas01(self,resp,to_send):
to_send[„sun_pas”] =self.calc_16bit(resp,3)
return to_send
def rdtsr02(self,resp,to_send):
to_send[„sun_tsr”] =self.calc_16bit(resp,3)
return to_send
def rduvs01(self,resp,to_send):
to_send[„sun_uvr”] =self.calc_16bit(resp,3)/100
to_send[„sun_uvri”] =self.calc_16bit(resp,5)
to_send[„sun_uvrl”] =self.calc_16bit(resp,7)
return to_send
def rdwo01(self,resp,to_send):
to_send[„sun_ill”] =self.calc_16bit(resp,3)*10
return to_send
def rdpsr01(self,resp,to_send):
to_send[„sun_per”] =self.calc_16bit(resp,3)*10
return to_send
#10-WATER
def rdwpsp011(self,resp,to_send):
to_send[„water_pres1”] =self.calc_16bit(resp,3)/1000
return to_send
def rdwpsp012(self,resp,to_send):
to_send[„water_pres2”] =self.calc_16bit(resp,3)/1000
return to_send
def rdwphit(self,resp,to_send):
to_send[„water_ph”] =self.calc_16bit(resp,3)/100
return to_send
def rduwldh301(self,resp,to_send):
to_send[„water_level”] =self.calc_16bit(resp,3)/1000
return to_send
#30-AIR
def aotcnn4in1(self,resp,to_send):
to_send[„air_co”] =self.calc_16bit(resp,3)/100
to_send[„air_no”] =self.calc_16bit(resp,5)/1000
to_send[„air_noise”] =self.calc_16bit(resp,9)/10
to_send[„air_tvoc”] =self.calc_16bit(resp,11)
return to_send
def aocnos4in1(self,resp,to_send):
to_send[„air_coo”] =self.calc_16bit(resp,3)
to_send[„air_ooo”] =self.calc_16bit(resp,5)/1000
to_send[„air_noo”] =self.calc_16bit(resp,7)/1000
to_send[„air_soo”] =self.calc_16bit(resp,9)/1000
return to_send
def rdwsmasa(self,resp,to_send):
to_send[„air_windspeed”] =self.calc_16bit(resp,3)/100
return to_send
def rdwdmasa(self,resp,to_send):
to_send[„air_winddir”] =self.calc_16bit(resp,3)/10
return to_send
def rdlth01(self,resp,to_send):
to_send[„air_leaftemp”] =self.calc_16bit(resp,3)/10
to_send[„air_leafhum”] =self.calc_16bit(resp,5)/10
return to_send
def rdrg1501(self,resp,to_send):
to_send[„air_rainacc”] =self.calc_16bit(resp,3)
return to_send
Un alt exemplu de cod de cod care este făcut public este metoda de conectare a gatewey lui la platforma Azure, se cauta reteau wifi, apoi urmeaza procedura de autentificare la server modulul are un identificator definit de programator si o cheie de securitate unica generata de platforma Azure layerul de Encryption, Transport Layer Security (TLS1.2/AES-256)
SAS tokenul se schimba o data la 60min , practic ma deconectez si reconectez la fiecare 60 min cu o noua parola ca si securitate.
import time
import machine
import gc
import pycom
import sys
from network import WLAN
import bme280 as bme280
from ina219 import INA219
from gpio import GPIO
from TCA9534 import TCA9534
import module1 as shared
import hondetec
from binascii import hexlify
scope_id=”0ne00357BCB”
#variables used
valves=0
pumps=0
to_send={}
properties={}
errors=””
readingSensors=0
device_id=hexlify(machine.unique_id()).decode(‘utf-8’).upper()
def set_bit(value, bit):
return value | (1<<bit)
def set_2bit(value,bit):
return value | (1<<(bit*2))
def clear_bit(value, bit):
return value & ~(1<<bit)
def clear_2bit(value, bit):
return value & ~(3<<(bit*2))
def get_bit(value,bit):
return (value >> bit)&1
def get_2bit(value, bit):
return (value>>(bit*2))&3
print(„\r\nDevice ID:”)
print(device_id)
update_time=0
wdt = machine.WDT(timeout=2*60*1000)
if device_id==’F008D1CB9C44′:
device_id=’F008D1CB9C90′
if device_id==’F008D1CB9C90′:
key=’KmCcaNBACVVCZBRvQxs5p4HptGtCj5gutoabMmwyfB8=’
update_time=60*1000
if device_id==’F008D1CB9C3C’:
key=’utoovixnImMZEDn5vF8UnZVjj17SDAMb0T22kN3IFX0=’
update_time=10*60*1000
if device_id==’F008D1CB9C44′:
key=’Z/hmvuXUoq1djHD8MYhgY0ZY08LXvF0MnqZoJQ+Ea2o=’
update_time=10*60*1000
if device_id==’F008D1CBAD10′:
key=”
update_time=1000
def calc_16bit(value,pos):
return (value[pos]<<8)|value[pos+1]
#_test_relays = 1
#_test_rs485 = 1
pycom.heartbeat(False)
gc.disable()
print(”)
print(‘Rebooting…’)
pin_i2c_en = machine.Pin(shared.PIN_3V3_SW_EN, mode=machine.Pin.OUT)
pin_i2c_en.value(1)
i2c1 = machine.I2C(1,pins=(shared.PIN_I2C1_SDA,shared.PIN_I2C1_SCL))
i2c2 = machine.I2C(0,pins=(shared.PIN_I2C2_SDA,shared.PIN_I2C2_SCL))
uart = machine.UART(1, baudrate=9600, timeout_chars=10, pins=(shared.PIN_TX1,shared.PIN_RX1))#TXD, RXD, RTS and CTS
timer=machine.Timer.Chrono()
bme = bme280.BME280(i2c=i2c2, address=shared.ADDR_BME280)
ina = INA219(shunt_ohms=shared.INA219_SHUNT_OHMS, i2c=i2c2, max_expected_amps=None, address=shared.ADDR_INA219)
pca = GPIO(i2c=i2c2, address=shared.ADDR_PCA9539)
tca = TCA9534(i2c=i2c1, address=shared.ADDR_TCA9534)
ina.configure()
pca.writeOut(shared.PCA9539_OUT_MASK)
pca.writePolarity(shared.PCA9539_POL_MASK)
pca.writeDirection(shared.PCA9539_DIR_MASK)
pca.setOutHigh(1<<shared.PCA9539_POW_I2C_EXT)
time.sleep_ms(100)
def send_485(str):
pca.setOutHigh(1<<(shared.PCA9539_DIR_RS485))
uart.write(str)
while not (uart.wait_tx_done(1)):
machine.idle()
pca.setOutLow(1<<(shared.PCA9539_DIR_RS485))
time.sleep_ms(200)
resp=”
if uart.any():
resp=uart.read()
return resp
try:
tca.writeOut(0x00)
tca.writeDirection(0x00)
print(„Relay Board (GPIO) connected!”)
except:
tca=0
print(„Relay Board I2C error! (GPIO)”)
try:
i2c1.writeto(shared.ADDR_ADG715,0x00)#all switches in the ADG are off
except:
print(„Relay Board I2C error! (Current Sensing)”)
wlan = WLAN(mode=WLAN.STA, antenna=WLAN.EXT_ANT)
wifi_pass=”
nets = wlan.scan()
for net in nets:
if net.ssid == ‘3-LTE-2888BA’:
wifi_pass=’08rghaq0′
break
if net.ssid == ‘SINTARA’:
wifi_pass=’sintara1′
break
if net.ssid == ‘DIGI-24-Wavelink’:
wifi_pass=’Zu2ZfkYP54′
break
# if net.ssid == ‘XTRATECRO’:
# wifi_pass=’xtec2012′
# break
if net.ssid == ‘SINTARA1’:
wifi_pass=’sintara1′
break
if net.ssid == ‘bzk’:
wifi_pass=’cacacacaca’
break
i=0
print(net.sec)
if wifi_pass != ”:
wlan.connect(net.ssid, auth=(net.sec, wifi_pass), timeout = 20000)
time.sleep(1)
while not wlan.isconnected():
time.sleep_ms(50)
i=i+1
if i == 100:
print(„Could not connect, rebooting in 5s”)
print(net.sec)
machine.reset()
if not wlan.isconnected():
for net in nets:
print(net)
print(„Could not connect, rebooting in 5s”)
time.sleep(5)
machine.reset()
if wlan.ifconfig()[0]==’0.0.0.0′:
time.sleep_ms(500)
if wlan.ifconfig()[0]==’0.0.0.0′:
print(„Did not get a valid IP, rebooting in 5s”)
time.sleep(5)
machine.reset()
print(‘Connected to SSID[{}]. Got IP address: [{}]’.format(net.ssid,wlan.ifconfig()[0]))
rtc = machine.RTC()
rtc.ntp_sync(„pool.ntp.org”)
while not rtc.synced():
machine.idle()
t=rtc.now()
print(‘RTC Set from NTP to UTC: {:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}’.format(t[0], t[1], t[2], t[3], t[4], t[5]))
time.timezone(3*60**2) #we are located at GMT+2, thus 2*60*60
t=time.localtime()
print(‘Adjusted from UTC to RO timezone: {:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}’.format(t[0], t[1], t[2], t[3], t[4], t[5]))
month=t[1]
from iotc import IoTCClient,IoTCConnectType,IoTCLogLevel,IoTCEvents
client=IoTCClient(scope_id,device_id,IoTCConnectType.DEVICE_KEY,key)
client.set_log_level(IoTCLogLevel.ALL)#DISABLED)
def on_properties(name, value):
print(‘Received property {} with value {}’.format(name, value))
return value
def on_commands(command, ack):
ack(command, command.payload)
temp=command.name
global valves, pumps, readingSensors
if (temp[0:3]==’cmd’) and (temp[4]==’_’):
relay=int(temp[3])
cmd=int(temp[5])
if cmd:
if tca !=0:
tca.setOutHigh(1<<(relay-1))
else:
if tca !=0:
tca.setOutLow(1<<(relay-1))
if(temp[0:6]==’valve_’):
while(readingSensors):
pass
v=temp[6]
if(temp[7]==’1′):
resp=send_485(‘v’+v+’1’)
print(„Valve”+v+” ON”)
valves=set_2bit(valves,int(v)-1)
print(valves)
if(temp[7]==’0′):
resp=send_485(‘v’+v+’0’)
print(„Valve”+v+” OFF”)
valves=clear_2bit(valves,int(v)-1)
print(valves)
if(temp[0:5]==’pump_’):
while(readingSensors):
pass
p=temp[5]
if(temp[6]==’1′):
resp=send_485(‘p’+p+’1’)
print(„Pump”+p+” ON”)
pumps=set_2bit(pumps,int(p)-1)
if(temp[6]==’0′):
resp=send_485(‘p’+p+’0’)
print(„Pump”+p+” OFF”)
pumps=clear_2bit(pumps,int(p)-1)
if(temp[0:5]==’RESET’):
time.sleep(5)
machine.reset()
def on_enqueued(command):
print(‘Enqueued Command {}.’.format(command.name))
client.on(IoTCEvents.PROPERTIES, on_properties)
client.on(IoTCEvents.COMMANDS, on_commands)
try: _test_relays
except NameError:
pass
else:
i=1
while 1:
tca.writeOut(i)
i<<=1
time.sleep(5)
if i==0x40 :
i=1
def soil():
#enable all
global errors, to_send, properties
pca.setOutHigh(1<<(shared.PCA9539_J12_1))
time.sleep_ms(50)
pca.setOutLow(1<<(shared.PCA9539_J12_1))
time.sleep_ms(50)
resp=send_485(hondetec.RD_ALLSOIL_INIT)
print(resp)
time.sleep_ms(2000)
resp=send_485(hondetec.RD_STS_3LMT)
if len(resp)>1:
to_send=sen.rdsts3lmt(resp,to_send)
else:
print(‘ID 02 Error’)
# RD_SCO2R_01
resp=send_485(hondetec.RD_SCO2R_01)
if len(resp)>1:
to_send=sen.rdsco2r01(resp,to_send)
else:
print(‘ID 03 Error’)
errors+=”|03″
# RD_SPHAG_RD
resp=send_485(hondetec.RD_SPHAG_RD)
if len(resp)>1:
to_send=sen.rdsphagrd(resp,to_send)
else:
print(‘ID 04 Error’)
errors+=”|04″
# RD_SCH2H4R_01
resp=send_485(hondetec.RD_SCH2H4R_01)
if len(resp)>1:
to_send=sen.rdsch2h4r(resp,to_send)
else:
print(‘ID 06 Error’)
errors+=”|06″
# RD_S7
resp=send_485(hondetec.RD_S7)
if len(resp)>1:
to_send=sen.rds7(resp,to_send)
else:
print(‘ID 07 Error’)
errors+=”|07″
# RD_S8IN1
resp=send_485(hondetec.RD_S8IN1)
if len(resp)>1:
to_send=sen.rds8in1(resp,to_send)
else:
print(‘ID 08 Error’)
errors+=”|08″
# RD_S4
resp=send_485(hondetec.RD_S4)
if len(resp)>1:
to_send=sen.rds4(resp,to_send)
else:
print(‘ID 09 Error’)
errors+=”|09″
# RD_ALLSOIL
time.sleep_ms(2000)
resp=send_485(hondetec.RD_ALLSOIL_RD)
if len(resp)>1:
to_send=sen.rdallsoil(resp,to_send)
else:
print(‘ID 0A Error’)
errors+=”|0A”
# resp=send_485(hondetec.RD_ALLSOIL_SLP)
def sun():
global errors, to_send, properties
#enable all
pca.setOutHigh(1<<(shared.PCA9539_J12_2))
time.sleep_ms(10)
pca.setOutLow(1<<(shared.PCA9539_J12_2))
time.sleep_ms(50)
#RD-PAS-01
resp=send_485(hondetec.RD_PAS_01)
if len(resp)>1:
to_send=sen.rdpas01(resp,to_send)
else:
print(‘ID 13 Error’)
errors+=”|13″
#RD-TSR-02
resp=send_485(hondetec.RD_TSR_02)
if len(resp)>1:
to_send=sen.rdtsr02(resp,to_send)
else:
print(‘ID 14 Error’)
errors+=”|14″
#RD-UVS-01
resp=send_485(hondetec.RD_UVS_01)
if len(resp)>1:
to_send=sen.rduvs01(resp,to_send)
else:
print(‘ID 15 Error’)
errors+=”|15″
#RD-W-O-01
resp=send_485(hondetec.RD_W_O_01)
if len(resp)>1:
to_send=sen.rdwo01(resp,to_send)
else:
print(‘ID 16 Error’)
#RD-PSR-01
resp=send_485(hondetec.RD_PSR_01)
if len(resp)>1:
to_send=sen.rdpsr01(resp,to_send)
else:
print(‘ID 17 Error’)
def water():
global errors, to_send, properties
# RD-WPS-01-1
resp=send_485(hondetec.RD_WPSP01_1)
if len(resp)>1:
to_send=sen.rdwpsp011(resp,to_send)
else:
print(‘ID 21 Error’)
errors+=”|21″
# RD-WPS-01-2
resp=send_485(hondetec.RD_WPSP01_2)
if len(resp)>1:
to_send=sen.rdwpsp012(resp,to_send)
else:
print(‘ID 22 Error’)
errors+=”|22″
# RD-WPH_IT
resp=send_485(hondetec.RD_WPH_IT)
if len(resp)>1:
to_send=sen.rdwphit(resp,to_send)
else:
print(‘ID 23 Error’)
errors+=”|23″
# RD_UWLDH3_01
resp=send_485(hondetec.RD_UWLDH3_01)
if len(resp)>1:
to_send=sen.rduwldh301(resp,to_send)
else:
print(‘ID 24 Error’)
errors+=”|24″
def air():
global errors, to_send, properties
# AOTCNN4IN1
resp=send_485(hondetec.RD_AOTCNN4IN1)
if len(resp)>1:
to_send=sen.aotcnn4in1(resp,to_send)
else:
print(‘ID 31 Error’)
errors+=”|31″
# AOCNOS4IN1
resp=send_485(hondetec.RD_AOCNOS4IN1)
if len(resp)>1:
to_send=sen.aocnos4in1(resp,to_send)
else:
print(‘ID 32 Error’)
errors+=”|32″
# RD_WSM_ASA
resp=send_485(hondetec.RD_WSM_ASA)
if len(resp)>1:
to_send=sen.rdwsmasa(resp,to_send)
else:
print(‘ID 33 Error’)
errors+=”|33″
# RD_WDM_ASA
resp=send_485(hondetec.RD_WDM_ASA)
if len(resp)>1:
to_send=sen.rdwdmasa(resp,to_send)
else:
print(‘ID 34 Error’)
errors+=”|34″
# RD_LTH_01
resp=send_485(hondetec.RD_LTH_01)
if len(resp)>1:
to_send=sen.rdlth01(resp,to_send)
else:
print(‘ID 35 Error’)
errors+=”|35″
# RD_RG15_01
resp=send_485(hondetec.RD_RG15_01)
if len(resp)>1:
to_send=sen.rdrg1501(resp,to_send)
else:
print(‘ID 36 Error’)
errors+=”|36″
pca.setOutHigh(1<<(shared.PCA9539_POW_RS485))
while 1:
if client.is_connected():
client.listen()
if timer.read_ms()>update_time :
pycom.rgbled(0x007f00)
timer.stop()
timer.reset()
timer.start()
#empty values
to_send={}
properties={}
errors=”
#write valve states
properties[„valve_s1”]=get_2bit(valves,0)
if(properties[„valve_s1”]==0):
properties[„valve_s1”]=9
properties[„valve_s2”]=get_2bit(valves,1)
if(properties[„valve_s2”]==0):
properties[„valve_s2”]=9
properties[„valve_s3”]=get_2bit(valves,2)
if(properties[„valve_s3”]==0):
properties[„valve_s3”]=9
properties[„valve_s4”]=get_2bit(valves,3)
if(properties[„valve_s4”]==0):
properties[„valve_s4”]=9
properties[„valve_s5”]=get_2bit(valves,4)
if(properties[„valve_s5”]==0):
properties[„valve_s5”]=9
properties[„valve_s6”]=get_2bit(valves,5)
if(properties[„valve_s6”]==0):
properties[„valve_s6”]=9
properties[„valve_s7”]=get_2bit(valves,6)
if(properties[„valve_s7”]==0):
properties[„valve_s7”]=9
properties[„valve_s8”]=get_2bit(valves,7)
if(properties[„valve_s8”]==0):
properties[„valve_s8”]=9
properties[„pump_s1”]=get_2bit(pumps,0)
if(properties[„pump_s1”]==0):
properties[„pump_s1”]=9
properties[„pump_s2”]=get_2bit(pumps,1)
if(properties[„pump_s2”]==0):
properties[„pump_s2”]=9
#get internal stuff, mark as air stuff for now
to_send[„air_temperature”], to_send[„air_pressure”], to_send[„air_humidity”] = bme.read_compensated_data()
ina.wake()
to_send[„internal_voltage”]=ina.voltage()
to_send[„internal_current”]=ina.current()
ina.sleep()
#get RS485 info
readingSensors=1
sen=hondetec.sensors_485()
#00-SOIL
soil()
#10-SUN
sun()
#20-WATER
water()
#30-AIR
air()
properties[„ERRORS”]=errors
readingSensors=0
conv=timer.read_ms()
properties[„internal_month”]=month
if client.is_connected():
wdt.feed()
client.send_telemetry(to_send)
client.send_property(properties)
else:
print(‘Disconnected!!’)
client.connect()
client.send_telemetry(to_send)
client.send_property(properties)
sent_time=timer.read_ms()
gc.collect()
t=time.localtime()
print(‘[{:04d}-{:02d}-{:02d} {:02d}:{:02d}:{:02d}]: tREAD={:.3f}ms, tSEND={:.3f}ms. Memory available: {:.3f} kB’.format(t[0], t[1], t[2], t[3], t[4], t[5], conv, (sent_time-conv), (gc.mem_free()/1024)))
pycom.rgbled(0x000000)
else:
print(‘Not connected!’)
pycom.rgbled(0x7f0000)
client.connect()
timer.start()
pycom.rgbled(0x000000)
Codul de mai sus este proprietatea firmei SC TETASEYA SRL (fosta SC FRONTIER CONECT SRL).





























































