Показаны различия между двумя версиями страницы.
Следующая версия | Предыдущая версия | ||
products:laboratory_iot_c:exp54 [2024/12/15 17:31] – создано labuser30 | products:laboratory_iot_c:exp54 [2024/12/15 17:38] (текущий) – [Программный код эксперимента] labuser30 | ||
---|---|---|---|
Строка 14: | Строка 14: | ||
==== Программный код эксперимента ==== | ==== Программный код эксперимента ==== | ||
- | < | + | < |
- | from machine import Pin, SPI | + | #include <SPI.h> |
- | from tft import TFT_GREEN | + | #include < |
- | _init() | + | #include " |
- | machine.freq(160000000) | + | |
+ | #define PIN_CS | ||
+ | #define PIN_DC | ||
+ | #define PIN_RST 5 | ||
- | dc | + | Adafruit_ST7735 tft = Adafruit_ST7735(PIN_CS, |
- | cs = Pin(2, Pin.OUT) | + | LittleFS_ImageReader reader; |
- | rst = Pin(5, Pin.OUT) | + | |
- | spi = SPI(1, baudrate=40000000, | + | |
+ | bool Map[10][8] = { | ||
+ | {1, | ||
+ | {0, | ||
+ | {1, | ||
+ | {0, | ||
+ | {0, | ||
+ | {1, | ||
+ | {1, | ||
+ | {1, | ||
+ | {1, | ||
+ | {1, | ||
+ | }; | ||
- | # TFT object, this is ST7735R green tab version | + | struct Pos { |
- | tft = TFT_GREEN(128, | + | int x = 0; |
+ | int y = 0; | ||
- | Map = [ | + | bool operator |
- | | + | |
- | | + | } |
- | [1, | + | }; |
- | [0, | + | |
- | [0, | + | |
- | [1, | + | |
- | [1, | + | |
- | [1, | + | |
- | [1, | + | |
- | [1, | + | |
- | ] | + | |
- | Gates = [] | + | class Box { |
- | Boxes = [] | + | private: |
+ | Adafruit_ST7735 *tft_ptr; | ||
+ | LittleFS_ImageReader *reader_ptr; | ||
+ | Pos pos; | ||
+ | String picture = "/ | ||
+ | String picture_on_gate | ||
+ | bool on_gate | ||
- | class Box: | + | public: |
- | | + | |
- | | + | |
- | self.x = x | + | |
- | self.y = y | + | pos.x = x; |
- | self.picture | + | pos.y = y; |
- | | + | |
- | self.onGate | + | |
- | self.draw() | + | void draw() { |
+ | if (on_gate) reader_ptr-> | ||
+ | else reader_ptr-> | ||
+ | } | ||
+ | |||
+ | void setOnGate(bool state) { | ||
+ | on_gate = state; | ||
+ | } | ||
+ | | ||
+ | bool getOnGate() const { | ||
+ | return on_gate; | ||
+ | } | ||
+ | |||
+ | Pos getPos() const { | ||
+ | return pos; | ||
+ | } | ||
+ | |||
+ | void setPos(Pos _pos) { | ||
+ | pos.x = _pos.x; | ||
+ | pos.y = _pos.y; | ||
+ | | ||
+ | } | ||
+ | }; | ||
- | def draw(self): | + | class Gate { |
- | if (self.onGate): | + | |
- | | + | |
- | else: | + | LittleFS_ImageReader |
- | self.tft.draw_bmp(self.x * 16,self.y * 16, self.picture) | + | Pos pos; |
+ | | ||
- | def setOnGate(self, state): | + | public: |
- | self.onGate | + | Gate(Adafruit_ST7735 *_tft_ptr, LittleFS_ImageReader *_reader_ptr, |
+ | | ||
+ | reader_ptr = _reader_ptr; | ||
+ | pos.x = x; | ||
+ | pos.y = y; | ||
+ | } | ||
- | | + | |
- | | + | |
+ | } | ||
- | | + | |
- | return | + | return |
+ | } | ||
+ | }; | ||
- | def setPos(self, | + | class Man { |
- | | + | private: |
- | | + | |
- | self.draw() | + | |
+ | Pos pos; | ||
+ | String picture | ||
- | class Gate: | + | public: |
- | | + | |
- | self.tft = tft | + | |
- | self.x = x | + | tft_ptr |
- | self.y = y | + | |
- | | + | pos.x = x; |
- | self.draw() | + | pos.y = y; |
+ | | ||
- | | + | |
- | | + | |
+ | } | ||
- | | + | |
- | return | + | return |
+ | } | ||
- | class Man: | + | void setPos(Pos _pos) { |
- | def __init__(self, tft, x, y): | + | |
- | self.tft = tft | + | pos.x = _pos.x; |
- | self.x = x | + | pos.y = _pos.y; |
- | self.y = y | + | draw(); |
- | | + | } |
- | self.draw() | + | }; |
- | def draw(self): | + | class Button { |
- | | + | private: |
+ | int pin; | ||
+ | bool pressState; | ||
+ | bool oldState; | ||
+ | |||
+ | public: | ||
+ | Button(int _pin, bool _pressState) { | ||
+ | pin = _pin; | ||
+ | setPinMode(); | ||
+ | pressState = _pressState; | ||
+ | oldState = not _pressState; | ||
+ | } | ||
+ | |||
+ | bool onPress() { | ||
+ | bool state = digitalRead(pin); | ||
+ | if (state != oldState){ | ||
+ | | ||
+ | if (state == pressState) return true; | ||
+ | } | ||
+ | return false; | ||
+ | } | ||
- | | + | |
- | | + | |
+ | } | ||
+ | }; | ||
- | def setPos(self, x, y): | + | const int boxes_number = 3; |
- | self.tft.rect(self.x * 16, self.y * 16, 16, 16, tft.COLOR_BLACK) | + | Box boxes[boxes_number] = { |
- | | + | {&tft, & |
- | self.y = y | + | |
- | | + | |
+ | }; | ||
+ | const int gates_number = 3; | ||
+ | Gate gates[gates_number] = { | ||
+ | {&tft, & | ||
+ | {&tft, & | ||
+ | {&tft, & | ||
+ | }; | ||
- | class Button: | + | Man man(&tft, &reader, 5, 6); |
- | def __init__(self, p, pressSate): | + | |
- | 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 | + | |
+ | Button btn_up(16, HIGH); | ||
+ | Button btn_down(15, | ||
+ | Button btn_left(12, | ||
+ | Button btn_right(0, | ||
- | # init TFT | + | void setup() { |
- | tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, | + | |
- | tft.clear(tft.COLOR_BLACK) #b, g, r | + | Serial.println(); |
+ | Serial.println(" | ||
+ | LittleFS.begin(); | ||
+ | | ||
+ | tft.setRotation(2); | ||
+ | | ||
- | x = 0 | + | for (int y = 0; y < 10; y++) { |
- | y = 0 | + | for (int x = 0; x < 10; x++) { |
+ | if (Map[y][x]) reader.drawBMP("/ | ||
+ | } | ||
+ | } | ||
- | for row in Map: | + | |
- | | + | |
- | if col: | + | } |
- | tft.draw_bmp(x * 16, y * 16,' | + | |
- | | + | |
- | x=0 | + | |
- | y+=1 | + | |
- | Boxes.append(Box(tft, 3,4)) | + | for (int i = 0; i < gates_number; |
- | Boxes.append(Box(tft, 4,6)) | + | |
- | Boxes.append(Box(tft, 2,7)) | + | } |
+ | |||
+ | man.draw(); | ||
- | Gates.append(Gate(tft, 6,3)) | + | btn_left.setPinMode(); |
- | Gates.append(Gate(tft, | + | } |
- | Gates.append(Gate(tft, | + | |
- | man = Man(tft, 5, 6) | + | void loop() { |
+ | Pos man_pos | ||
- | btnUp = Button(16, 1) | + | if (btn_up.onPress()) man.setPos({man_pos.x, man_pos.y - 1}); |
- | btnDown = Button(15, 1) | + | if (btn_down.onPress()) man.setPos({man_pos.x, man_pos.y + 1}); |
- | btnLeft = Button(12, 1) | + | if (btn_left.onPress()) man.setPos({man_pos.x - 1, man_pos.y}); |
- | btnRight = Button(0, 0) | + | if (btn_right.onPress()) man.setPos({man_pos.x + 1, man_pos.y}); |
- | + | } | |
- | while True: | + | |
- | mPos = man.getPos() | + | |
- | + | ||
- | if btnUp.onPress(): | + | |
- | newPos = (mPos[0], mPos[1]-1) | + | |
- | | + | |
- | + | ||
- | | + | |
- | newPos = (mPos[0], mPos[1]+1) | + | |
- | | + | |
- | + | ||
- | | + | |
- | newPos = (mPos[0]-1, mPos[1]) | + | |
- | | + | |
- | + | ||
- | | + | |
- | newPos = (mPos[0]+1, mPos[1]) | + | |
- | | + | |
</ | </ | ||
В код прошлого эксперимента мы добавили класс кнопки, | В код прошлого эксперимента мы добавили класс кнопки, | ||
- | < | + | < |
- | btnUp = Button(16, | + | Button |
- | btnDown = Button(15, | + | Button |
- | btnLeft = Button(12, | + | Button |
- | btnRight = Button(0, | + | Button |
</ | </ | ||
- | Добавили | + | В класс Button мы добавили |
- | < | + | < |
- | while True: | + | btn_left.setPinMode(); |
- | 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(): | + | В бесконечном цикле постоянно мониторим события нажатия на кнопки: |
- | | + | <code arduino[enable_line_numbers=" |
- | man.setPos(newPos[0], newPos[1]) | + | Pos man_pos = man.getPos(); |
- | | + | |
- | | + | |
- | man.setPos(newPos[0], newPos[1]) | + | if (btn_left.onPress()) |
+ | if (btn_right.onPress()) man.setPos({man_pos.x + 1, man_pos.y}); | ||
</ | </ | ||
При нажатии на кнопку " | При нажатии на кнопку " |