πŸ”‹ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π²ΠΎΠ»ΡŒΡ‚ΠΌΠ΅Ρ‚Ρ€ Π½Π° Arduino с OLED-дисплССм

Π²ΠΎΠ»ΡŒΡ‚ΠΌΠ΅Ρ‚Ρ€ arduino

πŸ“Ÿ ΠœΠΈΠ½ΠΈΠ°Ρ‚ΡŽΡ€Π½ΠΎΠ΅ устройство для измСрСния напряТСния с графичСским Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ Π΄Π°Π½Π½Ρ‹Ρ…


πŸ“Œ ОписаниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°

Π’ этом ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΌΡ‹ собСрСм простой Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠΉ Π²ΠΎΠ»ΡŒΡ‚ΠΌΠ΅Ρ‚Ρ€ Π½Π° Π±Π°Π·Π΅ Arduino Nano ΠΈ OLED-дисплСя (128×32 пиксСля) ΠΈ (128×64 пиксСля) с интСрфСйсом I2C. Устройство ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ напряТСниС Π² Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π΅ Π΄ΠΎ 5 Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈ Π΄ΠΎ 25 Π²ΠΎΠ»ΡŒΡ‚ с Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ Π½Π° рСзисторах. И красиво ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° дисплСС с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ тСкста ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ. ИзмСнив рСзисторы Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ ΠΈΠ·ΠΌΠ΅Ρ€Π΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΡ‚ΡŒ

Π’Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ всСх Π½Π° ΠΎΠ΄Π½ΠΎΠΈΠΌΡ‘Π½Π½Ρ‹ΠΉ Telegram ΠΊΠ°Π½Π°Π» ΠΈ Ρ‡Π°Ρ‚:
β˜‘οΈ Telegram Канал —-


🧰 Π§Ρ‚ΠΎ потрСбуСтся

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹:

  • Arduino Nano ΠΈΠ»ΠΈ Uno
  • OLED-дисплСй 0.91″ 128×32 I2C (SSD1306)
  • РСзисторы для дСлитСля (Ссли Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ большС 5Π’)
  • ΠœΠ°ΠΊΠ΅Ρ‚Π½Π°Ρ ΠΏΠ»Π°Ρ‚Π° ΠΈ ΠΏΡ€ΠΎΠ²ΠΎΠ΄Π°
  • Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ измСряСмого напряТСния (Π±Π°Ρ‚Π°Ρ€Π΅ΠΉΠΊΠ°, Π‘ΠŸ ΠΈ Ρ‚.Π΄.)

βš™οΈ Π‘Ρ…Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

Π’ΠΎΠ»ΡŒΡ‚ΠΌΠ΅Ρ‚Ρ€ Π½Π° Arduino
OLED ΠΊΠΎΠ½Ρ‚Π°ΠΊΡ‚ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ Arduino
VCC5V
GNDGND
SDAA4
SCLA5

⚠️ Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€, ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚Π΅ Π΅Π³ΠΎ I2C-Π²Ρ‹Π²ΠΎΠ΄Ρ‹!


πŸ’‘ ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ Ρ€Π°Π±ΠΎΡ‚Ρ‹

Arduino считываСт напряТСниС с Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π° A0, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π³ΠΎ Π² Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (ΠΎΡ‚ 0 Π΄ΠΎ 1023) ΠΈ пСрСсчитываСт Π² Π²ΠΎΠ»ΡŒΡ‚Ρ‹. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ отобраТаСтся Π½Π° OLED-дисплСС.


πŸ–₯ Код ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° написана с использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Adafruit_SSD1306 ΠΈ Adafruit_GFX, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Arduino IDE.

#include <Wire.h>                          // Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с I2C
#include <Adafruit_GFX.h>                  // ГрафичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‚ Adafruit
#include <Adafruit_SSD1306.h>              // Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ дисплСя SSD1306

#define SCREEN_WIDTH 128                   // Π¨ΠΈΡ€ΠΈΠ½Π° дисплСя
#define SCREEN_HEIGHT 64                   // Высота дисплСя
#define OLED_RESET -1                      // НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ RESET
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ANALOG_PIN A0                      // Пин, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ напряТСния

// ЗначСния сопротивлСний дСлитСля (Π² ΠΎΠΌΠ°Ρ…)
const float R1 = 100000.0;                 // Π’Π΅Ρ€Ρ…Π½ΠΈΠΉ рСзистор (100 кОм)
const float R2 = 10000.0;                  // НиТний рСзистор (10 кОм)

const float VREF = 5.0;                    // ΠžΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС Arduino (ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ)

float voltage = 0.0;                       // Π˜Π·ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ напряТСниС
float maxVoltage = 0.0;                    // Максимально зафиксированноС напряТСниС

void setup() {
  Serial.begin(9600);                      // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΡ€Ρ‚Π° для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ дисплСя ΠΏΠΎ адрСсу 0x3C
  display.clearDisplay();                 // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° экрана
  splashScreen();                         // Показ привСтствСнного экрана
}

void loop() {
  int analogValue = analogRead(ANALOG_PIN); // Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ значСния (0-1023)

  // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² напряТСниС с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ дСлитСля:
  voltage = (analogValue * VREF / 1023.0) * ((R1 + R2) / R2);

  // ОбновляСм максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
  if (voltage > maxVoltage) {
    maxVoltage = voltage;
  }

  display.clearDisplay();                 // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° дисплСя ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΎΠ²Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ
  drawVoltage(voltage, maxVoltage);      // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
  display.display();                      // ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° содСрТимого
  delay(500);                             // ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ обновлСниями
}

// ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ заставку ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ
void splashScreen() {
  display.clearDisplay();
  display.setTextSize(2);                 // ΠšΡ€ΡƒΠΏΠ½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
  display.setTextColor(SSD1306_WHITE);   // Π‘Π΅Π»Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚
  display.setCursor(10, 10);              // Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора
  display.print("V-Meter");              // Надпись
  display.display();
  delay(2000);                             // ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ заставку 2 сСкунды
}

// Ѐункция для отобраТСния напряТСния ΠΈ ΡˆΠΊΠ°Π»Ρ‹
void drawVoltage(float v, float vmax) {
  display.setTextSize(3);
  display.setCursor(0, 0);
  display.print("V:");
  display.print(v, 2);                    // Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ напряТСниС с 2 Π·Π½Π°ΠΊΠ°ΠΌΠΈ
 
  display.setTextSize(2);
  display.setCursor(0, 45);
  display.print("Max: ");
  display.print(vmax, 1);                // МаксимальноС напряТСниС с 1 Π·Π½Π°ΠΊΠΎΠΌ

  // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ напряТСниС Π² Π΄Π»ΠΈΠ½Ρƒ полосы ΠΎΡ‚ 0 Π΄ΠΎ 128 пиксСлСй
  int barLength = map(v * 10, 0, 250, 0, 128); // (0...25.0Π’ *10 = 250)
  display.fillRect(0, 30, barLength, 10, SSD1306_WHITE); // РисуСм ΡˆΠΊΠ°Π»Ρƒ
}

πŸ›  Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ

  • πŸ”‹ Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ напряТСния ΠΈΠ· рСзисторов, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡ‚ΡŒ Π΄ΠΎ 12Π’, 24Π’ ΠΈ Π²Ρ‹ΡˆΠ΅.
  • πŸ“Š Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π³Ρ€Π°Ρ„ΠΈΠΊ измСнСния напряТСния Π²ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
  • πŸ’Ύ Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сохранСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² EEPROM ΠΈΠ»ΠΈ Π½Π° SD-ΠΊΠ°Ρ€Ρ‚Ρƒ.
  • ⚠️ ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ ΠΏΠΎΡ€ΠΎΠ³Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΈΠ³Π°ΡŽΡ‰ΠΈΠΉ дисплСй).

πŸ“ˆ Как Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚

Π‘ этим Π²ΠΎΠ»ΡŒΡ‚ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ΅:

  • Π‘ΠΎΠ±Ρ€Π°Ρ‚ΡŒ ΡΠ»Π΅ΠΊΡ‚Ρ€ΠΎΠ½Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ с ΠΌΠΎΠ½ΠΈΡ‚ΠΎΡ€ΠΈΠ½Π³ΠΎΠΌ.
  • Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΄Π°Ρ‚Ρ‡ΠΈΠΊ Ρ‚ΠΎΠΊΠ°, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ² Π΅Π³ΠΎ Π² Π°ΠΌΠΏΠ΅Ρ€ΠΌΠ΅Ρ‚Ρ€.
  • ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ с RTC ΠΈ вСсти Π»ΠΎΠ³ напряТСния ΠΏΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.
  • Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ BLE ΠΈΠ»ΠΈ Wi-Fi ΠΌΠΎΠ΄ΡƒΠ»ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° смартфон.


πŸ§ͺ ВСстированиС

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-симуляторС Wokwi. Π’Ρ‹ моТСшь ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ свою Π²Π΅Ρ€ΡΠΈΡŽ схСмы ΠΈ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΏΠ°ΠΉΠΊΠΈ β€” быстро ΠΈ просто!


πŸ“Ÿ Β ΠžΠ±Π½ΠΎΠ²Π»Ρ‘Π½Π½Π°Ρ вСрсия ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ с усрСднСниСм Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°

А Ρ‚Π°ΠΊΠΆΠ΅ с Π½ΠΈΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΌΠΈ возмоТностями ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ


🧠 Π§Π΅ΠΌ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ООП-ΠΏΠΎΠ΄Ρ…ΠΎΠ΄:

  • πŸ”§ Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° β€” ΠΊΠΎΠ΄ дСлится Π½Π° логичСскиС Π±Π»ΠΎΠΊΠΈ (дисплСй, измСрСния ΠΈ Ρ‚.Π΄.)
  • πŸ” ΠœΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ β€” Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π»ΠΎΠ³Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, BLE-ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Ρƒ)
  • πŸ‘Ά ΠŸΠΎΠ½ΡΡ‚Π½ΠΎΡΡ‚ΡŒ β€” Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉ быстрСС ΠΏΠΎΠΉΠΌΡ‘Ρ‚, Π·Π° Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ каТдая Ρ‡Π°ΡΡ‚ΡŒ
  • πŸ“š ΠžΠ±ΡƒΡ‡Π΅Π½ΠΈΠ΅ основам β€” Π²Ρ‹ ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с классами ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ, ΠΊΠ°ΠΊ Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…
#include <Wire.h>                          // Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с I2C
#include <Adafruit_GFX.h>                  // ГрафичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΡ‚ Adafruit
#include <Adafruit_SSD1306.h>              // Π”Ρ€Π°ΠΉΠ²Π΅Ρ€ дисплСя SSD1306

#define SCREEN_WIDTH 128                   // Π¨ΠΈΡ€ΠΈΠ½Π° дисплСя
#define SCREEN_HEIGHT 64                   // Высота дисплСя
#define OLED_RESET -1                      // НС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹ΠΉ RESET
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define ANALOG_PIN A0                      // Пин, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ напряТСния

// ЗначСния сопротивлСний дСлитСля (Π² ΠΎΠΌΠ°Ρ…)
const float R1 = 100000.0;                 // Π’Π΅Ρ€Ρ…Π½ΠΈΠΉ рСзистор (100 кОм)
const float R2 = 10000.0;                  // НиТний рСзистор (10 кОм)

const float VREF = 5.0;                    // ΠžΠΏΠΎΡ€Π½ΠΎΠ΅ напряТСниС Arduino (ΠΌΠΎΠΆΠ½ΠΎ ΡƒΡ‚ΠΎΡ‡Π½ΠΈΡ‚ΡŒ)

float voltage = 0.0;                       // Π˜Π·ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎΠ΅ напряТСниС
float voltage_Sr = 0.0;                     // НапряТСниС для усрСднСния
float maxVoltage = 0.0;                    // Максимально зафиксированноС напряТСниС

void setup() {
  Serial.begin(9600);                      // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΏΠΎΡ€Ρ‚Π° для ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ дисплСя ΠΏΠΎ адрСсу 0x3C
  display.clearDisplay();                 // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° экрана
  splashScreen();                         // Показ привСтствСнного экрана
}

void loop() {
  for(int i=0; i<10; i++){
    int analogValue = analogRead(ANALOG_PIN); // Π‘Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ значСния (0-1023)

    // ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π² напряТСниС с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ дСлитСля:
    // voltage = (analogValue * VREF / 1023.0) * ((R1 + R2) / R2);  // Π‘ Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ 
    voltage = (analogValue * VREF / 1023.0);              // Π‘Π΅Π· дСлитСля
    voltage_Sr = voltage_Sr + voltage;

    // ОбновляСм максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    if (voltage > maxVoltage) {
      maxVoltage = voltage;
    }
    delay(50);
  }
  voltage = voltage_Sr / 10;  // УсрСдняСм
  voltage_Sr = 0.0;   //  ΠžΠ±Π½ΡƒΠ»ΡΠ΅ΠΌ

  display.clearDisplay();                 // ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° дисплСя ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΎΠ²Ρ‹ΠΌ Π²Ρ‹Π²ΠΎΠ΄ΠΎΠΌ
  drawVoltage(voltage, maxVoltage);      // ΠžΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…
  display.display();                      // ΠžΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠ° содСрТимого
  // delay(500);                             // ΠŸΠ°ΡƒΠ·Π° ΠΌΠ΅ΠΆΠ΄Ρƒ обновлСниями
}

// ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ заставку ΠΏΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ
void splashScreen() {
  display.clearDisplay();
  display.setTextSize(2);                 // ΠšΡ€ΡƒΠΏΠ½Ρ‹ΠΉ ΡˆΡ€ΠΈΡ„Ρ‚
  display.setTextColor(SSD1306_WHITE);   // Π‘Π΅Π»Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚
  display.setCursor(10, 10);              // Π‘ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ курсора
  display.print("V-Meter");              // Надпись
  display.display();
  delay(2000);                             // ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ заставку 2 сСкунды
}

// Ѐункция для отобраТСния напряТСния ΠΈ ΡˆΠΊΠ°Π»Ρ‹
void drawVoltage(float v, float vmax) {
  display.setTextSize(3);
  display.setCursor(0, 0);
  display.print("V:");
  display.print(v, 2);                    // Π’Π΅ΠΊΡƒΡ‰Π΅Π΅ напряТСниС с 2 Π·Π½Π°ΠΊΠ°ΠΌΠΈ
 
  display.setTextSize(2);
  display.setCursor(0, 45);
  display.print("Max: ");
  display.print(vmax, 1);                // МаксимальноС напряТСниС с 1 Π·Π½Π°ΠΊΠΎΠΌ

  // ΠŸΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅ΠΌ напряТСниС Π² Π΄Π»ΠΈΠ½Ρƒ полосы ΠΎΡ‚ 0 Π΄ΠΎ 128 пиксСлСй
  int barLength = map(v * 10, 0, 250, 0, 128); // (0...25.0Π’ *10 = 250)
  display.fillRect(0, 30, barLength, 10, SSD1306_WHITE); // РисуСм ΡˆΠΊΠ°Π»Ρƒ
}

πŸ“ Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ:

  • Π½Π°Ρ‡Π°Ρ‚ΡŒ знакомство с Arduino,
  • Π½Π°ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с дисплСями,
  • ΠΎΡΠ²ΠΎΠΈΡ‚ΡŒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°Π½Π°Π»ΠΎΠ³ΠΎΠ²Ρ‹Ρ… сигналов Π² Ρ†ΠΈΡ„Ρ€ΠΎΠ²ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ.

Он прост Π² сборкС, понятСн ΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊΠ°ΠΊ пСрвая «полСзная» самодСлка.

Author: admin

2 thoughts on “πŸ”‹ ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π²ΠΎΠ»ΡŒΡ‚ΠΌΠ΅Ρ‚Ρ€ Π½Π° Arduino с OLED-дисплССм

  1. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ сохранСниС Π΄Π°Π½Π½Ρ‹Ρ… Π² EEPROM ΠΈΠ»ΠΈ Π½Π° SD-ΠΊΠ°Ρ€Ρ‚Ρƒ. Π•ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ скСтч?

    1. Π£ мСня ΠΊ этой схСмС Π΅ΡΡ‚ΡŒ Π΅Ρ‰Ρ‘ Ρ‚Ρ€ΠΈ скСтча. Но всС ΠΎΠ½ΠΈ Π² основном связаны с ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ΠΌ отобраТСния ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π½Π° экранС Π΄ΠΈΠ·Π°ΠΉΠ½ графичСской ΡˆΠΊΠ°Π»Ρ‹ Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΆΠΈΠΌ ΠΏΠ»ΠΎΡ‚Ρ‚Π΅Ρ€Π° построСния Π³Ρ€Π°Ρ„ΠΈΠΊΠ° измСнСния напряТСния ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

      Но ваша идСя Ρ‚ΠΎΠΆΠ΅ интСрСсна я ΠΎ Π½Π΅ΠΉ ΠΏΠΎΠ΄ΡƒΠΌΠ°ΡŽ. Π Π°ΡΠΏΠΈΡˆΠΈΡ‚Π΅ Π΅Ρ‘ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ это Π²Ρ‹ прСдставляСтС всё Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒΡΡ. И ΠΊΠ°ΠΊΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ смысл Π² этих сохранённых значСниях

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Π’Π°Ρˆ адрСс email Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½. ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ поля ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½Ρ‹ *