スマート水族館(バックエンド)のやり方

画像



プロローグ



モスクワで成功を収めている大企業の1つでプログラマーとして働いていた私は、プログラミングスキルの向上を止めず、Udemyプラットフォームでさまざまなコースを受講しました。

もちろん、作者が退屈した後、コースを見て、すべてを繰り返すだけで、当時の無能さでわからない瞬間もありました。あなたはコースの作者が与えるものに基づいてあなたのプロジェクトを作る必要があります-私は思った、そしてもちろん私は正しかった。本当の困難とその解決だけがあなたにかけがえのない経験を与えます、これは本当の学習です。



web , . Full-stack , , , . JavaScript Express, Appolo GraphQL ( , - REST ), Apollo GQL Vue.



, , , , . , , , " ", "The Facebook", "Instagram" .. , , .



, , , ? ...



, 15 3 . , " , , , ". . "" — , , , .



, . - , . - . .



, " " — 20-50 , "" . , (, , , ), , RGB . , . . . . . . , , .



Arduino. , , .





NodeMCU — "" WI-FI (ESP 8266), , Arduino nano wi-fi , .. NodeMCU, .





Arduino IDE ( Windows 10, ), WI-FI. , , . , , Lua( , Micro python, )



, , , C++ Arduino JS Python(). :



init.lua



print ( "Waiting ...")
tmr.register (0, 5000, tmr.ALARM_SINGLE, function (t) tmr.unregister (0); print ( "Starting ..."); dofile ( "main.lua") end)
tmr.start (0)


main.lua



--WiFi Settup
wifi.setmode(wifi.STATION)
local cfg={}
cfg.ssid="wifi_point_name"
cfg.pwd="point_pass"
wifi.sta.config(cfg)
cfg = nil
collectgarbage()

=wifi.ap.getip()


WI-FI , , begin end. esp-8266 , . , Micro python, , lua .



esptool



pip install -g esptool

esptool.py --port COM3 --baud 460800 write_flash --flash_size=detect 0 esp8266-20191220-v1.12.bin


IDE EsPy "" .



, , :



  • boot.py — , . , Wi-Fi WebREPL;
  • main.py — , boot.py, .


WebREPLssh raspberri, , EsPy esptool, . — WI-FI — .



boot.py



import network
import time

'''    WiFi '''
wlan_id = "my_point"
wlan_pass = "strong_pass"

wlan = network.WLAN(network.STA_IF)
wlan.active(True)

if wlan.isconnected() == False:
    wlan.connect(wlan_id, wlan_pass)
    while wlan.isconnected() == False:
        time.sleep(3)
        print("Connection Fail...")
print('Device IP:', wlan.ifconfig()[0])


main.py , , asyncio, ( ).



main.py



from app import app_start

app_start()


MicroPyServer ( ), - ( ). .



app.py



from micropyserver import MicroPyServer

import ujson

server = MicroPyServer()

def send(self, **kwargs):
        '''
             
        '''
        server.send(
            ujson.dumps(kwargs),
            content_type="Content-Type: application/json",
            #    CORS 
            extra_headers=["Access-Control-Allow-Origin: *"]
        )
        gc.collect()

def healthcheck():
    send(success=1, healthcheck='green')

server.add_route("/healthcheck", healthcheck)

def app_start():
    server.start()


() , , . .



  • main.py
  • boot.py
  • app.py
  • micropyserver.py


, http://192.168.1.70/ . , http://192.168.1.70/healthcheck, — ,





// Json from chrome browser
{
    "success": 1,
    "healthcheck": "green",
}


hardware ( , LED-, LCD- .. ), , , . , , .



app.py



from heater import Heater

# ...  

class HttpHelper:
    """
          GET 
    """
    def __init__(self):
        pass

    def parse(self, request):
        '''
               
        '''
        lines = request.split("\r\n")

        result = {
            'lines': lines,
            'method': ure.search("^([A-Z]+)", lines[0]).group(1),
            'path': ure.search(
                "^[A-Z]+\\s+(/[-a-zA-Z0-9_.]*)", lines[0]
            ).group(1),
        }

        param_split = ure.sub("\/([a-z]+_?)+?\?", '', lines[0].split(" ")[1])
        result['params'] = self.get_params(param_split.split("&"))

        return result

    def get_params(self, params_as_array):
        '''
               query 
        '''
        params = {}

        for element in params_as_array:
            splited = element.split("=")

            params[splited[0]] = splited[1]

        return params

    def send(self, **kwargs):
        '''
             
        '''
        server.send(
            ujson.dumps(kwargs),
            content_type="Content-Type: application/json",
            extra_headers=["Access-Control-Allow-Origin: *"]
        )
        gc.collect()

# ...  

def get_water_temperature_C(request):
    '''
           
    '''
    try:
        water_heater.get_water_tmp_C()

        http_helper.send(
            success=1,
            water_temperature_c=water_heater.water_tmp
        )

    except Exception as e:
        print(e)
        http_helper.send(success=0, error=e)

# ...  

server.add_route("/healthcheck", healthcheck)
server.add_route("/get_water_tmp", get_water_temperature_C)

# ...  


heater.py



import machine
import onewire
import ds18x20

HEATER_PIN = 2

class Heater:
    def __init__(self):
        self.water_tmp = 0.00
        self.heater_pin = machine.Pin(HEATER_PIN)
        self.sensor = ds18x20.DS18X20(onewire.OneWire(self.heater_pin))

    def get_water_tmp_C(self):
        rows = self.sensor.scan()

        self.sensor.convert_temp()

        for rom in rows:
            self.water_tmp = self.sensor.read_temp(rom)

        return self.water_tmp


LED . , . 5 :





  • 2
  • 1
  • 1
  • 1


32 , (24V) . , , " ", , , . , . -, , 100% . , .



, API.



LCD , IP , ip . frontend , .







IOT , . MicroPyServer, . , , , try except, .



micropyserver.py



# ...  

def _get_request(self):
        """ Return request body """
        #   4096 ,     MemoryError
        return str(self._connect.recv(1024), "utf8")


:



  • 照明を使って作業を自動化して、彼自身が部屋の照明そのものをチェックし、日没と夜明け、そして夜は月明かりの効果を生み出します。
  • 水分析を自動化する
  • 水加熱を自動化する
  • フローポンプの自動化
  • オートフィーダー
  • 自動入力



All Articles