diff --git a/src/alarm.py b/src/alarm.py new file mode 100644 index 0000000..75eca7d --- /dev/null +++ b/src/alarm.py @@ -0,0 +1,13 @@ +import board +import pulseio + +alm = pulseio.PWMOut(board.GP1,frequency=2200,duty_cycle=0) + +def alarm(action=True): + if action: + alm.duty_cycle = 6500 + else: + alm.duty_cycle = 0 + +if __name__ == "__main__": + alarm() \ No newline at end of file diff --git a/src/boot.py b/src/boot.py new file mode 100644 index 0000000..607209a --- /dev/null +++ b/src/boot.py @@ -0,0 +1,2 @@ +import storage +storage.remount("/", readonly=False) diff --git a/src/code.py b/src/code.py new file mode 100644 index 0000000..e0d1202 --- /dev/null +++ b/src/code.py @@ -0,0 +1,141 @@ +import time +from smoke import mesure_smoke +from drop import mesure_drop +from temperature import mesure_temp +from electricity import mesure_electricity +from erequest import check_netstatus,postdata,rt,eth_init,check_time,get_data,post_data +from alarm import alarm +from light import flash_led +from led import show_num +from config import SERVER_URL,MAX_ALM,TIMESPAN,A_FIRE,A_TEMP,A_HUM,SN +import board +import digitalio +import microcontroller + +btn = digitalio.DigitalInOut(board.GP0) +btn.direction = digitalio.Direction.INPUT + +def make_alarm(errcode): + global MAX_ALM + if MAX_ALM and errcode < 7: + alarm(True) + flash_led('alarm') + else: + flash_led('alarm') + alarm(False) + +def stay_normal(): + alarm(False) + flash_led('normal') + +def button_handle(): + global MAX_ALM + if btn.value == True and MAX_ALM == True: + MAX_ALM = False + elif btn.value == True and MAX_ALM == False: + # recover to alarm + MAX_ALM = True + +def update_config(cmd, param): + try: + with open('config.py','r') as f: + cfgstr = f.read() + cmdbegin = cfgstr.find(cmd) + cmdend = cfgstr[cmdbegin:].find('\r\n') + if cmdend < 0: + cmdend = cfgstr[cmdbegin:].find('\n') + newstr = cfgstr.replace(cfgstr[cmdbegin:cmdbegin+cmdend],cmd+'='+param) + with open('config.py','w') as f2: + f2.write(newstr) + return True + except: + return False + +def env_detect(): + global rt + errno = 0 # error code + conn = True + if not eth_init(): + time.sleep(5) + microcontroller.reset() + if check_netstatus == 1: + errono = 1 + show_num(errono) + conn = False + time.sleep(600) + microcontroller.reset() + return None + try: + check_time() + except: + errono = 1 + show_num(errno) + em = sm = dm = 0 + tm = [0,0] + sm = mesure_smoke() + if sm > A_FIRE: + show_num(10) + time.sleep(180) # wait smoke sensor to get ready + begin_time = time.monotonic() # for counting timespan + while True: + i = 0 + button_handle() + try: + em = mesure_electricity() + sm = mesure_smoke() + dm = mesure_drop() + tm = mesure_temp() + while tm[0] == 0 and i < 5: + tm = mesure_temp() + i += 1 + except: + errno = 8 # measure fail + if sm > A_FIRE: + errno = 6 # fire alarm + elif dm == True: + errno = 5 # water drop alarm + elif em == False: + errno = 4 # power off + elif tm[0] > A_TEMP: + errno = 2 # hot temperature + elif tm[1] > A_HUM: + errno = 3 # high humidity + elif conn == False: + errno = 7 + else: + errno = 0 + data = {"sn":SN, "errno":errno, "electricity":em, "fire":sm, "water":dm, "temperature":tm[0], "humidity":tm[1]} + print(data) + if (time.monotonic()-begin_time)/60 >= TIMESPAN: + try: + post_data(SERVER_URL+'/env/api/',data) + conn = True + except: + errno = 7 # Sending data fail + time.sleep(2) + conn = False + microcontroller.reset() + begin_time = time.monotonic() + show_num(errno) + if errno == 0: + stay_normal() + else: + make_alarm(errno) + if rt.datetime[4] == 0 and rt.datetime[5] < 5: + microcontroller.reset() + time.sleep(3) + try: + cmddata = {'spot':SN} + cmd = get_data(SERVER_URL+'/env/cmd/',cmddata) + if cmd and cmd.count('$')==1: + cmdlist = cmd.split('$') + if not cmdlist[1]: + microcontroller.reset() + if update_config(cmdlist[0],cmdlist[1]): + microcontroller.reset() + except: + pass + +if __name__ == '__main__': + env_detect() + diff --git a/src/config.py b/src/config.py new file mode 100644 index 0000000..12432b9 --- /dev/null +++ b/src/config.py @@ -0,0 +1,13 @@ +SERVER_URL='http://172.18.17.136:8000' +IP_ADDR='2.50.41.115' +MAC_ADDR='de:ad:be:82:31:10' +NET_MASK='255.255.255.128' +GATEWAY='2.50.41.1' +DNS='114.114.114.114' +SN='WJSPJ001' +SECRET='@This is a Secret $tr!' +MAX_ALM=True # alarm sound +TIMESPAN=5 # minute +A_FIRE=18000 # fire alarm trigger number +A_TEMP=32.0 +A_HUM=75.0 \ No newline at end of file diff --git a/src/drop.py b/src/drop.py new file mode 100644 index 0000000..ce7d703 --- /dev/null +++ b/src/drop.py @@ -0,0 +1,19 @@ +import board +import digitalio +import time + +dropio = digitalio.DigitalInOut(board.GP9) +dropio.direction = digitalio.Direction.INPUT + +def mesure_drop(): + try: + # print(dropio.value) + return dropio.value + except: + return 0 + +if __name__ == "__main__": + while True: + # print(dropio.value) + time.sleep(1) + print(mesure_drop()) \ No newline at end of file