ОБЛЕГЧЁННЫЕ БИБЛИОТЕКИ

Сборник лёгких библиотек для Arduino и некоторых модулей, в разработке находятся ещё несколько, позже будут добавлены сюда.

БИБЛИОТЕКА MICRO WIRE

Лёгкая библиотека с минимальным набором инструментов для работы с модулями по шине I2C для микроконтроллеров поколения ATmega328

  • Не является полноценным аналогом библиотеки Wire!!!
  • Нужна для работы i2с библиотек из сборника на этой странице!
  • Не все библиотеки на Wire смогут работать с microWire (не является заменой Wire)
  • microWire создана для работы с устройствами в ручном режиме
  • Разработано by Egor ‘Nich1con’ Zaharov
void begin(int baudrate = 400);
void setClock(uint32_t clock);
void beginTransmission(void);
void beginTransmission(uint8_t addr);
void endTransmission(void);
void write(uint8_t data);
void requestFrom(uint8_t addr);
uint8_t receive_ack(void);
uint8_t receive_nack(void);
#include "microI2C.h"

byte data = 228; // запишем 228
int addr = 1337; // в ячейку 1337

void setup() {
  I2C_init(); // без параметра - 400 кгц
  /* запишем байт в EEPROM AT24C32 */

  I2C_start();
  I2C_transmit(0b10101110); // 0b1010xxx + write(0) => [xxx(ноги микры) == 111] => 0b10101110;
  I2C_transmit(highByte(addr)); // кидаем адрес ячейки
  I2C_transmit(lowByte(addr));
  I2C_transmit(data); // пишем сам байт
  I2C_stop(); // окончили передачу
  delay(3); // при циклической запяси - обязатльно

  /*
    // если хотим проверить , что байт записался верно
    Serial.begin(9600);
    I2C_start();
    Serial.println(TWSR, HEX);
    I2C_transmit(0b10101110); // 0b1010111 + write(0)
    Serial.println(TWSR, HEX);
    I2C_transmit(highByte(addr)); // кидаем адрес ячейки
    I2C_transmit(lowByte(addr));
    I2C_start();
    I2C_transmit(0b10101111); // 0b1010111 + read(1)
    Serial.print("data: ");
    Serial.println(I2C_receive_nack());
    I2C_stop();
  */

  // запишем во все ячейки от 0 до 255 ( переполнение байта )
  for ( int i = 0; i < 4095; i++) {
    EE_write(0x57, i, i); // 0x57 == 0b1010111 - адрес нашего чипа без бита чтения записи (7бит)
  }
  /*
    // выплюнем все содержимое в сериал
    Serial.begin(9600);

    for ( int i = 0; i < 4095; i++) {
      Serial.println(EE_read(0x57, i));
    }
  */
}

void loop() {}

/* оформим чтение запись в виде функций */

void EE_write(uint8_t chipAddr , uint16_t cellAddr , uint8_t data) {
  I2C_start();
  I2C_transmit((chipAddr << 1)); // "write"
  I2C_transmit(highByte(cellAddr));
  I2C_transmit(lowByte(cellAddr));
  I2C_transmit(data);
  I2C_stop();
  delay(3);
}

uint8_t EE_read(uint8_t chipAddr , uint16_t cellAddr) {
  I2C_start();
  I2C_transmit((chipAddr << 1)); // "write"
  I2C_transmit(highByte(cellAddr));
  I2C_transmit(lowByte(cellAddr));
  I2C_start();
  I2C_transmit((chipAddr << 1) | 0x1 ); // "read"
  uint8_t data = I2C_receive_nack();
  I2C_stop();
  return data;
}

БИБЛИОТЕКА MICRO DS3231

Ультра лёгкая библиотека для работы с RTC DS3231

  • Для работы нужна библиотека microWire.h
  • Разработано by Egor ‘Nich1con’ Zaharov
	MicroDS3231();	// конструктор
void setTime(uint8_t seconds , uint8_t minutes , uint8_t hours , uint8_t date, uint8_t month, uint16_t year);	// установка времени
void setTime(uint8_t param);	// установка времени == времени компиляции
bool lostPower(void);			// проверка на сброс питания
uint8_t getSeconds(void);		// получить секунды
uint8_t getMinutes(void);		// получить минуты
uint8_t getHours(void);			// получить часы
uint8_t getDay(void);			// получить день недели
uint8_t getDate(void);			// получить число
uint16_t getYear(void);			// получить год
uint8_t getMonth(void);			// получить месяц

Подключается к шине i2c (пины A4 и A5)

  • DS3231 -> Arduino
  • GND -> GND
  • VCC -> VCC
  • SDA -> A4
  • SCL -> A5

// демо возможностей библиотеки
#include "microDS3231.h"
MicroDS3231 rtc;

void setup() {
  Serial.begin(9600);
  
  if (rtc.lostPower()) {  //  при потере питания
    rtc.setTime(COMPILE_TIME);  // установить время компиляции
  }

  //rtc.setTime(SEC, MIN, HOUR, DAY, MONTH, YEAR); // устанвока времени вручную
}

void loop() {
  printTime();
  delay(500);
}

void printTime() {
  Serial.print(rtc.getHours());
  Serial.print(":");
  Serial.print(rtc.getMinutes());
  Serial.print(":");
  Serial.print(rtc.getSeconds());
  Serial.print(" ");
  Serial.print(rtc.getDay());
  Serial.print(" ");
  Serial.print(rtc.getDate());
  Serial.print("/");
  Serial.print(rtc.getMonth());
  Serial.print("/");
  Serial.println(rtc.getYear());
}

БИБЛИОТЕКА MICRO LCD i2c

Библиотека для LCD дисплея с переходником на I2C, облегчена за счёт использования microWire вместо Wire

  • Для работы нужна библиотека microWire.h

Библиотека является полным аналогом обычной LiquidCrystal_I2C

LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS );
void clear();
void home();
void noDisplay();
void display();
void noBlink();
void blink();
void noCursor();
void cursor();
void scrollDisplayLeft();
void scrollDisplayRight();
void printLeft();
void printRight();
void leftToRight();
void rightToLeft();
void shiftIncrement();
void shiftDecrement();
void noBacklight();
void backlight();
void autoscroll();
void noAutoscroll(); 
void createChar(uint8_t, uint8_t[]);
void createChar(uint8_t location, const char *charmap);

Подключается к шине i2c (пины A4 и A5)

  • LCD I2C -> Arduino
  • GND -> GND
  • VCC -> VCC
  • SDA -> A4
  • SCL -> A5

#include "microLiquidCrystal_I2C.h"

LiquidCrystal_I2C lcd(0x3f, 20, 4);
// адрес дисплея 0x3f или 0x27
// ширина дисплея (тут 20 символов)
// высота дисплея (тут 4 строки)

void setup()
{
  lcd.init();                      // initialize the lcd
  lcd.init();
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3, 0);
  lcd.print("Hello, world!");
  lcd.setCursor(2, 1);
  lcd.print("Ywrobot Arduino!");
  lcd.setCursor(0, 2);
  lcd.print("Arduino LCM IIC 2004");
  lcd.setCursor(2, 3);
  lcd.print("Power By Ec-yuan!");
}

void loop()
{
}

БИБЛИОТЕКА MICRO DS18B20

Лёгкая версия библиотеки для работы с датчиком температуры Dallas ds18b20, занимает гораздо меньше места в памяти, чем стандартная. Поддерживаемые платформы: все Arduino
Разработано by Egor, допилено AlexGyver

MicroDS18B20(uint8_t pin);    // создать объект
void requestTemp();           // запросить температуру
float getTemp(void);          // получить температуру

Подключается пином data в любой цифровой пин Arduino (у Nano/Uno это D0-D13, A0-A5)

  • DS18B20 -> Arduino
  • GND -> GND
  • VCC -> VCC
  • DATA -> D0-D13, A0-A5. Пин дополнительно подтягивается к VCC резистором на 4.7 кОм

#include "microDS18B20.h"

MicroDS18B20 sensor1(2);  // датчик на пине 2
MicroDS18B20 sensor2(3);  // датчик на пине 3

void setup() {
  Serial.begin(9600);  
}

void loop() {
  Serial.print("t: ");
  sensor1.requestTemp();
  sensor2.requestTemp();
  delay(1000);  // между request и get нужна секунда (асинхронный режим)
  Serial.print(sensor1.getTemp());
  Serial.print(" ");
  Serial.println(sensor2.getTemp());
}

Опрос одного датчика с разрешением 12 бит без библиотеки. Работа с датчиком занимает 400 байт Flash (в несколько раз меньше обычной либы)

#define DS_PIN 2  // пин датчика

void setup() {
  Serial.begin(9600);
  dallas_begin(DS_PIN); // инициализация  
}

void loop() {
  dallas_requestTemp(DS_PIN); // запрос
  delay(1000);
  float value = dallas_getTemp(DS_PIN);
  Serial.println(value); // получаем температуру
}

// ======= dallas =======
void dallas_begin(uint8_t pin) {
  pinMode(pin, INPUT);
  digitalWrite(pin, LOW);
}
void dallas_requestTemp(uint8_t pin) {
  if (oneWire_reset(pin)) return;
  oneWire_write(0xCC, pin);
  oneWire_write(0x44, pin);
}
float dallas_getTemp(uint8_t pin) {
  uint8_t data[2];
  if (oneWire_reset(pin)) return;
  oneWire_write(0xCC, pin);
  oneWire_write(0xBE, pin);
  data[0] = oneWire_read(pin);
  data[1] = oneWire_read(pin);
  float result = (float)((data[1] << 8) | data[0]) * 0.0625; //>
  return result;
}

// ======= 1wire =======
boolean oneWire_reset(byte pin) {
  pinMode(pin, 1);
  delayMicroseconds(640);
  pinMode(pin, 0);
  delayMicroseconds(2);
  for (uint8_t c = 80; c; c--) {
    if (!digitalRead(pin)) {
      uint32_t tmr = micros();
      while (!digitalRead(pin)) {
        if (micros() - tmr > 200) return false;
      }
      return false;
    }
    delayMicroseconds(1);
  }
  return true;
}
void oneWire_write(uint8_t data, byte pin) {
  for (uint8_t p = 8; p; p--) {
    pinMode(pin, 1);
    if (data & 1) {
      delayMicroseconds(5);
      pinMode(pin, 0);
      delayMicroseconds(90);
    } else {
      delayMicroseconds(90);
      pinMode(pin, 0);
      delayMicroseconds(5);
    }
    data >>= 1;
  }
}
uint8_t oneWire_read(byte pin) {
  uint8_t data = 0;
  for (uint8_t p = 8; p; p--) {
    data >>= 1;
    pinMode(pin, 1);
    delayMicroseconds(2);
    pinMode(pin, 0);
    delayMicroseconds(8);
    bool dataBit = digitalRead(pin);
    delayMicroseconds(80);
    if (dataBit) data |= 0x80;
  }
  return data;
}

ОСТАЛЬНЫЕ БИБЛИОТЕКИ

У меня есть ещё очень много всего интересного! Смотрите полный список библиотек вот здесь.