Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Создание осциллографа на Arduino Nano с дисплеем Nokia 5110 (20 кГц): простое DIY-руководство

Компоненты и материалы

Arduino Nano R3 1
LCD-дисплей Nokia 5110 (PCD8544) 1
Резистор 10 кОм 4
Резистор 4.75 кОм 1
Резистор 330 Ом 1
Таковая кнопка 4

Необходимые инструменты

Приложения и онлайн-сервисы

О проекте

В этом проекте мы создадим простой осциллограф на Arduino. Максимальная частота сигнала — 20 кГц, максимальное входное напряжение — 5 В (без делителя напряжения).

Управление четырьмя кнопками:

Параметры экрана Nokia 5110:

Создание осциллографа на Arduino Nano с дисплеем Nokia 5110 (20 кГц): простое DIY-руководство

Устройство очень простое и состоит из:

Тестировался на синусоидальном и прямоугольном генераторах. Не является профессиональным прибором, но подходит для обучения и тестирования низкочастотных сигналов в лаборатории. Корпус из ПВХ с самосклеющейся обоевой бумагой.

Код

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // CLK, DIN, DC, CE, RST
// VCC +3.3V, BL -> 200 Ом -> 3.3V

int izm, x, y, u, i2, zz, hold, h0, h1, h2, raz = 0, menu, sss = 512, u_dig;
unsigned long time, times;
float per;
byte i;
int data[168] = {};

void setup() {
  Serial.begin(9600);
  display.begin();
  display.clearDisplay();
  display.display();
  display.setContrast(40);
  display.setTextSize(1);
  display.setTextColor(BLACK);
  pinMode(10, INPUT); // +
  pinMode(11, INPUT); // -
  pinMode(12, INPUT); // hold
  pinMode(13, INPUT); // синх
  ADMUX = 0b01000000; // 10 бит, A0
  ADCSRA = 0b11110010; // CLK/4
  analogWrite(9, 127); // PWM на pin 9
}

void loop() {
  // УПРАВЛЕНИЕ КНОПКАМИ
  if (menu == 0) {
    if (digitalRead(10) == HIGH) {
      if (hold == 0) raz++;
      if (hold == 1) i2++;
      delay(100);
    }
    if (digitalRead(11) == HIGH) {
      if (hold == 0) raz--;
      if (hold == 1 && hold > 0) i2--;
      delay(100);
    }
  }
  if (digitalRead(12) == HIGH) { hold++; i2 = 0; delay(100); }
  if (digitalRead(13) == HIGH) { menu++; delay(100); }
  if (hold > 1) hold = 0;
  if (menu > 1 || menu < 0) menu = 0;
  if (raz <= 0) raz = 0;
  if (raz > 8) raz = 8;

  if (menu == 1) {
    hold = 0;
    if (digitalRead(10) == HIGH) { sss += 24; delay(100); }
    if (digitalRead(11) == HIGH) { sss -= 24; delay(100); }
    if (sss > 1023) sss = 1023;
    if (sss < 0) sss = 0;
  }

  display.setCursor(0, 0);

  // РАЗВЁРТКА (калибровка генератором)
  if (raz == 0) { zz = 1; h2 = 2; per = 0.1; }
  if (raz == 1) { zz = 1; h2 = 1; per = 0.2; }
  if (raz == 2) { zz = 12; h2 = 1; per = 0.5; }
  if (raz == 3) { zz = 32; h2 = 1; per = 1; }
  if (raz == 4) { zz = 75; h2 = 1; per = 2; }
  if (raz == 5) { zz = 200; h2 = 1; per = 5; }
  if (raz == 6) { zz = 380; h2 = 1; per = 10; }
  if (raz == 7) { zz = 750; h2 = 1; per = 20; }
  if (raz == 8) { zz = 1900; h2 = 1; per = 50; }

  // СИНХРОНИЗАЦИЯ И ИЗМЕРЕНИЕ
  if (hold == 0 && millis() - time > 0) {
    ads();
    while (izm < sss) { ads(); h0++; if (h0 > 5000) break; }
    h0 = 0;
    times = micros();
    while (i < 167) {
      i++;
      delayMicroseconds(zz);
      ads();
      data[i] = izm;
    }
    i = 0;
    times = micros() - times;
    Serial.println(times);
  }

  // ВЫВОД НА ДИСПЛЕЙ
  if (millis() - time > 100) {
    display.clearDisplay();

    if (sss < 204 && sss > 100) { u_dig = 10; display.setCursor(0, 40); display.print("0.4V"); }
    else if (sss < 100) { u_dig = 5; display.setCursor(0, 40); display.print("0.2V"); }
    else { u_dig = 25; }

    display.setCursor(0, 0);
    while (i < 167) {
      i++;
      setka();
      display.drawLine(i * h2 - i2, 47 - data[i] / u_dig, i * h2 - i2 + h2 - 1, 47 - data[i + 1] / u_dig, BLACK);
    }
    i = 0;
    display.print(per, 1); display.print(" mS ");
    if (menu == 0) {
      if (hold == 1) display.print("HOLD "); else display.print("AUTO ");
    }
    if (menu == 1) {
      display.print(sss / 200.0, 1); display.print(" V ");
      display.drawLine(0, 48 - sss / u_dig, 4, 48 - sss / u_dig, BLACK);
    }
    time = millis();
  }
  display.display();
}

void ads() {
  // 10 бит
  do { ADCSRA |= (1 << ADSC); } while ((ADCSRA & (1 << ADIF)) == 0);
  izm = (ADCL | ADCH << 8);
}

void setka() {
  for (y = 8; y < 47; y += 8) {
    for (x = 0; x < 83; x += 4) display.drawPixel(x, y, BLACK);
  }
  for (x = 0; x < 83; x += 26) {
    for (y = 10; y < 47; y += 4) display.drawPixel(x, y, BLACK);
  }
}

Схемы

Создание осциллографа на Arduino Nano с дисплеем Nokia 5110 (20 кГц): простое DIY-руководство

Производственный процесс

  1. Умные шторы: автоматическое управление светом на Arduino с солнечной энергией
  2. Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
  3. Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
  4. Самодельный осциллограф на Arduino Nano (10 Гц – 50 кГц) с ЖК-дисплеем 128×64
  5. Сборка точного измерительного колеса на Arduino Nano и вращательном энкодере
  6. Простой секундомер на Arduino с кнопкой и EEPROM
  7. DIY Автоматический измеритель емкости (10 пФ – 10 мкФ) на Arduino Nano
  8. Создайте ИИ-компаньона на LCD: интерактивный друг на Arduino
  9. Гальванически разделённый аналоговый вход для Arduino на LM331 и оптопаре 4N25
  10. Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код