Add WiFi matrix connection status sketch

This commit is contained in:
christian 2026-10-24 18:00:23 +02:00
parent 2e0d50b4d4
commit e8a967116c
5 changed files with 187 additions and 0 deletions

View file

@ -143,6 +143,8 @@ samlede enhedsindeks findes i [`devices/`](devices/README.md).
– fast løbetekst på matrixen
- [`wifi_matrix_message_board`](sketches/arduino-uno-r4-wifi/wifi_matrix_message_board)
– browserstyret løbetekst via Wi-Fi
- [`wifi_matrix_status`](sketches/arduino-uno-r4-wifi/wifi_matrix_status) – forbinder
til et hotspot og viser forbindelse samt signalstyrke på LED-matrixen
- [`lcd1602_i2c_demo`](sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo) – effekt-demo
til et eksternt 16×2 HD44780-display med PCF8574 I²C-backpack

View file

@ -51,6 +51,7 @@ kapacitiv touch-hardware, men ingen færdige touchflader på selve boardet.
- [`led_matrix_demo`](../../sketches/arduino-uno-r4-wifi/led_matrix_demo)
- [`led_matrix_scrolling_text`](../../sketches/arduino-uno-r4-wifi/led_matrix_scrolling_text)
- [`wifi_matrix_message_board`](../../sketches/arduino-uno-r4-wifi/wifi_matrix_message_board)
- [`wifi_matrix_status`](../../sketches/arduino-uno-r4-wifi/wifi_matrix_status)
- [`lcd1602_i2c_demo`](../../sketches/arduino-uno-r4-wifi/lcd1602_i2c_demo)
## Kilder

View file

@ -0,0 +1,30 @@
# Wi-Fi-status på LED-matrix
Sketchen forbinder Arduino UNO R4 WiFi til et konfigureret hotspot og viser
forbindelsesstatus på boardets indbyggede 12×8 LED-matrix:
- roterende lys: forbindelsen oprettes;
- flueben og 1–3 søjler: forbundet samt aktuel signalstyrke;
- blinkende prik: sketchen kører fortsat;
- kryds: forbindelsen mislykkedes eller blev afbrudt.
Ved udfald forsøger boardet automatisk at forbinde igen. Serial Monitor ved
115200 baud viser hotspotnavn, IP-adresse, signalstyrke og fejlstatus.
## Wi-Fi-konfiguration
Kopiér `arduino_secrets.example.h` til `arduino_secrets.h`, og indsæt hotspot-
oplysningerne. Den rigtige secrets-fil ignoreres af Git og må ikke committes.
UNO R4 WiFi understøtter 2,4 GHz Wi-Fi.
## Byg og upload
```powershell
arduino-cli compile --fqbn arduino:renesas_uno:unor4wifi sketches/arduino-uno-r4-wifi/wifi_matrix_status
arduino-cli upload -p COM5 --fqbn arduino:renesas_uno:unor4wifi sketches/arduino-uno-r4-wifi/wifi_matrix_status
```
## Afhængigheder
`WiFiS3` og `Arduino_LED_Matrix` følger med Arduino UNO R4 board-pakken; der
kræves ingen ekstra biblioteker.

View file

@ -0,0 +1,6 @@
#pragma once
// Copy this file to arduino_secrets.h and enter the hotspot credentials.
// arduino_secrets.h is ignored by Git and must never be committed.
#define SECRET_SSID "your-hotspot-name"
#define SECRET_PASS "your-hotspot-password"

View file

@ -0,0 +1,148 @@
#include <Arduino_LED_Matrix.h>
#include <WiFiS3.h>
#include "arduino_secrets.h"
constexpr uint8_t ROWS = 8;
constexpr uint8_t COLUMNS = 12;
constexpr unsigned long CONNECT_TIMEOUT_MS = 15000;
constexpr unsigned long RETRY_DELAY_MS = 3000;
constexpr unsigned long STATUS_REFRESH_MS = 500;
ArduinoLEDMatrix matrix;
uint8_t frame[ROWS][COLUMNS] = {};
void clearFrame() {
memset(frame, 0, sizeof(frame));
}
void setPixel(int x, int y, bool on = true) {
if (x >= 0 && x < COLUMNS && y >= 0 && y < ROWS) {
frame[y][x] = on ? 1 : 0;
}
}
void showFrame() {
matrix.renderBitmap(frame, ROWS, COLUMNS);
}
void showConnecting(uint8_t step) {
static const int8_t spinner[][2] = {
{5, 0}, {7, 1}, {9, 2}, {10, 4}, {9, 6}, {7, 7},
{5, 7}, {3, 6}, {1, 5}, {1, 3}, {2, 1}, {4, 0}
};
constexpr uint8_t pointCount = sizeof(spinner) / sizeof(spinner[0]);
clearFrame();
for (uint8_t trail = 0; trail < 4; ++trail) {
const uint8_t index = (step + pointCount - trail) % pointCount;
setPixel(spinner[index][0], spinner[index][1]);
}
showFrame();
}
void showConnected(long rssi, bool heartbeat) {
clearFrame();
// Check mark on the left.
setPixel(0, 4);
setPixel(1, 5);
setPixel(2, 6);
setPixel(3, 5);
setPixel(4, 4);
setPixel(5, 3);
setPixel(6, 2);
// Signal-strength bars on the right.
const uint8_t bars = rssi >= -55 ? 3 : (rssi >= -70 ? 2 : 1);
const uint8_t heights[] = {2, 4, 6};
const uint8_t xPositions[] = {7, 9, 11};
for (uint8_t bar = 0; bar < bars; ++bar) {
for (uint8_t height = 0; height < heights[bar]; ++height) {
setPixel(xPositions[bar], 7 - height);
}
}
// A slow heartbeat shows that the sketch is still running.
setPixel(0, 0, heartbeat);
showFrame();
}
void showFailure() {
clearFrame();
for (uint8_t i = 1; i < 7; ++i) {
setPixel(i + 2, i);
setPixel(10 - i, i);
}
showFrame();
}
bool connectToHotspot() {
Serial.print(F("Forbinder til hotspot: "));
Serial.println(SECRET_SSID);
WiFi.begin(SECRET_SSID, SECRET_PASS);
const unsigned long startedAt = millis();
uint8_t animationStep = 0;
while (WiFi.status() != WL_CONNECTED &&
millis() - startedAt < CONNECT_TIMEOUT_MS) {
showConnecting(animationStep++);
delay(120);
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println(F("Forbindelsen mislykkedes; proever igen om lidt."));
showFailure();
WiFi.disconnect();
delay(RETRY_DELAY_MS);
return false;
}
Serial.println(F("Wi-Fi forbundet."));
Serial.print(F("IP-adresse: "));
Serial.println(WiFi.localIP());
Serial.print(F("Signalstyrke: "));
Serial.print(WiFi.RSSI());
Serial.println(F(" dBm"));
showConnected(WiFi.RSSI(), true);
delay(1200);
return true;
}
void setup() {
Serial.begin(115200);
matrix.begin();
clearFrame();
showFrame();
if (WiFi.status() == WL_NO_MODULE) {
Serial.println(F("Wi-Fi-modulet svarer ikke."));
while (true) {
showFailure();
delay(500);
clearFrame();
showFrame();
delay(500);
}
}
connectToHotspot();
}
void loop() {
static unsigned long lastRefresh = 0;
static bool heartbeat = false;
if (WiFi.status() != WL_CONNECTED) {
connectToHotspot();
return;
}
if (millis() - lastRefresh >= STATUS_REFRESH_MS) {
lastRefresh = millis();
heartbeat = !heartbeat;
showConnected(WiFi.RSSI(), heartbeat);
}
}