четверг, 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);  
}