Кодты іздеу

Ардуино коды және HC-SR04 ультрадыбыстық қашықтық сенсоры мен SSD1306 OLED дисплейіне арналған бейне

Ардуино коды және HC-SR04 ультрадыбыстық қашықтық сенсоры мен SSD1306 OLED дисплейіне арналған бейне

Бұл оқулықта біз HC-SR04 ультрадыбыстық қашықтық сенсорын SSD1306 OLED дисплейімен бірге қашықтық өлшемдерін көрнекі түрде көрсету үшін қалай пайдалану керектігін көрсетеміз. Бұл жоба компьютерсіз қашықтықты өлшеуге мүмкіндік береді, бұл оны робототехниканы қоса алғанда, әртүрлі қолданбалар үшін өте қолайлы етеді. Осы жобаның соңында сізде OLED экранында қашықтық көрсеткіштерін тікелей көрсететін функционалды құрылғы болады.

How HC-SR04 ulrasonic sensor work
SSD1306 OLED display

Әрі қарай, мен екі компонент үшін қажетті сым қосылымдарын түсіндіремін және осы компоненттерді біріктіретін Arduino кодын қадамдап түсіндіремін. Бұл сенсордың қашықтықты қалай өлшейтінін және сол деректерді OLED дисплейіне қалай шығару керектігін түсінуге көмектеседі. Қосымша түсініктеме алу үшін осы оқулыққа қатысты бейнені қарауға болады (бейнеде 00:00).

Аппараттық құралдар түсіндірмесі

Бұл жобаның негізгі компоненттері HC-SR04 ультрадыбыстық қашықтық сенсоры және SSD1306 OLED дисплейі болып табылады. HC-SR04 ультрадыбыстық дыбыс толқындарын пайдаланады; ол триггер түйреуіші арқылы дыбыс импульсін шығарады және эхо түйреуішіндегі жаңғырықты тыңдайды. Дыбыстың қайту уақытын есептеу арқылы ол нысанға дейінгі қашықтықты анықтай алады. Бұл сенсор қысқа қашықтықты өлшеу үшін өте тиімді, әдетте 400-500 см-ге дейін.

SSD1306 OLED дисплейі - бұл мәтін мен графиканы көрсетуге мүмкіндік беретін I2C интерфейсті дисплей. Ол екі түйреуіш арқылы байланысады: SDA (деректер желісі) және SCL (сағат желісі). Біздің құрылғыда бұл түйреуіштер Arduino-ның белгілі бір түйреуіштеріне қосылады, бұл оңай интеграция мен басқаруға мүмкіндік береді.

Деректер парағының мәліметтері

ӨндірушіӘртүрлі
Бөлшек нөміріHC-SR04
Логика/IO кернеуі5 В
Қоректендіру кернеуі5 В
Шығыс тогы (арнаға)15 мА
Ең жоғары ток (арнаға)20 мА
PWM жиілігі бойынша нұсқауЖоқ
Кіріс логикалық шектері0.3*Vcc - 0.7*Vcc
Кернеу төмендеуі / RDS(on) / қанығуЖоқ
Жылулық шектер0-70 °C
Қаптама4 түйреуішті модуль
Ескертулер / нұсқаларСтандартты модуль

  • Екі компонент үшін де дұрыс қоректендіруді (5 В) қамтамасыз етіңіз.
  • I2C байланысы үшін қажет болса, жоғары тарту резисторларын пайдаланыңыз.
  • Кедергілерді болдырмау үшін триггер мен эхо желілерін қысқа ұстаңыз.
  • Дәл көрсеткіштер алу үшін ультрадыбыстық сенсордың бағытын тексеріңіз.
  • Механикалық дірілдерді болдырмау үшін дисплей үшін тұрақты бетті пайдаланыңыз.

Сым қосылым нұсқаулары

Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED

HC-SR04 ультрадыбыстық сенсорын қосу үшін алдымен VCC түйреуішін (әдетте қызыл) Arduino-дағы 5V түйреуішіне қосыңыз. Содан кейін GND түйреуішін (әдетте қара немесе сары) Arduino-ның GND түйреуіштерінің біріне қосыңыз. Триггер түйреуіші (көбінесе көк) Arduino-дағы 12 цифрлық түйреуішке, ал эхо түйреуіші (әдетте жасыл) 11 цифрлық түйреуішке қосылуы керек.

SSD1306 OLED дисплейі үшін VCC түйреуішін Arduino-дағы 5V түйреуішіне және GND түйреуішін GND-ге қосыңыз. SCL түйреуіші A5 түйреуішіне, ал SDA түйреуіші Arduino-дағы A4 түйреуішіне қосылуы керек. Егер сіз арнайы I2C түйреуіштері бар басқа Arduino үлгісін пайдалансаңыз, дисплейді тікелей сол түйреуіштерге қосыңыз.

Код мысалдары мен түсіндірме

Орнату функциясында біз дисплей мен сериялық байланысты инициализациялаймыз. Төмендегі үзінді дисплейдің қалай орнатылатынын көрсетеді:

void setup() {
   Serial.begin(9600);// сериялық мониторды 9600 бодпен орнату
   display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // I2C мекенжайымен инициализациялау 0x3D
}

Мұнда дисплей I2C мекенжайымен инициализацияланады, бұл оған Arduino-мен байланысуға мүмкіндік береді. Сериялық монитор да қашықтық мәндерін басып шығару үшін орнатылады.

Негізгі циклде біз дисплейді тазалаймыз, қашықтықты өлшейміз және оны басып шығарамыз. Төмендегі код үзіндісі қашықтықты өлшеуді қалай өңдейтінімізді көрсетеді:

void loop() {
   display.clearDisplay();
   String distance  = String(sonar.ping_cm());// қашықтықты алу және дисплей үшін жолға түрлендіру
   robojaxText(distance +"cm", 3, 20, 3, false);
   display.display();
   delay(50); // Импульстар арасында 50мс күту
}

Бұл цикл қашықтықты үздіксіз өлшейді және ағымдағы көрсеткішті дисплейде жаңартады. `robojaxText` функциясы мәтінді OLED экранында көрсету үшін қолданылады.

Демонстрация / Не күтуге болады

Орнату аяқталғанда және код жүктелгенде, сіз OLED экранында қашықтықты сантиметрмен көруіңіз керек. Нысанды сенсорға жақындатқанда немесе алыстатқанда, көрсетілетін мән сәйкесінше өзгеруі керек. Сенсордың дұрыс бағытталғанына және оның бөгеттелмегеніне көз жеткізіңіз (бейнеде 02:30).

Бейне уақыт белгілері

  • 00:00 - Жобаға кіріспе
  • 01:15 - Сым қосылым нұсқаулары
  • 02:30 - Кодты түсіндіру
  • 04:00 - Сенсордың демонстрациясы

Суреттер

HC-SR04 ulrasonic sensor
HC-SR04 ulrasonic sensor
How HC-SR04 ulrasonic sensor work
How HC-SR04 ulrasonic sensor work
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
Arduino wiring for HC-SR04 ultrasonic SSD1306 128x64 OLED
SSD1306 OLED display
SSD1306 OLED display
SSD1306 OLED display-dimensions
SSD1306 OLED display-dimensions
SSD1306_128x64_OLDE-4
SSD1306_128x64_OLDE-4
SSD1306 OLED display-back
SSD1306 OLED display-back
44-This is the Arduino code for an HC-SR04 ultrasonic distance sensor with an SSD1306 display.
Тіл: C++
/*
 * This is the Arduino code for the HC-SR04 Ultrasonic Distance Sensor with SSD1306 Display
 * to measure the distance using Arduino for a robotic car and other applications
 * Watch the video https://youtu.be/Pgx5fNF4Q6M
 * 
 * Written by Ahmad Shamshiri for Robojax Video
 * Date: December 21, 2017, in Ajax, Ontario, Canada
 * Permission granted to share this code given that this
 * note is kept with the code.
 * Disclaimer: this code is "AS IS" and for educational purposes only.
 * 
 */

/* Original Code 
   from https://github.com/adafruit/Adafruit_SSD1306
// https://playground.arduino.cc/Code/NewPing
 * Modified for Robojax video on December 21, 2017
// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------
*/
//// start of SSD1306 display 
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 64 
#define LOGO16_GLCD_WIDTH  128 
static const unsigned char PROGMEM logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
//// end of SSD1306 display 

// ---------------------------------------------------------------------------
// Example NewPing library sketch that does a ping about 20 times per second.
// ---------------------------------------------------------------------------

#include <NewPing.h>

#define TRIGGER_PIN  12  // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN     11  // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 200 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.



void setup() {
   Serial.begin(9600);// set serial monitor with 9600 baud
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  
}// setup end


void loop() {
   display.clearDisplay();
  robojaxText("Distance", 3, 0, 2, false);
  String distance  = String(sonar.ping_cm());// get distance and convert it to string for display
  robojaxText(distance +"cm", 3, 20, 3, false);
    display.display();

  delay(50);                     // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
  Serial.print("Ping: ");
  Serial.print(sonar.ping_cm()); // Send ping, get distance in cm and print result (0 = outside set distance range)
  Serial.println("cm");

}// loop end


/*
 * robojaxText(String text, int x, int y,int size, boolean d)
 * text is the text string to be printed
 * x is the integer x position of text
 * y is the integer y position of text
 * size is the text size, 1, 2, 3 etc
 * d is either true or false.  Use true to display.
 */
void robojaxText(String text, int x, int y,int size, boolean d) {

  display.setTextSize(size);
  display.setTextColor(WHITE);
  display.setCursor(x,y);
  display.println(text);
  if(d){
    display.display();
  }

}

Ресурстар мен сілтемелер

Файлдар📁

Техникалық сипаттама (pdf)

  • SSD1306 display datasheet
    SSD1306 is a single-chip CMOS OLED/PLED driver with controller for organic / polymer light emitting diode dot-matrix graphic display system. It consists of 128 segments and 64commons. This IC is designed for Common Cathode type OLED panel. The SSD1306 embeds with contrast control, display RAM and oscillator, which reduces the number of external components and power consumption. It has 256-step brightness control. Data/Commands are sent from general MCU through the hardware selectable 6800/8000 series compatible Parallel Interface, I2C interface or Serial Peripheral Interface. It is suitable for many compact portable applications, such as mobile phone sub-display, MP3 player and calculator, etc.
    SSD1306_display_datasheet.pdf 1.79 MB