#include <WiFi.h> // ESP32 Core WiFi Library
#include <WiFiUdp.h>
#include <Arduino_SNMP_Manager.h>
#include <Wire.h>
#include <U8g2lib.h>
//************************************
//* Your WiFi info *
//************************************
const char *ssid = "YOUR_NETWORK";
const char *password = "password";
//************************************
// .9" OLED settings
//#define SCREEN_WIDTH 128
//#define SCREEN_HEIGHT 64
//#define OLED_RESET -1
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//************************************
// 1.54" ch1116 Oled setting
U8G2_SH1106_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE);
//************************************
//* SNMP Device Info *
//************************************
IPAddress proxmox(x.x.x.x);
const char *community = "public";
const int snmpVersion = 1; // SNMP v1=0, v2c=1
// OIDs from Proxmox snmpget outputs
const char *oidcputemp = ".1.3.6.1.4.1.8072.1.3.2.3.1.1.8.99.112.117.95.116.101.109.112";
const char *oidmemusage = ".1.3.6.1.4.1.8072.1.3.2.3.1.2.9.109.101.109.95.117.115.97.103.101";
const char *oidcpuusage = ".1.3.6.1.4.1.8072.1.3.2.3.1.1.9.99.112.117.95.117.115.97.103.101";
//************************************
//* SNMP Objects and UDP *
//************************************
WiFiUDP udp;
SNMPManager snmp(community);
SNMPGet snmpRequest(community, snmpVersion);
// Storage buffers for string values
char cpu_temp_buf[32];
char mem_usage_buf[32];
char cpu_usage_buf[32];
char *cpu_temp_ptr = cpu_temp_buf;
char *mem_usage_ptr = mem_usage_buf;
char *cpu_usage_ptr = cpu_usage_buf;
// Callback pointers
ValueCallback *callbackcpu_temp;
ValueCallback *callbackmem_usage;
ValueCallback *callbackcpu_usage;
// Polling interval
unsigned long lastPoll = 0;
int pollInterval = 2000; // 2 seconds
// Convert SNMP string to int
int toInt(char *s) {
if (!s) return 0;
return atoi(s);
}
// Draw horizontal bar graph
void drawBar(int x, int y, int w, int h, int percent) {
int fill = (w * percent) / 100;
u8g2.drawFrame(x, y, w, h); // border
u8g2.drawBox(x, y, fill, h); // fill
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Connecting to WiFi");
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println("\nConnected!");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
/*// Init OLED
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
while(true);
}
display.clearDisplay();
display.display();
*/
// Setup SNMP
snmp.setUDP(&udp);
snmp.begin();
// Register string handlers for each OID
callbackcpu_temp = snmp.addStringHandler(proxmox, oidcputemp, &cpu_temp_ptr);
callbackcpu_temp->overwritePrefix = true;
callbackmem_usage = snmp.addStringHandler(proxmox, oidmemusage, &mem_usage_ptr);
callbackmem_usage->overwritePrefix = true;
callbackcpu_usage = snmp.addStringHandler(proxmox, oidcpuusage, &cpu_usage_ptr);
callbackcpu_usage->overwritePrefix = true;
// Init .9" mini OLED
/* if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 0x3C is common I2C address
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
display.display();
display.setTextSize(1);
display.setCursor(0,0);
display.setTextColor(SSD1306_WHITE);
}*/
// Init OLED sh1116, 128x64
u8g2.begin();
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_ncenB10_tr);
u8g2.drawStr(0, 12, "Initializing...");
u8g2.sendBuffer();
}
void loop() {
// SNMP manager loop to receive responses
snmp.loop();
// Poll interval check
if (millis() - lastPoll >= pollInterval) {
lastPoll = millis();
// Build SNMP request
snmpRequest.addOIDPointer(callbackcpu_temp);
snmpRequest.addOIDPointer(callbackmem_usage);
snmpRequest.addOIDPointer(callbackcpu_usage);
snmpRequest.setIP(proxmox); // target SNMP server
snmpRequest.setUDP(&udp);
snmpRequest.setRequestID(random(1000, 60000));
snmpRequest.sendTo(proxmox);
snmpRequest.clearOIDList();
// Convert string values to int
int cpu_temp_val = toInt(cpu_temp_ptr);
int mem_usage_val = toInt(mem_usage_ptr);
int cpu_usage_val = toInt(cpu_usage_ptr);
// Print values
Serial.printf("CPU TEMP : %d\n", cpu_temp_val);
Serial.printf("Mem Usage : %d\n", mem_usage_val);
Serial.printf("CPU Usage : %d\n", cpu_usage_val);
Serial.println("------------------------");
// Update OLED .9" mini display
/* -----------------------------
display.clearDisplay();
// Line 1: CPU Usage
display.setCursor(0,0);
display.setTextSize(1);
display.printf("CPU %d%%", cpu_usage_val);
drawBar(60, 0, 68, 12, cpu_usage_val); // taller bar for 128x64
// Line 2: MEM Usage
display.setCursor(0,20);
display.printf("MEM %d%%", mem_usage_val);
drawBar(60, 20, 68, 12, mem_usage_val);
// Line 3: CPU Temp
display.setCursor(0, 40);
display.printf("Temp %dC", cpu_temp_val);
display.display();
*/
// -----------------------------
// Update 1.54" OLED sh1116 128x28 display
// -----------------------------
u8g2.clearBuffer();
// Line 1: CPU Usage
u8g2.setCursor(1, 12);
u8g2.print("CPU ");
u8g2.print(cpu_usage_val);
u8g2.print("%");
drawBar(75, 0, 50, 12, cpu_usage_val);
// Line 2: MEM Usage
u8g2.setCursor(1, 30);
u8g2.print("MEM ");
u8g2.print(mem_usage_val);
u8g2.print("%");
drawBar(75, 20, 50, 12, mem_usage_val);
// Line 3: CPU Temp
u8g2.setCursor(1, 50);
u8g2.print("Temp ");
u8g2.print(cpu_temp_val);
u8g2.print("C");
u8g2.sendBuffer();
}
}