- Ардуино для школьников
Ардуино для школьников
Практика для школьников. Мясищев А.А.
Первый урок: Подключение светодиодов к Ардуино.
Подключение 1-го светодиода(Ардуино UNO)
Подключение 3-х светодиодов
Подключение 4-х светодиодов
Подключение светодиода к Ардуино NANO
Задание.
Последовательно зажечь четыре светодиода от 2-го вывода Ардуино к 5-му и через секунду последовательно с 5-го вывода их погасить
Второй урок: Счетчик на семисегментном индикаторе
Внутренняя схема и подключение семисегментного индикатора с общим анодом
Подключение к Ардуино
Таблица 1. Соответствие сигналов на выходе Ардуино с отображаемыми символами
Фото счетчика от 0 до 9 на Ардуино и семисегментном индикаторе
Программы
Программа для отображения на семисегментном индикаторе цифры 7
Программа для отображения символов 0, 4, 9
byte Seg[11] = { // Битовое кодирование символов в соответствии с табл.1
0b10000001, // Символ 0
0b11101011, // Символ 1
0b01000101,
0b01000011,
0b00101011,
0b00010011,
0b00010001,
0b11001011,
0b00000001,
0b00000011, // Символ 9
0b11111110 // Символ точка
};
void setup() {
Serial.begin(9600);
for(int i=2;i<=9;i++){
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);}
}
void loop() {
// Отображение символа 0
for (int i = 0; i < 8; i++) { // Цикл по 8-битам массива Seg
boolean enSeg = bitRead(Seg[0], i); // Чтение очередного бита Seg[0]
digitalWrite(i+2 , enSeg);// включение/выключение сегмента на основе бита
Serial.print(enSeg); Serial.print(" "); // Контрольная распечатка
}
Serial.println("");
delay(2000);
// Отображение символа 4
for (int i = 0; i <8; i++) {
boolean enSeg = bitRead(Seg[4], i);
digitalWrite(i+2 , enSeg);
Serial.print(enSeg); Serial.print(" ");
}
Serial.println("");
delay(2000);
// Отображение символа 9
for (int i = 0; i < 8; i++) {
boolean enSeg = bitRead(Seg[9], i);
digitalWrite(i+2 , enSeg);
Serial.print(enSeg); Serial.print(" ");
}
Serial.println("");
delay(2000);
}
Здесь функция
bitRead()
считывает состояние указанного бита числа.
Синтаксис:
bitRead(x, n)
Параметры
x: число, у которого необходимо считать бит
n: номер бита, состояние которого необходимо считать. Нумерация начинается с младшего значащего бита (крайнего правого) с номером 0
Возвращаемые значения: 0 или 1
Программа отображения всех символов массива Seg[i] с интервалом 1 секунда
byte Seg[11] = {
0b10000001,
0b11101011,
0b01000101,
0b01000011,
0b00101011,
0b00010011,
0b00010001,
0b11001011,
0b00000001,
0b00000011,
0b11111110
};
void setup() {
for(int i=2;i<=9;i++){
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);}
}
void lcd(int num){
for (int i = 0; i < 8; i++) {
boolean enSeg = bitRead(Seg[num], i);
// включаем/выключаем сегмент на основе полученного значения
digitalWrite(i+2 , enSeg);
}
}
void loop() {
for(int i=0;i<=10;i++) { // последовательное отображение символов массива Seg[i]
lcd(i);
delay(1000);
}
}
Задание.
Вывести на индикатор кроме всех цифр и точки еще 4-е любые символы латинского алфавита
Третий урок: Термометр, отображающий температуру с датчика DS18B20 на один семисегментный индикатор
Основные технические характеристики DS18B20:
Диапазон измерений от –55°C до +125°C;
Точность измерения ±0.5°C в диапазоне от -10°C до +85°C;
Точность измерения: ±2 °C в диапазоне от -55 до 125 °C
Настраиваемое пользователем цифровое разрешение от 9 до 12 бит;
Данные передаются посредством 1-проводного последовательного интерфейса 1-Wire®
Датчик имеет 64-битныйt уникальный серийный номер;
Рабочее напряжение питания от 3.0В до 5.5В;
Время опроса: не более 0.75с.
Датчик DS18B20 и способы подключения одного и нескольких датчиков
Подключение к Ардуино на монтажной плате
Программа вывода целой части значения температуры на один сегмент
#include <OneWire.h>
#include <DallasTemperature.h>
#include <stdio.h>
#include <stdlib.h>
#define ONE_WIRE_BUS 10 // Подключение датчика температуры к 10 выводу
OneWire oneWire(ONE_WIRE_BUS); // Создание экземпляра класса
DallasTemperature sensors(&oneWire); // Создание экземпляра класса
byte buf[4];
byte Seg[12] = { // Массив представления символа
0b10000001, // Ноль
0b11101011,
0b01000101, // Два
0b01000011,
0b00101011,
0b00010011,
0b00010001,
0b11001011,
0b00000001,
0b00000011, // Девять
0b11111110, // Точка
0b11111111 // Пусто
};
void setup() {
sensors.begin(); // Вызов метода класса
for(int i=2;i<=9;i++){
pinMode(i,OUTPUT);
digitalWrite(i,HIGH);}
}
void lcd(int num){ // Функция вывода символа
for (int i = 0; i < 8; i++) {
boolean enSeg = bitRead(Seg[num], i);
// включаем/выключаем сегмент на основе полученного значения
digitalWrite(i+2 , enSeg);
}
}
void loop() {
sensors.requestTemperatures();
float cel=sensors.getTempCByIndex(0); // Определение температуры
dtostrf(cel,2,0,buf); // Запись числа cel в символьный массив buf
int temH=buf[0]-48; //Преобразование десятичного кода символа в число
int temL=buf[1]-48;
lcd(temH); // Вывод старшей части температуры
delay(500);
lcd(11); // Ничего не высвечивать
delay(100);
lcd(temL);// Вывод младшей части температуры
delay(500);
lcd(10); // Вывод точки между высвечиванием температуры
delay(1000);
}
Задание.
Вывести на один семисегментный индикатор целую часть температуры и одну цифру десятичной части (например 26.9)