Проблема данного дисплея в том, что он подключается по SPI протоколу, но на плате отсутствует вывод CS chip select.
Кто-то припаивает дополнительные проводки, но благо нашлись люди, написавшие библиотеку для данного случая https://github.com/ananevilya/Arduino-ST7789-Library
и нам понадобится ещё для работы с дисплеем https://github.com/adafruit/Adafruit-GFX-Library
Библиотека для серво двигателя Servo.h но она есть при установке программы Arduino IDE.
Из железа: Arduino UNO, серво двигатель, УЗ датчик hc-sr04, дисплей ST7789. УЗ датчик крепится к серводвигателю и получаем аналог антенны. Свой радар печатал на 3Д принтере.
Алгоритм работы программы:
1. Подключить дисплей, сбросить экран.
2. Установить положение вала серводвигателя в начальное положение i=0
3. Провести измерение расстояния до объекта distance_sm .
4. Отобразить на экране расстояние в виде числа, построить линию с длинной пропорциональной расстоянию до объекта и углом, соответствующим углу вала сервы.
5. Повернуть "антенну" на шаг в 1 градус.
6. Повторить п.3-п.5 при изменении угла поворота от 0 до 180 градусов.
7. Повторить п.3-п.5 от 180 до 0 градусов.
Повтор организуется циклом при увеличении счетчика
Теперь про отрисовку: экран обладает своим контроллером, мы не пишем программу для непосредственной отрисовки пикселей на уровне железа, нам достаточно знать протокол передачи данных и использовать команды, используемые экраном, в библиотеке всё реализовано на естественном языке. Когда мы передаем в экран информацию, которую хотим отобразить, она там так и остается, пока ей на замену не придет новая. И вот тут интересный подводный камень: если мы выведем число "42", а затем "57", то пиксели второго числа наложатся на пиксели первого и будет каша. Можно очистить весь экран, сбросить, и отрисовать новый кадр изображения заново, но это займет кучу машинного времени и изображение будет мигать при смене информации. Делаем по другому: в начале выводим число "42" зеленого цвета, а перед отрисовкой "57" мы рисуем "42" цветом фона, например черным, а потом рисуем уже новое число. Также надо делать и с линиями.
Приведем основные команды, имеющиеся в библиотеке для работы с экраном:
tft.init(240, 240); //инициализация экрана, задаем его размер
tft.fillScreen(BLACK); //закрасить черным
tft.setCursor(0,0); //установить курсор
tft.setTextColor(GREEN); //цвет текста
tft.setTextSize(0); //размер от 1 до 5
tft.print("Angle:"); //вывод текста
tft.println("Angle:"); //вывод текста, новый текст будет с новой строки
tft.drawLine(x1, y1,x2, y2, color); //линия
tft.drawRect(x1, y1 ,x2, y2, color); //прямоугольник
tft.fillRect(x1, y1 ,x2, y2, color); //прямоугольник закрашенный
tft.drawCircle(x, y, radius, color); //круг
tft.fillCircle(x, y, radius, color); //круг заполненный
Цвета задаются в шестнадцетиричном код или десятичном от 0x0000 до 0xFFFF, либо по соответствующих в библиотеке именам: BLACK, BLUE, RED, GREEN, MAGENTA, YELLOW, WHITE.
Теперь небольшой пример программы для дисплея
#include <Adafruit_GFX.h> // библиотека для графики
#include <Arduino_ST7789.h> // бибилотека для ST7789 (с или без CS пина)
#include <SPI.h>
#define TFT_DC 8
#define TFT_RST 9
#define TFT_MOSI 11 // (sda вывод на экране)
#define TFT_SCLK 13 // (scl вывод на экране)
Arduino_ST7789 tft = Arduino_ST7789(TFT_DC, TFT_RST); //для дисплеев без CS
void setup(void) {
Serial.begin(9600);
Serial.print("Hello! ST7789 TFT Test");
tft.init(240, 240); // инициализация чипа ST7789, размер экрана 240x240
Serial.println("Initialized");
// large block of text
tft.fillScreen(BLACK);
tft.setCursor(0,0);
tft.setTextColor(GREEN);
tft.setTextSize(3);
tft.println("TEST");
delay(1000);
}
void loop() {
tft.fillScreen(BLACK);
for (int x=0; x < tft.width(); x+=6) {
tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, random(64000));
delay(100);
}
}
Итоговый код программы, используемой в проекте: https://www.dropbox.com/s/t1hu976zxwk6te7/radar_ekran.rar?dl...