После подключения, достаточно загрузить вышеприведенную программу в Arduino, открыть serial monitor в Arduino IDE, в появившемся окне можно будет наблюдать значения температуры.
Самостоятельная работа #1: оставить компьютер с подключенным датчиком на сутки. Построить график температуры, например с помощью Excel или https://plot.ly/create/.
Самостоятельная работа #2: добавить в код зажигание светодиода, если температура становится выше определенного предела. Вместо светодиода можно также подключить пьезодинамик, как описано в предыдущей главе. Данная система может быть основой для автоматического контроля температуры, например в теплице.
Мы уже умеем обрабатывать нажатия кнопок, подключать разнообразные датчики и выводить информацию в компьютер через serial port. Осталось подключить отдельный экран, чтобы получить полностью автономно работающее устройство.
Обычный ЖК-экран может работать с Arduino, но для его подключения требуется задействовать слишком много выводов:
К счастью для нас, сейчас есть более удобный и современный путь - экраны, подключаемые по шине I2C. Шина I2C позволяет подключать различные устройства всего лишь с помощью двух проводов.
Мы будем использовать OLED-экран, имеющий 4 вывода для подключения - он показан на картинке слева. В продаже бывают и другие дисплеи, как на картинке справа - такой вариант не подойдет, при покупке важно не перепутать.
Само подключение при этом достаточно просто, для работы шины I2C требуется всего 4 провода - 2 линии данных, “земля” и “питание”. Также как и с 1Wire, на одной шине может быть подключено несколько разных устройств.
Само подключение показано на картинке:
На шине I2C может быть несколько устройств, поэтому чтобы передавать данные, мы должны знать адрес устройства. Удобнее всего для этого использовать программу i2c_scan, код которой показан ниже.
#include
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
Serial.println("Scanning...");
int nDevices = 0;
for(address = 1; address < 127; address++) {
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4) {
Serial.print("Unknow error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}
Если дисплей подключен правильно, то запустив Serial Monitor, мы увидим примерно такой текст:
0x3C - это и есть адрес нашего дисплея. Адрес также можно посмотреть на обратной стороне дисплея - но в моем случае там было написано 0х78. С неправильным адресом, разумеется, ничего не работало. Так что лучше лишний раз проверить.
Непосредственная работа с дисплеем состоит в посылке различных команд по шине I2C, но к счастью, нам этого делать не нужно - уже написаны готовые библиотеки. Их можно скачать по ссылкам https://github.com/adafruit/Adafruit-GFX-Library и https://github.com/adafruit/Adafruit_SSD1306 соответственно. Файлы необходимо скачать и распаковать в папку Документы\Arduino\libraries. В моем случае, я распаковал файлы в папки Adafruit_SSD1306 и Adafruit-GFX-Library.
Следующим шагом необходимо указать тип используемого в проекте дисплея. Для этого достаточно в файле Adafruit_SSD1306-master\Adafruit_SSD1306.h раскомментировать соответствующую строку. Всего доступны 3 варианта, например для дисплея 128х64 код будет выглядеть так:
#define SSD1306_128_64
// #define SSD1306_128_32
// #define SSD1306_96_16
Теперь все готово, и можно выводить информацию на дисплей. Перезапускаем Arduino IDE, чтобы загрузились новые библиотеки. В качестве примера рассмотрим несложный код.
#include
Adafruit_SSD1306 display(0);
static const unsigned char PROGMEM logo16_glcd_bmp[] = {
B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000
};
void setup() {
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Hello, world!");
display.drawBitmap(2, 14, logo16_glcd_bmp, 16, 16, 1);
display.drawLine(0, 40, 128, 40, WHITE);
display.drawLine(10, 50, 118, 50, WHITE);
display.display();
}
void loop() {
}
Разберем код подробнее.