Hi-Tech Arduino Компьютеры Интернет
HV-Lab Reference Linux Форум
Справочники Libraries Windows Галерея
Электроника Hardware Hardware Загрузки
Печатные платы Forum Программирование Мини-чат
[ Февр 02, 08:04 ] кулибин: Давно было пора заменить год в подписи. Скоро 10 лет
[ Окт 10, 14:00 ] кулибин: Заполни анкету по адресу http://goo.gl/xG0JCJ и получи +1 к карме!
[ Фев 21, 08:36 ] кулибин: Сервер упал, но уже поднялся с обновленной системой и новыми возможностями.
RSS статьи
 
Статьи

Статьи->Arduino->Моргало светодиодное [ Поиск ]

Моргало светодиодное - по мигаем
Отправил: sabac, Суббота, 08 Мая 2010 11:30
Мигнуть светодиодом можно очень большим количеством способов и малую часть ,что может осуществить arduino я опишу здесь. все листинги приведенные ниже оттестированы на arduino.
Мигалка первая и самая простая просто мигаем.
Схему рисовать смысла нет, так как будем мигать диодом подключенным на 13 цифровой выход .
Скетч элементарный:
void setup() {
//главная функция (настраиваем 13 вывод на выход)
pinMode(13, OUTPUT); //соответственно после этой фразы 13 становиться выходом

}

void loop() //основной цикл программы

{

digitalWrite(13, HIGH); // включаем светодиод подавая на 13 вывод логическую 1
//то есть подаем +5вольт
delay(1000); // ждем 1000 миллисекунд или 1 секунду
digitalWrite(13, LOW); // выключаем светодиод подавая на 13 вывод логический 0
//то есть подаем на вывод землю
delay(1000); // ждем 1000 миллисекунд или 1 секунду
}
Как видим это самый простой способ мигнуть светодиодом по этой программе видно что светодиод будет мигать каждую секунду.
Мигалка вторая.
Схема та же, а вот скетч уже интереснее.
void setup() {
//главная функция (настраиваем 13 вывод на выход)
pinMode(13, OUTPUT); //соответственно после этой фразы 13 становиться выходом
}
void loop() //основной цикл программы

{

for(int i=0;i<=300;i++)
/*
этой фразой был создан цикл объявлена переменная типа int переменой i присвоено начальное значение 0 создано правило проверки выхода из цикла гласящее что цикл закончен как только i станет равной 300 и также создан счетчик i++ при каждом обращении к которому i увеличивает свое состояние на 1.
*/
{
digitalWrite(13, HIGH); // включаем светодиод подавая на 13 вывод логическую 1
//то есть подаем +5вольт
delay(1000); // ждем 1000 миллисекунд или 1 секунду
digitalWrite(13, LOW); // выключаем светодиод подавая на 13 вывод логический 0
//то есть подаем на вывод землю
delay(1000); // ждем 1000 миллисекунд или 1 секунду
}
delay(30000); //ждем 1 минуту так заметнее
}
Из скетча видно что светодиод у нас мигает каждую секунду в течении 10 минут, после чего минуту отдыхает и опять мигает 10 минут.
Мигалка третья. (она же вторая но другими словами)
int i = 0; // объявлена переменная типа int
//переменой i присвоено начальное значение 0
void setup() //основной цикл программы

{

pinMode(13, OUTPUT);

}

void loop()

{
while(!i==300)
/*
этой фразой был создан цикл и создано провило проверки выхода из цикла гласяшее что цил закончен как толька i станет равной 300
*/
{
digitalWrite(13, HIGH); // включаем светодиод подавая на 13 вывод логическую 1
//то есть подаем +5вольт
delay(1000); // ждем 1000 миллисекунд или 1 секунду
digitalWrite(13, LOW); // выключаем светодиод подавая на 13 вывод логический 0
//то есть подаем на вывод землю
delay(1000); // ждем 1000 миллисекунд или 1 секунду
i++; //создан счетчик i++ при каждом обращении к которому
//i увеличивает свое состояние на 1.
}
delay(30000); //ждем 1 минуту так заметнее
}
Из скетча видно что светодиод у нас мигает каждую секунду в течении 10 минут, после чего минуту отдыхает и опять мигает 10 минут. Но в отличии от мигалка 2 эта использует цикл типа while который просто работает до тех пор пока состояние его условия остается верным. этот тип цикл очень удобен для математических вычислений высокой точностей он будет вычислять значение пока точность не будет соответствовать условию. По этому в условию я и на писал (!i==300) что значит что пока i не равно 300 условия верно так как ! означает логическую инверсию то есть !0=1б и на оборот.
Мигалка четвертая. (она же вторая но другими словами)
Или как мигнуть диодом в 2 раза реже поменяв только 2 знака.
void setup() {
//главная функция (настраиваем 13 вывод на выход)
pinMode(13, OUTPUT); //соответственно после этой фразы 13 становиться выходом

}

void loop() //основной цикл программы

{

for(int i=0;i<=300;i++)
/*
этой фразой был создан цикл
объявлена переменная типа int
переменой i присвоено начальное значение 0
создано правило проверки выхода из цикла
гласящее что цикл закончен как только i станет равной 300
и также создан счетчик i++ при каждом обращении к которому
i увеличивает свое состояние на 1.
*/
if(i%2==0) //эта фраза представляет собой условие
//при не правельной раскладке клавиатуры онаж это
// "ша" тоеть ша будет и сделаем
// но она просто следит за четностью значений
// переменной i это и записанно мной в условии
// (i%2==0) это значит что если остаток при делении на 2
// равен нулю то услове верно.
{
digitalWrite(13, HIGH); // включаем светодиод подавая на 13 вывод логическую 1
//то есть подаем +5вольт
delay(1000); // ждем 1000 миллисекунд или 1 секунду
digitalWrite(13, LOW); // выключаем светодиод подавая на 13 вывод логический 0
//то есть подаем на вывод землю
delay(1000); // ждем 1000 миллисекунд или 1 секунду
}
else // это вторая часть обьявления условия
// синтаксис команды if(){} else{}
//тоесть если условие у нас не верно и
// i не четная то срабатывает else и
delay(2000); // делаеться задержка в 2 секунды
delay(30000); //ждем 1 минуту так заметнее
}
В этом скетче было использовано условие, прочитав комментарии можно понять что это такое.
Мигалка пятая. (она же вторая но другими словами)
int i=0; // объявлена переменная типа int
void setup() {
//главная функция (настраиваем 13 вывод на выход)
pinMode(13, OUTPUT); //соответственно после этой фразы 13 становиться выходом

}

void loop() //основной цикл программы

{

digitalWrite(13,i=!i); // записываем в порт каждый раз противоположное значение текущего //состояния переменной i, i=!i значит что новое значение переменной //равно старому инверсии старого, то есть был 0 станет 1
delay(1000);
}
Как видно при компиляции этого мы экономим 2 байта а при больших программах это уже существенно.

Страшное слово прерывание

Мигалка шестая. (Страшное слово прерывание)
Мигаем по таймеру. Таймер удобно использовать если нужно вести опрос определенных сенсоров не смотря на то что в это время программа выполняет другие операции, таймер при срабатывании создает прерывание основного цикла программы и переводит в свою функцию . Для этого удобно использовать готовую библиотеку TimerOne.
#include "TimerOne.h"//подключаем библиотеку таймера

void setup()

{

pinMode(13, OUTPUT); // 13 на выход
Timer1.initialize(500000); // настраиваем таймер на срабатывания каждые пол секунды
Timer1.attachInterrupt(DIOD); // создаем прерывание срабатывающие при срабатывании таймера
// DIOD это название функции которую вызовет таймер
}
void DIOD()// функция таймера
{
digitalWrite(13, !digitalRead(13));// меняем состаение 13 на его же но противоположное
}
void loop()
{
while(1);// бесконечный цикл для премера того что таймер может и его прервать для выполнения своей функции
}
Как видно из скетча что программа работающая в основном цикле может быть любой , но при срабатывании таймера его функция отработает, и только после этого продолжаться выполнение основного цикла программы.
Мигалка седьмая.
Также существуют внешние прерывания они срабатывают как только на определенном входе arduino появиться лог 1 или 0 или переход с 0 в 1 или 1 в 0. то есть оно срабатывает при изменении состояния или при появлении 0 или 1.
mode определяет, на что должно срабатывать прерывание Четыре константы устанавливают определеное действие:
LOW срабатывание прерывания, когда на выводе низкий уровень напряжения,
CHANGE срабатывание прерывания каждый раз прис менене уровня напряжения на выводе
RISING срабатывание прерывания по фронту - когда состояние вывода изменяется от LOW к HIGH,
FALLING срабатывание прерывания по спаду - когда состояние вывода изменяется от HIGH к LOW

void setup()

{

pinMode(13, OUTPUT); // 13 на выход

attachInterrupt(0, DIOD, CHANGE); // настраиваем прерывание на изменение состояния цифрового //входа 2 который являеться входом нулевого прерывания
//создаем переход при срабатывние на функцию DIOD
}
void DIOD()// функция прерывания
{
digitalWrite(13, !digitalRead(13));// меняем состаение 13 на его же но противоположное
}
void loop()
{
while(1);// бесконечный цикл для премера того что прерывание может и его прервать для выполнения своей функции

}

Как видно из скетча что программа работающая в основном цикле может быть любой , но при срабатывании прерывания его функция отработает, и только после этого продолжаться выполнение основного цикла программы.
Сергей Базанов aka Sabac
Голосов Голосов: 11 - В среднем: 4.27

Добавить комментарий Оценить
Комментарии
esau
08 Мая 2010
Спасибо,очень наглядно

Статистика
Всего 205 статей в базе
Наиболее просматриваемые: Изготовление печатных плат фоторезистивным методом
Лучшие по оценкам: РЦВМ1 - Релейная Цифровая Вычислительная Машина

Пользователи в разделе статьи: 1 (0 Пользователи 1 Гости и 0 Скрытые пользователи)
Видимые пользователи:


 
 
Рейтинг@Mail.ru Яндекс цитирования службы мониторинга серверов Яндекс.Метрика

MKPortal©2003-2008 mkportal.it
MultiBoard ©2007-2009 RusMKPortal
Страница сгенерированна за 0.02373 секунд с 24 обращениями в базу данных

Athlon II X2 8Gb RAM 1500Gb HDD 100Mbps Ethernet службы мониторинга серверов


© RadioLokN 2005-2014 г.