esp8266.py

from select import poll
from pyb import UART

class ESP8266():
  def __init__(self, server_port=None):
    self.uart = UART(3, 115200)
    self.poller = poll()
    self.poller.register(self.uart, 1)
    self.uart.write('AT\r\n')
    self.uart_read()
    self.uart.write('AT+CWMODE=%s\r\n' % (2 if server_port else 1))
    self.uart_read()
    self.uart.write('AT+CIPMUX=1\r\n')
    self.uart_read()
    if server_port:
      self.uart.write('AT+CIPSERVER=1,%s\r\n' % server_port)
      self.uart_read()
  def uart_read(self, ok_raise=True):
    msg = ''
    attempts = 5
    while attempts >= 0:
      ev = self.poller.poll(1000)
      if len(ev)>0 and self.uart.any():
	msg += self.uart.readall().decode('utf-8')
	if 'OK' in msg: break
      attempts -= 1
    if attempts < 0 and ok_raise: raise Exception('no OK received!')
    return msg
  def send_data(self, cid, data):
    try:
      self.uart.write('AT+CIPSEND=%s,%s\r\n' % (cid, len(data)))
      self.uart.write('%s\r\n' % data)
      return self.uart_read()
    except Exception as e:
      raise Exception('send_exception: %s' % e)
  def get_rs(self, ip, port, data):  # as CLIENT
    self.uart.write('AT+CIPSTART=?\r\n')
    self.uart_read()
    self.uart.write('AT+CIPSTART=4,"TCP","%s",%s\r\n' % (ip, port))
    self.uart_read()
    return self.send_data(4, data)
  def get_rq(self, data_def):  # as SERVER
    rq = self.uart_read(ok_raise=False)
    if '+IPD,' in rq:
      cid = rq[rq.find('+IPD,') + len('+IPD,')]
      self.send_data(cid, data_def(rq))
      self.uart.write('AT+CIPCLOSE=%s\r\n' % cid)
      self.uart_read()
  def __del__(self):
    poller.unregister(self.uart)
    uart.deinit()

esp8266.py (main)

from re import search
from esp8266 import ESP8266

html = """
<html>
<head>
  <link rel="icon" href="#" />
  <meta name="viewport" content="initial-scale=1" />
</head>
<input id="y" type="range" min="-5" max="5" step="1" value="%s"
       style="margin:50px 50px 0 0; transform:rotate(270deg);"
       onchange="update()" />
<input id="x" type="range" min="-5" max="5" step="1" value="%s"
       style="margin-left:150px;"
       onchange="update()" />
<script>
  function update() {
    window.location.href = '?' + document.getElementById('y').value +
                           '&' + document.getElementById('x').value;
  }
</script>
</html>
"""

last_x = last_y = 0

def response(rq):
  global last_x, last_y
  x = search(r'\&-?\d+', rq)
  y = search(r'\?-?\d+', rq)
  last_x = x.group(0)[1:] if x else last_x
  last_y = y.group(0)[1:] if y else last_y
  return html % (last_y, last_x)

server = ESP8266(server_port=1336)
try:
    server.get_rq(response)
  except Exception as e:
    print(e)
del server