Shows available RAM

This commit is contained in:
John Poole 2026-04-03 15:54:08 -07:00
commit ab37d32b6d
4 changed files with 176 additions and 0 deletions

View file

@ -0,0 +1,16 @@
# Exercise 15: RAM
This exercise shows available RAM on the console and on the OLED display on a T-Beam Supreme.
Behavior:
- Reports heap statistics every second over serial.
- Shows live heap status on the OLED display.
- Designed as the first step toward volatile /tmp RAM-backed storage.
Build and upload:
```bash
cd /usr/local/src/microreticulum/microReticulumTbeam/exercises/15_RAM
pio run -e amy -t upload
pio device monitor -b 115200
```

View file

@ -0,0 +1,55 @@
; 20260403 ChatGPT
; Exercise 15_RAM
[platformio]
default_envs = amy
[env]
platform = espressif32
framework = arduino
board = esp32-s3-devkitc-1
monitor_speed = 115200
extra_scripts = pre:scripts/set_build_epoch.py
lib_deps =
Wire
olikraus/U8g2@^2.36.4
build_flags =
-I ../../shared/boards
-I ../../external/microReticulum_Firmware
-D BOARD_MODEL=BOARD_TBEAM_S_V1
-D OLED_SDA=17
-D OLED_SCL=18
-D OLED_ADDR=0x3C
-D ARDUINO_USB_MODE=1
-D ARDUINO_USB_CDC_ON_BOOT=1
[env:amy]
extends = env
build_flags =
${env.build_flags}
-D NODE_LABEL=\"AMY\"
[env:bob]
extends = env
build_flags =
${env.build_flags}
-D NODE_LABEL=\"BOB\"
[env:cy]
extends = env
build_flags =
${env.build_flags}
-D NODE_LABEL=\"CY\"
[env:dan]
extends = env
build_flags =
${env.build_flags}
-D NODE_LABEL=\"DAN\"
[env:ed]
extends = env
build_flags =
${env.build_flags}
-D NODE_LABEL=\"ED\"

View file

@ -0,0 +1,12 @@
import time
Import("env")
epoch = int(time.time())
utc_tag = time.strftime("%Y%m%d_%H%M%S_z", time.gmtime(epoch))
env.Append(
CPPDEFINES=[
("FW_BUILD_EPOCH", str(epoch)),
("FW_BUILD_UTC", '\\"%s\\"' % utc_tag),
]
)

View file

@ -0,0 +1,93 @@
// 20260403 ChatGPT
// Exercise 15_RAM
#include <Arduino.h>
#include <Wire.h>
#include <U8g2lib.h>
#ifndef NODE_LABEL
#define NODE_LABEL "RAM"
#endif
#ifndef OLED_SDA
#define OLED_SDA 17
#endif
#ifndef OLED_SCL
#define OLED_SCL 18
#endif
#ifndef OLED_ADDR
#define OLED_ADDR 0x3C
#endif
static U8G2_SH1106_128X64_NONAME_F_HW_I2C g_oled(U8G2_R0, U8X8_PIN_NONE);
static void oledShowLines(const char *l1,
const char *l2 = nullptr,
const char *l3 = nullptr,
const char *l4 = nullptr,
const char *l5 = nullptr)
{
g_oled.clearBuffer();
g_oled.setFont(u8g2_font_5x8_tf);
if (l1) g_oled.drawUTF8(0, 12, l1);
if (l2) g_oled.drawUTF8(0, 24, l2);
if (l3) g_oled.drawUTF8(0, 36, l3);
if (l4) g_oled.drawUTF8(0, 48, l4);
if (l5) g_oled.drawUTF8(0, 60, l5);
g_oled.sendBuffer();
}
static size_t getAvailableRamBytes()
{
return ESP.getFreeHeap();
}
static void printRamStatus()
{
const size_t freeBytes = getAvailableRamBytes();
const size_t totalBytes = ESP.getHeapSize();
const size_t maxAlloc = ESP.getMaxAllocHeap();
Serial.printf("RAM total=%u free=%u maxAlloc=%u\r\n", (unsigned)totalBytes, (unsigned)freeBytes, (unsigned)maxAlloc);
char line1[32];
char line2[32];
char line3[32];
snprintf(line1, sizeof(line1), "Exercise 15 RAM");
snprintf(line2, sizeof(line2), "Node: %s", NODE_LABEL);
snprintf(line3, sizeof(line3), "Free: %u KB", (unsigned)(freeBytes / 1024U));
char line4[32];
snprintf(line4, sizeof(line4), "Total: %u KB", (unsigned)(totalBytes / 1024U));
char line5[32];
snprintf(line5, sizeof(line5), "Max alloc: %u KB", (unsigned)(maxAlloc / 1024U));
oledShowLines(line1, line2, line3, line4, line5);
}
void setup()
{
Serial.begin(115200);
delay(800);
Serial.println("Exercise 15_RAM boot");
Wire.begin(OLED_SDA, OLED_SCL);
g_oled.setI2CAddress(OLED_ADDR << 1);
g_oled.begin();
oledShowLines("Exercise 15_RAM", "Node: " NODE_LABEL, "Booting...");
delay(1000);
}
void loop()
{
static uint32_t lastMs = 0;
const uint32_t now = millis();
if (now - lastMs < 1000) {
delay(10);
return;
}
lastMs = now;
printRamStatus();
}