Arduino uno в качестве генератора прямоугольных импульсов с регулируемой частотой и рабочим циклом

Как подключить нескольких устройств по I2C Arduino

В следующем примере к шине IIC Arduino будет подключено сразу три устройства — текстовый дисплей 1602, датчик давления bmp180 и RTC модуль часов. После сборки схемы можно сделать предварительное сканирование шины, но адреса у всех устройств разные и изменить адрес можно только у дисплея. У других устройств адреса «вшиты» производителем и используются в библиотеках по умолчанию.

Скетч. Подключение нескольких устройств к шине i2c

I2C интерфейс: подключение нескольких устройств

После сборки схемы, убедитесь, что у вас установлены необходимые библиотеки для работы с устройствами по IIC протоколу, и загрузите следующий пример кода в микроконтроллер. Данная программа будет выводить на текстовый экран текущую дату и время суток (устанавливаются в процедуре void setup и время можно поменять), а также данные о температуре воздуха и атмосферном давлении.

#include <Wire.h>  // подключаем библиотеку для интерфейса I2C 

#include <LiquidCrystal_I2C.h>  // подключаем библиотеку для 1602
LiquidCrystal_I2C LCD(0x27, 16, 2);  // создаем объект LCD

#include <SFE_BMP180.h>  // подключаем библиотеку для bmp180
SFE_BMP180 pressure;  // создаем объект pressure

#include <iarduino_RTC.h>  // подключаем библиотеку для часов
iarduino_RTC time(RTC_DS1307);  // создаем объект time

void setup() {
  LCD.init();  // инициализация дисплея
  LCD.backlight();  // включение подсветки

  pressure.begin();  // запускаем датчик давления

  time.begin();  // запускаем модуль часов
  time.settime(0, 30, 16, 1, 4, 21, 5);  // сек, мин, часы, дата, мес, год, день недели
}

void loop() {
  char status;
  double T, P, p0, a;

  // если прошла 1 секунда обновляем информацию
  if (millis() % 1000 == 0) {

    // выводим время с секундами и дату (день, месяц)
    LCD.setCursor(0, 0);
    LCD.print(time.gettime("H:i:s - d.m"));

    // узнаем температуру и выводим на дисплей
    status = pressure.startTemperature();
    if (status != 0) {
      delay(status);
      status = pressure.getTemperature(T);
      if (status != 0) {
        LCD.setCursor(0, 1);
        LCD.print("T:");
        LCD.print(T, 2);

        // узнаем давление и выводим на дисплей
        status = pressure.startPressure(3);
        if (status != 0) {
          delay(status);
          status = pressure.getPressure(P, T);
          if (status != 0) {
            p0 = pressure.sealevel(P, 1655.0);
            LCD.print(" D:");
            LCD.print(p0, 2);

          }
          else { LCD.setCursor(0, 1); LCD.print("error retrieving pressure"); }
        }
        else { LCD.setCursor(0, 1); LCD.print("error starting pressure"); }
      }
      else { LCD.setCursor(0, 1); LCD.print("error retrieving temperature"); }
    }
    else { LCD.setCursor(0, 1); LCD.print("error starting temperature"); }
  }

}

Пояснения к коду:

  1. обновление информации на текстовом экране происходит каждую секунду, данный интервал можно увеличить по своему желанию;
  2. время выводится с секундами, формат вывода времени и даты также можно изменить в строчке

Step 3: Future Developments

Could it be battery powered? Yes, just add a 9V PP3 connected to the RAW pin of the Nano. It typically uses 20mA.

Could it be powered by a single lithium cell? I don’t see why not. You should connect the OLED Vdd and its pull-up resistor to the 3.7V battery (I doubt if the 3.3V output of the Arduino would work properly).

A sweep generator is more useful when testing the frequency response of a filter if you can graph amplitude vs frequency. Measuring the amplitude of a signal is tricky — you have to trade off the decay of your envelope detector vs ripple for low frequencies and response time for high frequencies. Having built your amplitude detector, you could feed its output into the ADC of the Arduino of the «Simplest Signal Generator» then send the result, along with the current frequency to the PC.

Редактирование файла boards.txt

Arduino_dir\hardware\arduino\avr\d:\Arduino\arduino-1.6.12\hardware\arduino\avr\.menu.clock=Тактирование

  1. скорость загрузки — uno.upload.speed;
  2. значения фьюзов — uno.bootloader.low_fuses, .high_fuses, .extended_fuses;
  3. имя файла загрузчика — uno.bootloader.file;
  4. частоту микроконтроллера — uno.build.f_cpu.

uno.menu.clock.external16=Внешний резонатор 16МГцuno.menu.clock.external16.upload.speed=115200uno.menu.clock.external16.bootloader.low_fuses=0xFFuno.menu.clock.external16.bootloader.high_fuses=0xDEuno.menu.clock.external16.bootloader.extended_fuses=0xFFuno.menu.clock.external16.bootloader.file=optiboot/optiboot_atmega328.hexuno.menu.clock.external16.build.f_cpu=16000000Luno.menu.clock.internal8=Внутренний RC-генератор 8МГцuno.menu.clock.internal8.upload.speed=57600uno.menu.clock.internal8.bootloader.low_fuses=0xE2uno.menu.clock.internal8.bootloader.high_fuses=0xDEuno.menu.clock.internal8.bootloader.extended_fuses=0xFFuno.menu.clock.internal8.bootloader.file=optiboot/optiboot_atmega328_8.hexuno.menu.clock.internal8.build.f_cpu=8000000Luno.menu.clock.internal1=Внутренний RC-генератор 1МГцuno.menu.clock.internal1.upload.speed=4800uno.menu.clock.internal1.bootloader.low_fuses=0x62uno.menu.clock.internal1.bootloader.high_fuses=0xDEuno.menu.clock.internal1.bootloader.extended_fuses=0xFFuno.menu.clock.internal1.bootloader.file=optiboot/optiboot_atmega328_1.hexuno.menu.clock.internal1.build.f_cpu=1000000L

онлайн калькулятораИнструменты->ТактированиеВнутренний RC-генератор 8МГцотсюдаArduino_dir\hardware\arduino\avr\bootloaders\optiboot\

Что такое протокол I2C и как он работает

Термин IIC расшифровывается как “Inter Integrated Circuits” и часто обозначается как I2C или даже как TWI (2-wire interface protocol), но во всех случаях за этими обозначениями скрывается один и тот же протокол. I2C представляет собой протокол синхронной связи – это значит что оба устройства, которые обмениваются информацией с помощью данного протокола должны использовать общий сигнал синхронизации. Поскольку в этом протоколе используются всего 2 линии (провода), то по одной из них должен передаваться сигнал синхронизации, а по другой – полезная информация.

Впервые протокол I2C был предложен фирмой Phillips. Протокол в самом простом случае соединяет с помощью 2-х линий 2 устройства, одно из устройств должно быть ведущим, а другое – ведомым. Связь возможна только между ведущим и ведомым. Преимуществом протокола (интерфейса) I2C является то, что к одному ведущему можно подключить несколько ведомых.

Схема связи с помощью протокола I2C представлена на следующем рисунке.

Назначение линий данного интерфейса:

  • Serial Clock (SCL): по ней передается общий сигнал синхронизации, генерируемый ведущим устройством (master);
  • Serial Data (SDA): по ней осуществляется передача данных между ведущим и ведомым.

В любой момент времени только ведущий может инициировать процесс обмена данными. Поскольку в этом протоколе допускается несколько ведомых, то ведущий должен обращаться к ним, используя различные адреса. То есть только ведомый с заданным (указанным) адресом должен отвечать на сигнал ведущего, а все остальные ведомые в это время должны «хранить молчание». Таким образом, мы можем использовать одну и ту же шину (линию) для обмена данными с несколькими устройствами.

Уровни напряжений для передаваемых сигналов в интерфейсе I2C жестко не определены. В этом плане I2C является достаточно гибким, то есть если устройство запитывается от напряжения 5v, оно для связи с помощью протокола I2C может использовать уровень 5v, а если устройство запитывается от напряжения 3.3v, то оно для связи с помощью протокола I2C может использовать уровень 3v. Но что делать если с помощью данного протокола необходимо связать между собой устройства, работающие от различных питающих напряжений? В этом случае используются преобразователи/переключатели напряжения (voltage shifters).

Существует несколько условий для осуществления передачи данных в протоколе I2C. Инициализация передачи начинается с падения уровня на линии SDA, которое определяется как условие для начала передачи (‘START’ condition) на представленной ниже диаграмме. Как видно из этого рисунка, в то время как на линии SDA происходит падение уровня, в это же самое время на линии SCL ведущий поддерживает напряжение высокого уровня (high).

То есть, как следует из рисунка, падение уровня на линии SDA является аппаратным триггером для условия начала передачи. После этого все устройства на этой шине переключаются в режим прослушивания.

Аналогичным образом, повышение уровня на линии SDA останавливает передачу данных, что на представленной диаграмме обозначено как условие окончания передачи данных (‘STOP’ condition). В это же самое время ведущим на линии SCL поддерживается напряжение высокого уровня (high).

На следующем рисунке представлена структура адреса ведомого в протоколе I2C.

Бит R/W показывает направление передачи следующих за ним байт, если он установлен в HIGH – это значит что будет передавать ведомый (slave), а если он установлен в low – это значит что будет передавать ведущий (master).

Каждый бит передается в своем временном цикле, то есть нужно 8 временных циклов чтобы передать байт информации. После каждого переданного или принятого байта 9-й временной цикл используется для подтверждения/не подтверждения (ACK/NACK) приема информации. Этот бит подтверждения (ACK bit) формируется либо ведомым, либо ведущим в зависимости от ситуации. Для подтверждения приема информации (ACK) на линии SDA ведущим или ведомым устанавливается низкий уровень (low) в 9 временном цикле, в противном случае происходит не подтверждение приема информации (NACK).

На следующем рисунке представлена структура передаваемого сообщения в протоколе I2C.

Step 1: Simplest Signal Generator

For the simplest Signal Generator, you just solder the AD9833 module onto the back of the Arduino Nano. No PCB is needed.

The connections between the modules are:

  • grounds connected together
  • D2 = FSync
  • D3 = Clk
  • D4 = Data
  • D6 = Vcc of AD9833

The AD9833 is powered from data pin D6 of the Arduino — the Arduino can supply sufficient current. I’ve added a 100n decoupling capacitor because I thought I «ought» to but I couldn’t see any difference — there is already a decoupling capacitor on the AD9833 module board.

If you were being fancy, you might worry about «analogue ground» vs «digital ground» but if you were being fancy, you’d be spending more than £4.

The simplest Signal Generator is controlled and powered over a USB lead from a PC. The USB emulates a serial port running at 115200bps (8-bits, no parity). The commands are:

  • ‘0’..’9′: shift digit into «min» frequency array
  • ‘S’: set AD9833 frequency and produce sine wave
  • ‘T’: set frequency and produce triangle wave
  • ‘Q’: set frequency and produce square wave
  • ‘R’: reset the AD9833
  • ‘M’: copy «min» frequency array into «max» array
  • ‘G’: sweep from «min» to «max» over 1 second
  • ‘H’: sweep from «min» to «max» over 5 seconds
  • ‘I’: sweep from «min» to «max» over 20 seconds

The Arduino program contains two 6-character arrays «min» and «max. If you transmit a digit then it is shifted into the «min» array. If you send an ‘S’ then the «min» array characters are converted into a longint frequency and sent to the AD9833. So sending the string

002500S

will set the AD9833 output to a 2500Hz sine wave. You must always send all 6 digits. The minimum frequency is 000001 and the maximum frequency is 999999.

If you send an ‘M’ then the «min» array is copied into the «max» array. If you send an ‘H’ then the AD9833 repeatedly outputs a gradually increasing frequency over 5 seconds. It starts at «min» frequency and 5 seconds later is at «max» frequency. So

020000M000100SH

sweeps from 100Hz to 20kHz. The frequency change is logarithmic so after 1 second the frequency will be 288Hz, after 2 seconds 833Hz then 2402, 6931 and 20000. The frequency is changed every milliSecond.

The loop stops when the Arduino receives another character so be careful not to send the command followed by carriage-return or line-feed. That extra character would terminate the loop. If you’re using the Serial Monitor, there’s a box at the bottom right that might say for instance «Both NL & CR» which (I think) sends characters after your command. Set it to «No line ending».

You can download the Windows EXE program below which will send the required commands or you could write your own. The Arduino INO file is also here.

Что такое Arduino?

Это небольшое электронное устройство, включающее в себя одну печатную плату, которая способна управлять различными приборами и оборудованием (в том числе электродвигателями), осуществлять приём и передачу данных.

Реальный старт в познании аппаратно-программных средств построения простых систем автоматики. Она очень проста в освоении и не требует почти никаких предварительных условий, кроме пытливого ума.

Имеет ценность в качестве учебного пособия для неофитов, и в качестве инструмента реализации проекта для любителей, и как инструмент прототипирования для профессионалов.

Для неофитов здесь все покажется новым. Для любителей Arduino – устройство применения своих знаний и возможность сосредоточиться на битах, которые являются новыми для них, или сложными для восприятия. Профессионалы используют устройство ради получения прототипа проекта с наименьшей стоимостью реализации заказного оборудования и прошивки.

В любом случае, пользователь получит хорошее представление о программировании на C. Это отличная отправная точка.

Делаем генератор частоты на базе Ардуино микроконтроллера

Генератор частоты на Ардуино – прибор, который занимается преобразованием электрической энергии источника постоянного тока в энергию, не поддающуюся затуханию, для расчета и частоты и образованной формы электрических колебаний. Приспособление приобрело популярность среди начинающих создателей электронных устройств, разработчиков компьютерных девайсов и радиоприемников. Выходное напряжение получается из 3 форм: прямоугольник, синусоида и пила.

Источник электрического тока передает возбужденные волны контуру колебаний, поэтому образуются волновые движения. Они постепенно затухают, потому что сопротивление поглощает энергетическую волну.

С помощью связи в контур поступает частица сигнала, совпадающего с колебанием обратной связи.

Такой прибор, как генератор сигналов на Ардуино, легко сделать в домашних условиях. Основа конструкции – микроконтроллер Arduino.

Где применяется генератор частоты на Ардуино

Роль частотного генератора в мире электроники – настройка и определение технической характеристики тактов сигнальных волн. Другое применение – для регулировки узлов и элементов приемников, передающих радио-колебания. Кроме того, генератор импульсов, построенный на Ардуино, используют как модулятор или источник питания для устройств, которые обладают измерительными свойствами.

Частотные измерители могут изменять выходные сигналы с определенным скачком.

Поэтому устройства с такими свойствами играют немаловажную роль в конструировании электронных приборов. Перечислим другие значительные функции Ардуино-генератора:

  1. Поиск расположения мест, где можно проложить кабели и трубопроводы. Причем поисковая работа проводится на дальних расстояниях.
  2. Поисковые работы для находки мультичастотной технологии с помощью процесса излучения сразу нескольких частотных волн.
  3. Создание аналоговых синтезаторов. Синтезирующие устройства применяются для сборки электронных устройств без использования множества блоков. Все сигнальные волны мелькают между разными блоками строго по стандартам.

Комплектующие

Для создания генератора прямоугольных импульсов на Ардуино понадобятся следующие компоненты:

  • Arduino Uno R3 в антистатической упаковке;
  • шилд DFRobot LCD Keypad Shield;
  • модуль генератора сигналов AD9850 DDS;
  • проводы для присоединения частей конструкции – 8 штук;
  • USB-провод или кабель.

Также во втором случае можно собрать устройство на основе AD9850 DDS модуля и 1,8-дюймового TFT-дисплея (контроллер ST7735).

В таком случае схема соединения будет выглядеть так:

Листинг программы для проекта «генератор импульсов с регулировкой частоты на Ардуино» для первого нашего варианта:

#include // Подключение библиотек LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Инициализация LCD с указанием пинов float freq = 10000; // Оглашение переменных — Частота float bigStep = 1000; // Шаг изменения частоты при нажатии вверх/вниз float littleStep = 10; // Шаг изменения частоты при нажатии вправо/влево int lcd_key = 0; int adc_key_in = 0; #define btnRIGHT 0 // Создание директив для кнопок #define btnUP 1 #define btnDOWN 2 #define btnLEFT 3 #define btnSELECT 4 #define btnNONE 5 #define W_CLK 15 // Пин A1 Arduino – подключен к CLK #define FQ_UD 16 // Пин A2 Arduino – подключен к FQ (FU) #define DATA 17 // Пин A3 Arduino – подключен к DATA #define RESET 18 // Пин A4 Arduino – подключен к RST #define pulseHigh(pin) {digitalWrite(pin, HIGH); digitalWrite(pin, LOW); } //—————————————————— int read_LCD_buttons(){ // Функция считывания нажатия кнопок adc_key_in = analogRead(0); if (adc_key_in > 1000) return btnNONE; if (adc_key_in =1) { // данных в модуль генератора digitalWrite(DATA, data & 0x01); pulseHigh(W_CLK);}} // Подача импульса на CLK после каждого бита //——————————————————- void sendFrequency(double frequency) { // Преобразование и отправка int32_t freq = frequency * 4294967295/125000000; // значения частоты for (int b=0; b>=8) {tfr_byte(freq & 0xFF);} tfr_byte(0x000); // Отправка завершательного контрольного байта pulseHigh(FQ_UD);} // Обновление частоты генератора //—————————————————- void setup() { lcd.begin(16, 2); // Старт библиотеки. Указанием количества символов и строк pinMode(FQ_UD, OUTPUT); pinMode(W_CLK, OUTPUT); pinMode(DATA, OUTPUT); pinMode(RESET, OUTPUT); pulseHigh(RESET); // Отправка импульсов для запуска модуля генератора pulseHigh(W_CLK); pulseHigh(FQ_UD); } //—————————————————- void loop() { lcd.setCursor(0,0); // Далее вывод текущего значения частоты lcd.print(“Freq: “); lcd.setCursor(6,0); lcd.print(” “); lcd.setCursor(6,0); if (freq=1000)&&(freq=1000000)&&(freq

Примеры работы для Espruino

В качестве примера подключим дисплей к управляющей плате Iskra JS.

Подключение к Iskra JS

Для коммуникации понадобится Breadboard Half и соединительные провода «папа-папа».

Вывод Обозначение Пин Iskra JS
1 GND GND
2 VCC 5V
3 VO GND
4 RS P11
5 R/W GND
6 E P12
7 DB0
8 DB1
9 DB2
10 DB3
11 DB4 P5
12 DB5 P4
13 DB6 P3
14 DB7 P2
15 VCC 5V
16 GND GND

Вывод текста

Для вывода программы приветствия, воспользуйтесь скриптом:

hello-amperka.js
// создаём переменную для работы с дисплеем
// HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев
var lcd = require("HD44780").connect(P11,P12,P5,P4,P3,P2);
// печатем первую строку
lcd.print("Hello world");
// устанавливаем курсор в колонку 0, строку 1
// на самом деле это вторая строка, т.к. нумерация начинается с нуля
lcd.setCursor(, 1);
// печатаем вторую строку
lcd.print("Do It Yourself");

Кирилица

Вывод кирилицы на дисплей с помощью платформы Iskra JS доступен через встроенную в дисплей таблицу знакогенератора.

Таблица знакогенератора

Дисплейный модуль хранит в памяти две страницы знакогенератора, которые состоят из различных символов и букв.

Для вывода символа на дисплей необходимо передать его номер в шестнадцатеричной системе из таблицы знакогенератора.

Так букве соответствует код в шестнадцатеричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности встроить в строку код символа:

lcd.print("\xB1ndex");

Вы можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность , он считывает за ним все символы, которые могут являться разрядами шестнадцатеричной системы даже если их больше двух. Из-за этого нельзя использовать символы из диапазона и следом за двузначным кодом символа, иначе на дисплее отобразится неправильная информация. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются.

Сравните две строки кода для вывода надписи «Яeee»:

lcd.print("\xB1eee"); // ошибка
lcd.print("\xB1"+"eee"); // правильно

Используя полученную информацию выведем на дисплей сообщение «Привет, Амперка!»:

hello-amperka-rus.js
// создаём переменную для работы с дисплеем
// HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев
var lcd = require("HD44780").connect(P11,P12,P5,P4,P3,P2);
// устанавливаем курсор в колонку 5, строку 0
// на самом деле это первая строка, т.к. нумерация начинается с нуля
lcd.setCursor(5, );
// печатаем первую строку
lcd.print("\xA8"+"p"+"\xB8\xB3"+"e\xBF");
// устанавливаем курсор в колонку 3, строку 1
// на самом деле это вторая строка, т.к. нумерация начинается с нуля
lcd.setCursor(3, 1);
// печатаем вторую строку
lcd.print("o\xBF"+" A\xBC\xBE"+"ep\xBA\xB8");;

Переключение страниц знакогенератора

Дисплейный модуль хранит в памяти две страницы знакогенератора. По умолчанию установлена нулевая страница. Для переключения между страницами используйте методы:

// переключение с нулевой страницы на первую
command(0x101010);
// переключение с первой страницы на нулевую
command(0x101000);

Дисплей не может одновременно отображать символы разных страниц.

Рассмотрим пример, в котором одна и та же строка будет отображаться по-разному — в зависимости от выбранной страницы.

change-page.js
// создаём переменную для работы с дисплеем
// HD44780 — контроллер монохромных жидкокристаллических знакосинтезирующих дисплеев
var lcd = require("HD44780").connect(P11,P12,P5,P4,P3,P2);
// создаём переменную состояния
var state = false;
// устанавливаем курсор в колонку 5, строку 0
// на самом деле это первая строка, т.к. нумерация начинается с нуля
lcd.setCursor(5, );
// печатаем первую строку
lcd.print("\x9b\x9c\x9d\x9e\x9f");
 
setInterval(function() {
  // каждую секунду меняем переменую состояния
  state = !state;
  // вызываем функцию смены адреса страницы
  lcdChangePage();
}, 1000);
 
function lcdChangePage () {
  if (state) {
    // устанавливаем 0 станицу знакогенератора (стоит по умолчанию) 
    lcd.write(0b101000, 1);
  } else {
    // устанавливаем 1 станицу знакогенератора
    lcd.write(0b101010, 1);
  }
}

Полную таблицу символов с кодами можно найти в документации к экрану.

Триггер Шмитта

Мы знаем, что не все тестовые сигналы являются прямоугольными. У нас есть сигналы треугольные, пилообразные, синусоидальные и так далее. Поскольку Arduino Uno может детектировать только прямоугольные сигналы, нам необходимо устройство, которое могло бы преобразовывать любые сигналы в прямоугольные. Поэтому мы используем триггер Шмитта. Триггер Шмитта представляет собой цифровой логический элемент, предназначенный для арифметических и логических операций.

Этот элемент обеспечивает выходной сигнал (OUTPUT) на основе уровня напряжения входного сигнала (INPUT). Триггер Шмитта имеет пороговый уровень напряжения (THERSHOLD): когда уровень входного сигнала выше порогового уровня элемента, уровень сигнала на выходе будет равен высокому логическому уровню. Если уровень входного сигнала ниже порога, на выходе будет низкий логический уровень. Обычно у нас нет отдельного триггера Шмитта, за ним всегда следует элемент НЕ.

Мы собираемся использовать микросхему 74LS14, которая содержит 6 триггеров Шмитта. Эти шесть элементов внутри подключены, как показано на рисунке ниже.

Микросхема 74LS14, содержащая шесть триггеров Шмитта. Распиновка

Таблица истинности инвертированного триггера Шмитта показана ниже, в соответствии с ней мы должны запрограммировать Arduino Uno для инвертирования положительных и отрицательных периодов времени на ее выводах.

\(Y = \bar{A}\)

Таблица истинности
Вход Выход
A Y
L H
H L
  • H – высокий логический уровень;
  • L – низкий логический уровень.

Теперь, когда мы подадим сигнал любого типа на элемент триггера Шмитта, у нас на выходе будет прямоугольный сигнал с инвертированными временными периодами, и этот сигнал мы подадим на Arduino Uno.

Практика

Теперь мы переходим к интересным вещам. Давайте проверим ЖК-дисплей. Сначала подключим контакты 5В и GND от Arduino Uno к шинам электропитания макетной платы. Затем  подключим  LCD 1602.  Данный LCD имеет две отдельные линии питания:

  1. Контакт 1 и контакт 2 для питания самого LCD 1602
  2. Контакт 15 и контакт 16 для подсветки LCD 1602

Подсоедините контакты 1 и 16 LCD на минус питания, а контакты 2 и 15 к + 5В.

Далее необходимо подключить контакт 3, который отвечает за контрастность и яркость дисплея. Для точной настройки контрастности необходимо подключить крайние выводы потенциометра сопротивлением 10 кОм к 5В и GND, а  центральный контакт (бегунок) потенциометра к контакту 3 на LCD дисплея.

Регулировка контрастности ЖК-дисплея с помощью потенциометра

Теперь включите Arduino и вы увидите подсветку. Поворачивая ручку потенциометра, вы должны заметить появление первой линии прямоугольников. Если это произойдет, поздравляем! Ваш ЖК-дисплей работает правильно.

Возможные ошибки при подключении модуля I2C

Если после того  загрузили  программу в arduino экран никак не реагирует и он не отображается никакого символа, попробуйте выполнить следующие шаги:

1. Попробуйте увеличить или уменьшить контрастность монитора. Часто символы просто не видны из-за режима контрастности и подсветки.
2. Если первый пункт не помогает проверьте правильность подключения контактов, подключено ли питание подсветки. Если вы использовали отдельный i2c переходник, то проверьте еще раз качество пайки контактов.

Другой причиной не рабочего экрана может стать неправильный i2c адрес, для устранения неисправности попробуйте выполнить следующие шаги:

1. Попробуйте сперва изменить в скетче адрес устройства с 0x27 0x20 или на 0x3F. У разных производителей могут быть установлены свои адреса по умолчанию.
2. Если и это не помогло, можете запустить скетч i2c сканера, который просматривает все подключенные устройства и определяет их адрес методом перебора.
3. Если экран все еще останется нерабочим, попробуйте отпаять переходник и подключить LCD обычным образом.