Software SINTARA

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).

Strand Neptun Arad, Proiect Sintara

Figura 1: Sistem de drenaj in sort

Figura 2: Pat de sort pentru sistem drenaj

Figura 3: Pat sort pentru sistem drenaj

Figura 4: aspersor irigare

Figura 5: Sistem drenaj pe pat de sort

Figura 6: Sapaturi pentru sistem drenaj

Figura 7: Sistem drenaj pe pat de sort

Figura 8: Conectivitate sistem drenaj la rezervor

Figura 9: Rezervor ingropat

Figura 10: Rezervor apa ingropat unghi diferit

Figura 11: Rezervor apa ingropat conectare sistem colectare apa

Figura 12: Senzori sol

Figura 13: Senzori sol adancime nivele

Figura 14: Imagine cu panouri solare folosite

Figura 15: Panou solar tip floare

Figura 16: Panouri solare folosite plus camin de pompare

Figura 17: Camera video si panou solar rotativ

Figura 18 Senzori ambientali

Figura 19: Generator aer apa

Figura 20: Acoperire camine

Figura 21: Camine bazine

Figura 22: Camin pompe acoperit

Figura 23: Camin pompe

Figura 24: Colectare apa de la stersine

Figura 25: Colectare apa de ploaie de la stresine

Figura 26: Conectare bazine

Figura 27: Conectare bazine

Figura 28: Fantana Foraj

Figura 28: Foraj

Figura 29: Vedere conectare bazine

Figura 30: Pagina login