Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| products:laboratory_iot:exp54 [2020/06/12 09:41] – создано labuser29 | products:laboratory_iot:exp54 [2021/07/21 17:04] (текущий) – [Схема эксперимента] labuser29 | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ===== Эксперимент 54. Управление кладовщиком ===== | ===== Эксперимент 54. Управление кладовщиком ===== | ||
| + | Научим кладовщика двигаться при нажатии на кнопки " | ||
| + | Подключим кнопки к микроконтроллеру. Три кнопки подтянуты к земле, а одна к питанию. Это сделано специально, | ||
| + | |||
| + | ==== Схема эксперимента ==== | ||
| + | |||
| + | {{ : | ||
| + | // | ||
| + | |||
| + | {{ : | ||
| + | // | ||
| + | ==== Программный код эксперимента ==== | ||
| + | |||
| + | <file python Exp54.py[enable_line_numbers=" | ||
| + | from machine import Pin, SPI | ||
| + | from tft import TFT_GREEN | ||
| + | _init() | ||
| + | machine.freq(160000000) | ||
| + | |||
| + | |||
| + | dc = Pin(4, Pin.OUT) #a0 | ||
| + | cs = Pin(2, Pin.OUT) | ||
| + | rst = Pin(5, Pin.OUT) | ||
| + | spi = SPI(1, baudrate=40000000, | ||
| + | |||
| + | |||
| + | # TFT object, this is ST7735R green tab version | ||
| + | tft = TFT_GREEN(128, | ||
| + | |||
| + | Map = [ | ||
| + | [1, | ||
| + | [0, | ||
| + | [1, | ||
| + | [0, | ||
| + | [0, | ||
| + | [1, | ||
| + | [1, | ||
| + | [1, | ||
| + | [1, | ||
| + | [1, | ||
| + | ] | ||
| + | |||
| + | Gates = [] | ||
| + | Boxes = [] | ||
| + | |||
| + | class Box: | ||
| + | def __init__(self, | ||
| + | self.tft = tft | ||
| + | self.x = x | ||
| + | self.y = y | ||
| + | self.picture = ' | ||
| + | self.picture_onGate = ' | ||
| + | self.onGate = False | ||
| + | self.draw() | ||
| + | |||
| + | def draw(self): | ||
| + | if (self.onGate): | ||
| + | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture_onGate) | ||
| + | else: | ||
| + | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
| + | |||
| + | def setOnGate(self, | ||
| + | self.onGate = state | ||
| + | |||
| + | def getOnGate(self): | ||
| + | return self.onGate | ||
| + | |||
| + | def getPos(self): | ||
| + | return (self.x, self.y) | ||
| + | |||
| + | def setPos(self, | ||
| + | self.x = x | ||
| + | self.y = y | ||
| + | self.draw() | ||
| + | |||
| + | class Gate: | ||
| + | def __init__(self, | ||
| + | self.tft = tft | ||
| + | self.x = x | ||
| + | self.y = y | ||
| + | self.picture = ' | ||
| + | self.draw() | ||
| + | |||
| + | def draw(self): | ||
| + | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
| + | |||
| + | def getPos(self): | ||
| + | return (self.x, self.y) | ||
| + | |||
| + | class Man: | ||
| + | def __init__(self, | ||
| + | self.tft = tft | ||
| + | self.x = x | ||
| + | self.y = y | ||
| + | self.picture = ' | ||
| + | self.draw() | ||
| + | |||
| + | def draw(self): | ||
| + | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | ||
| + | |||
| + | def getPos(self): | ||
| + | return (self.x, self.y) | ||
| + | |||
| + | def setPos(self, | ||
| + | self.tft.rect(self.x * 16, self.y * 16, 16, 16, tft.COLOR_BLACK) | ||
| + | self.x = x | ||
| + | self.y = y | ||
| + | self.draw() | ||
| + | |||
| + | |||
| + | class Button: | ||
| + | def __init__(self, | ||
| + | self.pin = Pin(p, Pin.IN) | ||
| + | self.pressSate = pressSate | ||
| + | self.oldState = not pressSate | ||
| + | | ||
| + | def onPress(self): | ||
| + | state = self.pin.value() | ||
| + | if state != self.oldState: | ||
| + | self.oldState = state | ||
| + | if state == self.pressSate: | ||
| + | return True | ||
| + | return False | ||
| + | |||
| + | |||
| + | # init TFT | ||
| + | tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, | ||
| + | tft.clear(tft.COLOR_BLACK) #b, g, r | ||
| + | |||
| + | x = 0 | ||
| + | y = 0 | ||
| + | |||
| + | for row in Map: | ||
| + | for col in row: | ||
| + | if col: | ||
| + | tft.draw_bmp(x * 16, y * 16,' | ||
| + | x+=1 | ||
| + | x=0 | ||
| + | y+=1 | ||
| + | |||
| + | Boxes.append(Box(tft, | ||
| + | Boxes.append(Box(tft, | ||
| + | Boxes.append(Box(tft, | ||
| + | |||
| + | Gates.append(Gate(tft, | ||
| + | Gates.append(Gate(tft, | ||
| + | Gates.append(Gate(tft, | ||
| + | |||
| + | man = Man(tft, 5, 6) | ||
| + | |||
| + | btnUp = Button(16, 1) | ||
| + | btnDown = Button(15, 1) | ||
| + | btnLeft = Button(12, 1) | ||
| + | btnRight = Button(0, 0) | ||
| + | |||
| + | while True: | ||
| + | mPos = man.getPos() | ||
| + | |||
| + | if btnUp.onPress(): | ||
| + | newPos = (mPos[0], mPos[1]-1) | ||
| + | man.setPos(newPos[0], | ||
| + | |||
| + | if btnDown.onPress(): | ||
| + | newPos = (mPos[0], mPos[1]+1) | ||
| + | man.setPos(newPos[0], | ||
| + | |||
| + | if btnLeft.onPress(): | ||
| + | newPos = (mPos[0]-1, mPos[1]) | ||
| + | man.setPos(newPos[0], | ||
| + | |||
| + | if btnRight.onPress(): | ||
| + | newPos = (mPos[0]+1, mPos[1]) | ||
| + | man.setPos(newPos[0], | ||
| + | </ | ||
| + | |||
| + | В код прошлого эксперимента мы добавили класс кнопки, | ||
| + | <code python[enable_line_numbers=" | ||
| + | btnUp = Button(16, 1) | ||
| + | btnDown = Button(15, 1) | ||
| + | btnLeft = Button(12, 1) | ||
| + | btnRight = Button(0, 0) | ||
| + | </ | ||
| + | |||
| + | Добавили бесконечный цикл, в котором постоянно мониторим события нажатия на кнопки: | ||
| + | <code python[enable_line_numbers=" | ||
| + | while True: | ||
| + | mPos = man.getPos() | ||
| + | |||
| + | if btnUp.onPress(): | ||
| + | newPos = (mPos[0], mPos[1]-1) | ||
| + | man.setPos(newPos[0], | ||
| + | |||
| + | if btnDown.onPress(): | ||
| + | newPos = (mPos[0], mPos[1]+1) | ||
| + | man.setPos(newPos[0], | ||
| + | |||
| + | if btnLeft.onPress(): | ||
| + | newPos = (mPos[0]-1, mPos[1]) | ||
| + | man.setPos(newPos[0], | ||
| + | |||
| + | if btnRight.onPress(): | ||
| + | newPos = (mPos[0]+1, mPos[1]) | ||
| + | man.setPos(newPos[0], | ||
| + | </ | ||
| + | |||
| + | При нажатии на кнопку " | ||