Видео уроки
Обучение работе с микроконтроллером Ардуино. Автор Jeremy Blum. Перевод Amperka.ru
Урок 1. Первые шаги
Урок 2.1. Кнопки, PWM / ШИМ, функции
Урок 2.2. Кнопки, PWM / ШИМ, функции
Урок 3. Основы схемотехники
Урок 4.1. Аналоговые входы
Урок 4.2. Аналоговые входы
Урок 5. Моторы и транзисторы
Урок 5.2. Моторы и транзисторы
Включение/выключение светодиода на 13 пине
int outputPin = 13; //здесь храним номер контакта
int val; //здесь будет храниться принятый символ
void setup()
{
Serial.begin(9600); //установка порта на скорость 9600 бит/сек
pinMode(outputPin, OUTPUT); //устанавливаем 13 контакт в режим вывода
}
void loop()
{
if (Serial.available()) { //если есть принятый символ,
val = Serial.read(); // то читаем его и сохраняем в val
if (val == 'H') { // если принят симовол 'H',...
digitalWrite(outputPin, HIGH);// то включаем светодиод
}
if (val == 'L') { // если принят симовол 'L',
digitalWrite(outputPin, LOW); // то выключаем светодиод
}
}
}
Включение трёх светодиодов с клавиатуры ПК
void setup() {
Serial.begin(9600); // подключаем серийную передачу данных на скорости 9600 бод:
for (int thisPin = 9; thisPin <= 13; thisPin++) { //при помощи цикла For и переменной thisPin перебираем порты от 9 до 13
pinMode(thisPin, OUTPUT); // и задаем им режим работы - выход
}
}
void loop() {
if (Serial.available() > 0) { //если в порту появляется информация то считываем ее в переменную inByte
int inByte = Serial.read();
switch (inByte) { // оператор выбора действия в зависимости от значения переменной inByte
case 'a': // если inByte равно 'а', то выполняем все строчки до команды break
digitalWrite(9, HIGH);
delay (200);
break;
case 'b': // если inByte равно 'b', то выполняем все строчки до команды break
digitalWrite(10, HIGH);
delay (200);
break;
case 'c': // если inByte равно 'c', то выполняем все строчки до команды break
digitalWrite(11, HIGH);
delay (200);
break;
default: // если inByte не равно ни одному из кейсов, то делаем то, что указано ниже
for (int thisPin = 9; thisPin < 12; thisPin++) // при помощи цикла перебираем все пины от 9 до 12 и..
{
digitalWrite(thisPin, LOW); // отправляем на них низкий сигнал
}
}
}
}
Синтаксис:
switch (var) {
case label:
// код для выполнения
break;
case label:
// код для выполнения
break;
default:
// код для выполнения
}
Алгоритмы
Массивы
UART
Символы
#include <math.h>
#define TERMIST_B 4300
#define VIN 5.02
#include <Wire.h> // подключаем библиотеку Wire
#include <LiquidCrystal_I2C.h> // подключаем библиотеку LiquidCrystal_I2C
float temperature1;
float temperature2;
byte bukva_P[8] = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000,}; // Буква "П"
LiquidCrystal_I2C lcd(0x3F,16,2); //создаем объект типа lcd с адресом 0x3F, 16 символов, 2 строки
void setup()
{
Serial1.begin(19200);
Serial.begin(19200); // связь с компом
lcd.init(); // инициализация дисплея
lcd.backlight(); // включение подсветки дисплея
// Настраиваем приём сообщений с других устройств
// Между командами даём время на их обработку
Serial1.print("AT+CMGF=1\r");
delay(300);
Serial1.print("AT+IFC=1, 1\r");
delay(300);
Serial1.print("AT+CPBS=\"SM\"\r");
delay(300);
Serial1.print("AT+CNMI=1,2,2,1,0\r");
delay(500);
}
String currStr = "";
// Переменная принимает значение True, если текущая строка является сообщением
boolean isStringMessage = false;
void loop()
{
float voltage1 = analogRead(A0) * VIN / 1024.0; // считываем датчик 1 и вычисляем напряжение на нем
float voltage2 = analogRead(A1) * VIN / 1024.0; // считываем датчик 2 и вычисляем напряжение на нем
float r1 = voltage1 / (VIN - voltage1); // вычисляем сопротивление термистора1
float r2 = voltage2 / (VIN - voltage2); // вычисляем сопротивление термистора2
float temperature1 = 1./( 1./(TERMIST_B)*log(r1)+1./(25. + 273.) ) - 273; // вычисляем температуру 1
float temperature2 = 1./( 1./(TERMIST_B)*log(r2)+1./(25. + 273.) ) - 273; // вычисляем температуру 2
lcd.createChar(1, bukva_P); // Создаем символ под номером 1, буква П
//Serial.print("аналог ");
//Serial.println(voltage);
lcd.setCursor(0, 0);
lcd.print("TEM\1 1");
lcd.setCursor(0, 1);
lcd.print(temperature1);
lcd.setCursor(9, 0); //устанавливаем курсор в нулевую позицию первой строки (не забываем, что строки тоже считаются от нуля, т.е. //верхняя строчка это нулевая, а нижняя это первая
lcd.print("\1"); // выводим на экран встроенный в Ардуину секундомер
lcd.setCursor(9, 1); //устанавливаем курсор в нулевую позицию первой строки (не забываем, что строки тоже считаются от нуля, т.е. //верхняя строчка это нулевая, а нижняя это первая
lcd.print(temperature2); // выводим на экран встроенный в Ардуину секундомер
if (!Serial1.available())
return;
char currSymb = Serial1.read();
if ('\r' == currSymb) {
if (isStringMessage) {
//если текущая строка - SMS-сообщение,
//отреагируем на него соответствующим образом
if (!currStr.compareTo("temp1")) {
Serial1.print("AT+CMGF=1\r");
delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
Serial1.println("AT + CMGS = \"+79223393568\"");
delay(100);
// Пишем текст сообщения
Serial1.println(temperature1);
delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
Serial1.println((char)26);
} else if (!currStr.compareTo("temp2")) {
Serial1.print("AT+CMGF=1\r");
delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
Serial1.println("AT + CMGS = \"+79223393568\"");
delay(100);
// Пишем текст сообщения
Serial1.println(temperature2);
delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
Serial1.println((char)26);
} else if (!currStr.compareTo("temp")) {
Serial1.print("AT+CMGF=1\r");
delay(100); // даём время на усваивание команды
// Устанавливаем адресата: телефонный номер в международном формате
Serial1.println("AT + CMGS = \"+79223393568\"");
delay(100);
// Пишем текст сообщения
Serial1.print("temp vhod ");
Serial1.println(temperature1);
Serial1.print("temp vihod ");
Serial1.println(temperature2);
delay(100);
// Отправляем Ctrl+Z, обозначая, что сообщение готово
Serial1.println((char)26);
}
isStringMessage = false;
} else {
if (currStr.startsWith("+CMT")) {
//если текущая строка начинается с "+CMT",
//то следующая строка является сообщением
isStringMessage = true;
}
}
currStr = "";
} else if ('\n' != currSymb) {
currStr += String(currSymb);
}
}