#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH110X.h>
#include <SoftwareSerial.h>
// OLED config
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SH1106G display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// UART giao tiếp
SoftwareSerial mySerial(3, 4); // TX = D3, RX = D4
// LED và nút nhấn
const int buttonPin = 2;
const int ledPinSuccess = 7;
const int ledPinSending = 6;
const int ledPinError = 5;
bool lastButtonState = HIGH;
// Hàm tính CRC16 (CRC-CCITT)
uint16_t computeCRC16(const char *data) {
uint16_t crc = 0xFFFF;
while (*data) {
crc ^= (*data++) << 8;
for (int i = 0; i < 8; i++) {
if (crc & 0x8000) crc = (crc << 1) ^ 0x1021;
else crc <<= 1;
}
}
return crc;
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPinSuccess, OUTPUT);
pinMode(ledPinSending, OUTPUT);
pinMode(ledPinError, OUTPUT);
mySerial.begin(9600);
Wire.begin();
// Khởi tạo OLED
if (!display.begin(0x3C, true)) {
while (true); // Treo máy nếu không khởi động được OLED
}
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SH110X_WHITE);
display.setCursor(0, 0);
display.println("USB: Da ket noi");
display.setCursor(0, 10);
display.println("Gui: ");
display.setCursor(0, 20);
display.println("CRC: ");
display.setCursor(0, 30);
display.print("ACK: Chua nhan");
display.display();
}
void loop() {
bool buttonState = digitalRead(buttonPin);
if (buttonState == LOW && lastButtonState == HIGH) {
digitalWrite(ledPinSending, HIGH);
const char *message = "gay";
uint16_t crc = computeCRC16(message);
// Gửi dữ liệu + CRC
mySerial.print(message);
mySerial.print("|"); // Phân cách dữ liệu và CRC
mySerial.print(crc, HEX); // Gửi CRC dưới dạng HEX
mySerial.println();
// Cập nhật thông tin gửi đi
display.setCursor(40, 10); // Sau "Gui: "
display.print(message);
display.setCursor(40, 20); // Sau "CRC: "
display.print("0x");
display.print(crc, HEX);
display.setCursor(0, 30); // Vị trí "ACK: "
display.print("ACK: Chua nhan "); // In đè để xóa nội dung cũ nếu có
display.display();
delay(2000); // Chờ ACK
bool ackReceived = false;
if (mySerial.available() > 0) {
String ack = mySerial.readString();
ackReceived = ack.indexOf("ACK") >= 0;
}
// Cập nhật phần ACK
display.setCursor(0, 30); // Vị trí "ACK: "
if (ackReceived) {
display.print("ACK: Da nhan "); // In đè để xóa nội dung cũ nếu có
digitalWrite(ledPinSuccess, HIGH);
digitalWrite(ledPinError, LOW);
} else {
display.print("ACK: Chua nhan "); // In đè để xóa nội dung cũ nếu có
digitalWrite(ledPinError, HIGH);
digitalWrite(ledPinSuccess, LOW);
}
display.display();
delay(500);
digitalWrite(ledPinSending, LOW);
digitalWrite(ledPinSuccess, LOW);
digitalWrite(ledPinError, LOW);
}
lastButtonState = buttonState;
}
Loading
grove-oled-sh1107
grove-oled-sh1107
Loading
grove-oled-sh1107
grove-oled-sh1107