вторник, 6 апреля 2021 г.

Работа OLED 0.91 inch 128*32 с библиотекой u8g2 (бывшая u8glib) (LRR 0.91 inch)

   


 Библиотека u8g2 (бывшая u8glib) позволяет выводить на дисплей текстовую информацию. Большой выбор шрифтов и большое количество поддерживаемых дисплеев делает эту библиотеку наиболее популярной.
    Для начала рассмотрим подключение дисплея OLED 0.91 inch 128*32 к ARDUINO. Для подключения потребуется всего 4 провода: GND, 5V, SCL (Clock Line) и SDA (Data Line)


    В моем случае используются:
        - версия программы ARDUINO 1.8.13
        - плата ARDUINO UNO
        - дисплей OLED 0.91 inch 128*32
        - библиотека u8g2

     Если у вас не установлена эта библиотека, то ее нужно установить. Пункт меню ИНСТРУМЕНТЫ - УПРАВЛЯТЬ БИБЛИОТЕКАМИ. Далее найти и установить u8g2






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

#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>

U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0); // описание OLED 0.91 inch 128*32

void setup(void) {
  u8g2.begin();
}

void loop(void) {
  u8g2.clearBuffer();                                 // очищаем буфер
  u8g2.setFont(u8g2_font_cupcakemetoyourleader_tr);   // выбираем красивый шрифт
  u8g2.drawStr(0, 29, "D.A.CHOCOLATE");               // начальная позиция и текст 
  u8g2.sendBuffer();                                  // отправляем в буфер
  delay(2000);                                        // пауза

  for (int i = 0; i < 250; i++) {                     // добавляем цикл для эффекта бегущей строки
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_bubble_tr);                  // еще один красивый шрифт
  u8g2.drawStr(125-i, 29, "FANYA");                   // горизонтальная позиция меняется от 125 до -125
  u8g2.sendBuffer();
  delay(20);                                          // этой паузой задается скорость
 }
  u8g2.clearBuffer();         
  u8g2.setFont(u8g2_font_tenstamps_mf);               // еще один красивый шрифт
  u8g2.drawStr(15, 29, "Little");
  u8g2.sendBuffer();
  delay(1500);

  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_heavybottom_tr);             // еще один красивый шрифт
  u8g2.drawStr(32, 29, "Red Rat");
  u8g2.sendBuffer();
  delay(2000);

Посмотреть и выбрать шрифты можно по ссылке https://github.com/olikraus/u8g2/wiki/fntlistall
    

    


    Шрифты отсортированы по размеру. Слева образец. Копируем название нужного шрифта и вставляем в скетч. Можно найти шрифты с русскими буквами, шрифты с символами (заряд батареи, уровень сигнала и т.п.) 

    Также в скетче указывается позиция вывода текста

         u8g2.drawStr(32, 29, "Red Rat");


    Как видно на фото, сначала указывается горизонтальная позиция (слева направо), затем вертикальная (сверху вниз). Значения могут выходить из диапазона 128*32. За счет этого у меня реализована бегущая строка. При отрицательных значениях текст начинается с позиции за видимой частью дисплея.

    Для отображения нескольких строк делаем следующие:       

  u8g2.clearBuffer();         
  u8g2.setFont(u8g2_font_tenstamps_mf);              
  u8g2.drawStr(15, 16, "Line 1");
  u8g2.drawStr(15, 32, "Line 2");
  u8g2.sendBuffer();
  delay(4500);



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

    На этом все. Спасибо всем за внимание. Если вам помогла эта статья, можете сказать мне спасибо просто посмотрев рекламу :)

понедельник, 15 декабря 2014 г.

Новогодняя горка ARDUINO за один вечер

Всем привет.
Наверное у многих на окне в новогоднюю ночь стоит пирамидка 
Лично мне она уже надоела, и я решил ее переделать. Чтобы была никак у всех. Люблю выделятся (выделываться).
Задумка следующая. Горит как обычно минут 15-20, потом бац и какой нибудь прикол, типа бегущего огонька или постепенного погасания. Если сосед спросит: "Чё такое?", скажу: "А бес его знает, наверно свет моргает:)". Пускай голову ломает.

Итак за дело. Потребуется 7 светодиодов (самые хитрые все лето ковыряли зажигалки), 7 резисторов на 150-220 Ом, обрезки проводов, термоусадок, колодка на 7 пинов и собственно ARDUINO.
К длинному выводу (+) каждого светодиода припаиваем сопротивление, затем отрезок провода. Семь проводов собираем на колодке
Короткие выводы отрезками проводов спаиваем вместе, и делаем провод для подключения к GND




Подключаем к ARDUINO по следующей схеме.


Загружаем простой скетч и проверяем работу. Скетч написан ну совсем по простому. Любой новичок сможет разобрать принцип и внести свои изменения. После всех настроек можно заменить паузу 
delay (2222); 
на побольше, например 
delay (1200000); 
(20 мин из расчета 1000 = 1 сек) 
У меня было плата LEONARDO в паре с зарядкой от смартфона (microUSB) 
Ну вот вроде и все. 
С наступающим новым годом !!!


// New Year (С)2014 ALEN Studio by Little_Red_Rat

void setup() 
// описываем 0-6 контакты ARDUINO как выход и подаем '1', светодиод горит
{
  for (int i=0; i<7; i++)
  {
    pinMode(i,OUTPUT);
    digitalWrite(i, HIGH);
  }
}

void loop() {
  // все гаснут по одной
  for (int i=0; i<7; i++)
  {
    digitalWrite(i,LOW);
    delay (1500);
  }
  // загораются по одной  
  for (int i=0; i<7; i++)
  {
    digitalWrite(i,HIGH);
    delay (1500);
  }
  // большая пауза, все горят    
  delay (2222);
  //бегущий гаснет 2 раза в обе стороны
  for (int i=0; i<7; i++)
  {
    digitalWrite(i,LOW);
    delay (500);
    digitalWrite(i,HIGH);
  }
  for (int i=5; i>-1; i--)
  {
    digitalWrite(i,LOW);
    delay (500);
    digitalWrite(i,HIGH);
  }
  for (int i=1; i<7; i++)
  {
    digitalWrite(i,LOW);
    delay (500);
    digitalWrite(i,HIGH);
  }
  for (int i=5; i>-1; i--)
  {
    digitalWrite(i,LOW);
    delay (500);
    digitalWrite(i,HIGH);
  }
  // большая пауза, все горят    
  delay (2222);
  // гаснут снизу парами   
  digitalWrite(0,LOW);
  digitalWrite(6,LOW);
  delay (1500);
  digitalWrite(1,LOW);
  digitalWrite(5,LOW);
  delay (1500);
  digitalWrite(2,LOW);
  digitalWrite(4,LOW);
  delay (1500);
  digitalWrite(3,LOW);
  delay (1500);
  //загораются сверху парами    
  digitalWrite(3,HIGH);
  delay (1500);
  digitalWrite(2,HIGH);
  digitalWrite(4,HIGH);
  delay (1500);
  digitalWrite(1,HIGH);
  digitalWrite(5,HIGH);
  delay (1500);
  digitalWrite(0,HIGH);
  digitalWrite(6,HIGH);
  // большая пауза, все горят    
  delay (2222);
  // бегущий сверкающий огонек один раз в одну сторону
  for (int i=0; i<7; i++)
  {
    digitalWrite(i,LOW);
    delay (100);
    digitalWrite(i,HIGH);
    delay (100);
    digitalWrite(i,LOW);
    delay (100);
    digitalWrite(i,HIGH);
    delay (100);
    digitalWrite(i,LOW);
    delay (100);
    digitalWrite(i,HIGH);
    delay (100);
  } 
  // большая пауза, все горят    
  delay (2222);  
  // все гаснут
  for (int i=0; i<7; i++)
  {
    digitalWrite(i,LOW);
  }
  // загорается бегущий 5 раз в обе стороны 
  for (int y=0; y<6; y++)
  {
    for (int i=0; i<7; i++)
    {
      digitalWrite(i,HIGH);
      delay (50);
      digitalWrite(i,LOW);
    } 
    delay (50);
    for (int i=6; i>-1; i--)
    {
      digitalWrite(i,HIGH);
      delay (50);
      digitalWrite(i,LOW);
    } 
    delay (50);
  }
  // все горят
  for (int i=0; i<7; i++)
  {
    digitalWrite(i,HIGH);
  } 
  // большая пауза, все горят    
  delay (2222);   

}



четверг, 5 декабря 2013 г.

Часть 3, Новогодняя гирлянда Matrix 8*8 LED + MAX7219 module

ЧАСТЬ ТРЕТЬЯ
Подключение модуля Matrix 8*8 LED + MAX7219

Время бежит. До нового года осталось менее месяца. Обещанная ребенку гирлянда "круче чем у всех" еще только в моей голове.
Для удобства настройки и отладки взял два модуля, состоящие из LED Matrix 8x8 и драйвера MAX7219


Фото с интернета имеет подвох. В модуле матрица вставлена не правильно.
Модуль имеет следующую схему:


 Два модуля подключаются так

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


Для реализации данного способа подключения потребуется:
·        1 * ARDUINO (от 300 до 950 руб)
·        2 * Модуль MAX7219 Matrix 8*8 (200 руб)
·        1 * перемычка МАМА-МАМА (2.50 руб за 1 шт)
·        8 * перемычка ПАПА-ПАПА (100 руб за набор из 32 штук)

Цены взяты с сайта МОЛОТОК.РУ
       
        Собираем схему, для простоты накидал схемку от руки которая соответствует фото, видео и скетчу.




Библиотека MaxMatrix.
Основные функции которые я использовал:

MaxMatrix m(dataIn, load, clock, maxInUse);
m.Init();
Описание подключения и количество модулей

m.setIntensity(value)
Яркость 0-15, где 15 максимум, а 0 тусклое свечение (как на видео)

m.writeSprite(x, y, sprite)
Печать спрайта (картинки, которая описана в программе) с позиции x,y. Значение 0,0 верхний левый угол на фото, можно печатать за пределами матрицы. Например, берем спрайт (картинку) размером 32 на 8 точек печатаем ее с позиции -16,0 в этом случае мы увидим только правую половинку спрайта. А сдвинув его 16 раз в право (см.ниже) увидим левую половину

m.shiftLeft(true);
Left, Right, Up, Down соответственно сдвиг напечатанного спрайта влево, вправо, вверх, вниз на один пиксель. С параметром false подтирается хвост. С параметром true при сдвиге вправо левая колонка спрайта будет оставаться на матрице. Если в этой колонке есть пиксели, они составят хвост 

byte CH_A[] = {4, 8, B11111110, B00010001, B00010001, B11111110 };
Для примера описание спрайта размером в высоту 8, в ширину 4.
На спрайте изображена буква А
 ** 
*  *
*  *
*  *
***
*  *
*  *
*  *
m.writeSprite(0, 0, CH_A);
Печатаем его в позиции 0,0 и получаем результат

На основе этого собираюсь спаять гирлянду на окно. Уже купил 128 светодиодов, 4 метра кабеля (4 витых пары) и 3 м термоусадочной трубки диаметром 3мм (хотел 2мм, но не нашел)

Скетч из видео. 

ALEN Studio by Little_Red_Rat
// http://littleredrat.blogspot.ru/

#include <MaxMatrix.h>

// создаем спрайт снежинки
byte snowstar[] = {
  9, 8, B00000000, B01001001, B00101010, B00010100, B01101011, B00010100, B00101010, B01001001, B00000000};
// создаем снегопада
byte snow[] = {
  16,  8, B10000010, B00000001, B10000010, B00100000, B01110000, B00100001, B10000011, B00101001, B00010000, B00101000, B10000000,0B11000001, B10000000, B00000100, B00001110, B00000100};

// описание подключения
// DIN к 8
// CS к 9
// CLK к 10
// 2 модуля
MaxMatrix m(8, 9, 10, 2);

void setup(){
  m.init();
  m.setIntensity(0); // яркость 0 из 15
}

void loop(){

  // двигаем снежинку из-за левой границы за правую через цикл
  for (int i=-8; i<16; i++)
  {
    delay(100);
    m.writeSprite(i, 0, snowstar);
  }

  delay(100); // пауза
  // печатаем снегопад в 6 этажей
  m.writeSprite(0, 0, snow);
  m.writeSprite(0, -8, snow);
  m.writeSprite(0, -16, snow);
  m.writeSprite(0, -24, snow);
  m.writeSprite(0, -32, snow);
  m.writeSprite(0, -40, snow);

  // снегопад ... УРА !
  for (int i=0; i<32; i++)
  {
    m.shiftDown(true);
    delay(100);
  }
  // ветер сдувает снежинки, красота !
  for (int i=0; i<16; i++)
  {
    m.shiftLeft(false);
    delay(100);
  }
  delay(2000);

}

Кто-нибудь, подскажите пожалуйста, как правильно скетч вставить !!! А то как-то не красиво :(

Гирлянда часть первая
Гирлянда часть вторая

Большая просьба к любителям перепечаток, указывать автора Little_Red_Rat
Спасибо

вторник, 23 июля 2013 г.

HY-1.8 SPI (1.8 SPI TFT 128*160) ARDUINO

Данный модуль состоит из цветного дисплей и SD картридера.




Модуль имеет 16 ножек для подключения.
Для работы с модулем мною была найдена библиотека ST7735.h для версии “ARDUINO alpha 0022”
Рассмотрим подключение дисплея к ARDUINO
В библиотеке указано следующее подключение

Если вы любитель соединять провода по порядку, то исправьте в программе описание подключения на следующее
#define cs 3
#define sclk 4
#define mosi 5
#define dc 6
#define rst 7
И подключите по следующей схеме
Использование данной библиотеки позволяет

выводить на экран текст
рисовать линии
рисовать прямоугольники
рисовать окружности

// HY-1.8 SPI (С)2013 ALEN Studio by Little_Red_Rat

// Демонстрация работы HY-1.8 SPI
//
#define cs 3
#define sclk 4
#define mosi 5
#define dc 6
#define rst 7

// Описание цветов
#define           BLACK           0x0000
#define           RED            0x001F
#define           BLUE             0xF800
#define           GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define WHITE           0xFFFF

#include <ST7735.h>
#include <SPI.h>

ST7735 tft = ST7735(cs, dc, mosi, sclk, rst); 

void setup(void) {

  tft.initR(); // initialize a ST7735R chip

}
void loop() {


  tft.fillScreen(BLACK); // закрашиваем экран в черный цвет
  tft.drawString(43, 10, "ARDUINO", RED); // пишем слово ARDUINO красным цветов сверху экрана
  tft.drawCircle(64, 80, 50, WHITE ); // рисуем окружность в центре экрана радиусом 50 точек белым цветом
  tft.fillCircle(64, 80, 40, WHITE ); // рисуем закрашенную окружность в центре экрана радиусом 40 точек белым цветом
  tft.drawRect(54, 45 , 20, 70, GREEN ); // рисуем прямоугольник с началом в точке 54,45 со сторонами 20 и 70 зеленым цветом
  tft.fillRect(34, 70 , 60, 20, BLUE); // рисуем закрашенный прямоугольник с началом в точке 34,70 со сторонами 60 и 20 синим цветом
  tft.drawLine(0, tft.height-1, tft.width-1, 0, WHITE ); // рисуем линию из точки 0,127 (ширина-1) в точку 159(высота -1),0 белым цветом
  tft.drawVerticalLine(123 , 5 , 150 , WHITE ); // рисуем вертикальную линию из точки 123,5 длиной 150 белым цветом
  tft.drawHorizontalLine(5 , 155 , 118 , WHITE ); // рисуем вертикальную линию из точки 5,155 длиной 118 белым цветом

  delay(1000);

}


 Пара скриншотов примера из библиотеки




понедельник, 13 мая 2013 г.

DHT11 ARDUINO (+1602, +5110)


Измерить температуру в проектах ARDUINO можно несколькими способами. Самые распространенные:

·        Термистор (аналог)
·        LM35 (аналог)
·        DHT11 (цифра)
·        18B20 (цифра)

Рассмотрим цифровой датчик DHT11. Для подключения требуется три провода. Выдает цифровое значение температуры и влажности

·        Питание от 3 до 5.5 В. Есть возможность запитать от дата линии (подключение по двум проводам)
·        Диапазон  от –55°C до +125°C (–67°F to +257°F)
·        Точность ±0.5°C от –10°C до +85°C

Продается как отдельно так и в виде модуля. Первый вариант в разы дешевле (всего 100 руб). Во втором варианте уже есть резистор 4,7 кОм, нужный для подключения.

Подключаем по схеме. Обратите внимание, выход датчика подключен ко второму пину ARDUINO. В двух последних примерах он будет подключен к 6 пину, т.к второй используется для подключения дисплея.




Рассмотрим примеры работы.

1.   Вывод результатов на serial monitor

Тут все просто. Подключаем датчик, открываем serial monitorи каждые две секунды видим показания влажности и температуры



// DHT11 (С)2013 ALEN Studio by Little_Red_Rat

// Измерение температуры

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2

void setup()
{
  Serial.begin(9600);
  Serial.println("DHT11 TEST PROGRAM ");
}

void loop()
{
  int chk = DHT11.read(DHT11PIN);
  
  Serial.print("Humidity (%): ");
  Serial.println((float)DHT11.humidity, 2);

  Serial.print("Temperature (oC): ");
  Serial.println((float)DHT11.temperature, 2);
  
  delay(2000);
}

2.   Вывод результатов на дисплей 1602

Немного помучимся  зато напишем слова ТЕМПЕРАТУРА и ВЛАЖНОСТЬ по русски. Для этого добавим символы П,У,Л,Ж,Ь.


// DHT11 (С)2013 ALEN Studio by Little_Red_Rat

// Измерение температуры

#include <LiquidCrystal.h>
#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 6

byte PE_lit[8] =
{
  B11111,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B00000,
};

byte EL_lit[8] =
{
  B00111,
  B01001,
  B10001,
  B10001,
  B10001,
  B10001,
  B10001,
  B00000,
};

byte ZH_lit[8] =
{
  B10001,
  B10101,
  B10101,
  B01110,
  B10101,
  B10101,
  B10001,
  B00000,
};

byte MZ_lit[8] =
{
  B10000,
  B10000,
  B10000,
  B11110,
  B10001,
  B10001,
  B11110,
  B00000,
};

byte U_lit[8] =
{
  B10001,
  B10001,
  B10001,
  B01111,
  B00001,
  B00001,
  B11110,
  B00000,
};

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup()
{
  lcd.createChar(1, PE_lit);
  lcd.createChar(2, U_lit);
  lcd.createChar(3, EL_lit);
  lcd.createChar(4, ZH_lit);
  lcd.createChar(5, MZ_lit);
  
  lcd.begin(16, 2);
  lcd.setCursor(0, 0);
  lcd.print("TEM\1EPAT\2PA");
  lcd.setCursor(1, 1);
  lcd.print("B\3A\4HOCT\5");
}

void loop()
{

 int chk = DHT11.read(DHT11PIN);

    lcd.setCursor(12, 0);
    lcd.print((float)DHT11.temperature, 1);
    lcd.setCursor(12, 1);
    lcd.print((float)DHT11.humidity, 1);
    
    delay(2000);
}

  3.    Вывод результатов на дисплей NOKIA 5110

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


// DHT11 (С)2013 ALEN Studio by Little_Red_Rat

// Измерение температуры

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 6
#include <LCD5110_Graph.h>
LCD5110 myGLCD(8,9,10,12,11);
extern uint8_t BigNumbers[];
extern uint8_t SmallFont[];

void setup()
{
  myGLCD.InitLCD(); // в качестве параметра можно указать контрастность (0-127), по умолчанию 79
  myGLCD.setFont(SmallFont);
}

void loop()
{
  int chk = DHT11.read(DHT11PIN);

  myGLCD.clrScr();
myGLCD.setFont(SmallFont);  
myGLCD.print("Temperature: ", CENTER, 5);
myGLCD.setFont(BigNumbers); 
myGLCD.printNumI(DHT11.temperature, CENTER, 20);
myGLCD.update();
  delay(2000);
  myGLCD.clrScr();
myGLCD.setFont(SmallFont);  
myGLCD.print("Humidity: ",CENTER, 5);
myGLCD.setFont(BigNumbers); 
myGLCD.printNumI(DHT11.humidity, CENTER, 20);
myGLCD.update();  
delay(2000);  
}