#include <WiFi.h>
#include <WiFiUdp.h>
#include <U8g2lib.h>
// ===================== KONFIGURACE OLED =====================
#define OLED_SDA 20
#define OLED_SCL 21
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, OLED_SCL, OLED_SDA);
// ===================== KONFIGURACE PINŮ =====================
#define BTN_FORWARD 33 // Tlačítko pro krok vpřed
#define BTN_BACKWARD 34 // Tlačítko pro krok vzad
// ===================== KONFIGURACE WIFI A UDP =====================
#define WIFI_SSID "Astro" // Název Wi-Fi sítě
#define WIFI_PASS "astro" // Heslo k Wi-Fi
WiFiUDP udp;
const int localPort = 12345; // Lokální port pro příjem dat
const char* remoteIp = "192.168.4.1"; // IP zařízení u dalekohledu
const int remotePort = 12346; // Port zařízení u dalekohledu
// ===================== PROMĚNNÉ =====================
char udpBuffer[255]; // Buffer pro přijatá data
unsigned long lastButtonTime = 0; // Čas posledního stisku tlačítka
String lastReceivedData = ""; // Poslední přijatá data
// ===================== FUNKCE =====================
void connectToWiFi() {
Serial.println("Starting Wi-Fi Access Point...");
WiFi.softAP(WIFI_SSID, WIFI_PASS);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IP Address: ");
Serial.println(myIP);
udp.begin(localPort);
}
void updateDisplay() {
u8g2.clearBuffer();
// Nastavení fontů
u8g2.setFont(u8g2_font_ncenB10_tr); // Větší font
u8g2.setCursor(2, 15);
u8g2.print("Pos: ");
int posIndex = lastReceivedData.indexOf("Pos: ");
if (posIndex != -1) {
String position = lastReceivedData.substring(posIndex + 5, lastReceivedData.indexOf(",", posIndex));
u8g2.print(position.c_str());
}
// Menší font pro další údaje
u8g2.setFont(u8g2_font_6x10_mf); // Malý font
int tempIndex = lastReceivedData.indexOf("Temp: ");
if (tempIndex != -1) {
String temp = lastReceivedData.substring(tempIndex + 6, lastReceivedData.indexOf("C", tempIndex));
u8g2.setCursor(2, 40);
u8g2.print("Temp: ");
u8g2.print(temp.c_str());
u8g2.print(" C");
}
int humIndex = lastReceivedData.indexOf("Hum: ");
if (humIndex != -1) {
String humidity = lastReceivedData.substring(humIndex + 5, lastReceivedData.indexOf("%", humIndex));
u8g2.setCursor(2, 50);
u8g2.print("Hum: ");
u8g2.print(humidity.c_str());
u8g2.print(" %");
}
int dewIndex = lastReceivedData.indexOf("Dew: ");
if (dewIndex != -1) {
String dew = lastReceivedData.substring(dewIndex + 5, lastReceivedData.indexOf("C", dewIndex));
u8g2.setCursor(2, 60);
u8g2.print("Dew: ");
u8g2.print(dew.c_str());
u8g2.print(" C");
}
u8g2.sendBuffer();
}
void sendCommand(const char* command) {
udp.beginPacket(remoteIp, remotePort);
udp.print(command);
udp.endPacket();
}
// ===================== SETUP =====================
void setup() {
Serial.begin(115200);
u8g2.begin();
// Startovací obrazovka (5 sekund)
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB10_tr); // Větší font
u8g2.setCursor(2, 15);
u8g2.print("Focus Remote");
u8g2.setFont(u8g2_font_6x10_mf); // Malý font
u8g2.setCursor(2, 25);
u8g2.print("No ASCOM");
u8g2.setCursor(2, 50);
u8g2.print("Jan Filip 2025");
u8g2.setCursor(2, 60);
u8g2.print("v.1.3A");
u8g2.sendBuffer();
delay(5000); // Zobrazení po dobu 5 sekund
// Inicializace tlačítek
pinMode(BTN_FORWARD, INPUT_PULLUP);
pinMode(BTN_BACKWARD, INPUT_PULLUP);
// Připojení k Wi-Fi
connectToWiFi();
}
// ===================== LOOP =====================
void loop() {
// Příjem dat přes UDP
int packetSize = udp.parsePacket();
if (packetSize) {
int len = udp.read(udpBuffer, 255);
if (len > 0) {
udpBuffer[len] = '\0';
}
lastReceivedData = String(udpBuffer);
Serial.println("Data received:");
Serial.println(lastReceivedData);
// Aktualizace OLED s přijatými daty
updateDisplay();
}
// Ovládání tlačítky s debounce
unsigned long currentTime = millis();
if (currentTime - lastButtonTime > 500) { // Debounce 200 - 800 ms
if (digitalRead(BTN_FORWARD) == LOW) {
sendCommand("FORWARD");
Serial.println("Sent: FORWARD");
lastButtonTime = currentTime;
}
if (digitalRead(BTN_BACKWARD) == LOW) {
sendCommand("BACKWARD");
Serial.println("Sent: BACKWARD");
lastButtonTime = currentTime;
}
}
}