Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форум freeduino.ru → Сообщения от mogalkov
1) Ну, собирать программатор не обязательно, большинство дуин сами могут выступать в роли программатора.
2) Не то чтоб разработчики не учли, просто лицензия ардуино открытая http://creativecommons.org/licenses/by-sa/2.5/, да и назначение дуины не промышленное.
3) Не вижу особого смысла закрывать хекс.
По второму вопросу, если только вкл/выкл, не нужен моторшилд, нужно всего-то ,или подходящий по параметрам транзистор (МОСФЕТ самое оно) или реле или оптрон, и один цифровой выход дуины. Я выбрал бы реле, оно способно управлять нагрузками большой мощности, реле без разницы управляешь ты постоянным или переменным напряжением, а как недостатки у него всего-то скорость срабатывания(около 10мс) и габариты. Тебе рекомендую чтото типа такого:http://www.chipdip.ru/product/834-1a-b-c-05vdc.aspx, только покупать лучше в другом магазине, в этом все значительно дороже.
mogalkov пишет:Защита от считывания хекса устанавливается в fuse битах Lock Bits, читай даташит на контроллер, там описано. Если в локбитах запрета нет - то считать хекс не сложнее чем записать.
Это понятно, тогда другой вопрос - как с помощью Arduino IDE установить эти самые биты?
Arduino IDE к сожалению не дает таких возможностей, но наиболее простой вариант таков:
Создаешь и компилируешь скетч в ардуино иде (если зажать шифт при нажатии кнопки компиляции, то снизу в окошке можно увидеть путь к хексу), подключаешь программатор, http://freeduino.ru/arduino/isp.html здесь описано как. Записывать удобнее всего с помощью avrdude-serjtag + avrdude-GUI. Я брал тут: http://hobbytronic.ru/files/AVRdude-pack-setup.exe
Конфигурацию Lock-Bit лучше уточнить по даташиту, для АТмега168 unlock = 3F lock = 0F , для ATmega8 и ATmega328 меги вроде тоже, но лучше уточнить, ошибочная установка фузбитов может запороть контроллер.
VSTuner пишет:1.предварительно хотел предупредить о том, что 300 м по ethernet вы напрямую не передадите, максимум 150!
Несмотря на цифры, заявленные в спецификации ethernet, он работает даже на колючей проволоке и телефонной лапше (CAT1)!
Если использовать "обычную" витуху (CAT5е) то на 300 метров 10 мегабит в секунду легко заработает. на витой паре 7 категории 100 мегабит работает на расстоянии 200-250, может быть работает и на большем, на лично я такой протяженности линий не встречал. Если использовать кабель типа П-296 то на 100 мегабит работает на 300 вполне запросто, а уж 10 мегабит - на все 500 метров. Хотя конечно многое еще зависит от того, каков трансформатор, который последнее время чаще всего выполнен в виде единого модуля с самим разъемом ethernet.Ну а если использовать дополнительно пару медиаконвертеров и оптоволоконный кабель с одномодовым волокном, то и на 75 километров не предел (интересно кстати - будут ли в будущем делать Ethernet-шылды сразу с лазерным трансивером? поживем-увидем =)
Все возможно, при использовании соответствующих технологий.
По спецификации для ethernet 10/100/1000 (стандарт IEEE группы 802.3.) длина провода категории 4/5/5е составляет 96м. Я лично если надо больше, то ставлю в разрыв свитч (5портов стоит 400р. акорп) так как просто усилитель сигналов стоит дороже. По опыту могу сказать что да, можно тянуть длиннее, без всяких усилителей, но во первых это менее удобно при последующем обслужимании сети, во вторых очень сильно идут потери(Удельное электрическое сопротивление меди 0,0172Ом·мм2/м, считай...). И насколько я знаю (может чего и упустил, и чтото в стандартах поменялось) cat 7 пока что официально такого стандарта нету, а лапша телефонная никак не cat1. Стандарты cat это именно сетевые стандарты, и относятся они именно к типу проводника в проводе.
Защита от считывания хекса устанавливается в fuse битах Lock Bits, читай даташит на контроллер, там описано. Если в локбитах запрета нет - то считать хекс не сложнее чем записать.
Крона через lm7805 сойдет, схема что ты нарисовал нужна для подключения к переменному напряжению, например к розетке через понижающий трансформатор.
Не только видел но и делал, более того, возможность перепрошивки не теряется, ведь микросхему можно установить на панельку, или вывести разъем под ISP. Вообще для работы ATMega достаточно питания, и для совместимости со скетчем кварца на 16МГц. Также желательно подтянуть ногу ресет к плюсу резистером < 4К7 .
Вот несколько:
http://freeduino.ru/forum/viewtopic.php?id=141
http://freeduino.ru/forum/viewtopic.php?id=130
http://freeduino.ru/forum/viewtopic.php?id=136
Видео работы устройства: http://www.youtube.com/watch?v=ghqfvw53gIA
Стоит у меня домашний сервер, и вот проблема: или шумит жутко, или перегревается и виснет. Немного подумав решил что соорудив управление куллерами с этой проблемой хоть не окончательно, но справлюсь.
Контроллер решил использовать в корпксе TQFP32 (ATMEGA168-20AU). Куллеры у меня немного различаются - один имеер 2 вывода (только питание), на втором есть 3й контакт - скорость вращения. Скорость вращения регулировать решил через ШИМ. Отображать решил в процентах. На управление решил сделать два режима:
1)Управляется автоматически, в зависимости от температуры. При 45С скорость 70%. При 50С скорость 78%. Третий показатель температуры задается переменным резистером, и включает вращение на 100%. При этом режиме отображается: текущая температура, заданная температура и скорость куллеров в процентах.
2)Ручное управление. Два потенциометра регулируют скорость вращения каждый своего куллера. При этом режиме отображается: Скорость вращения кулера с датчиком в оборотах в минуту (rpm), скорость вращения в процентах, текущая температура.
Выбор режима управления определяется переключателем, встроенным в один из переменных резистеров. Второй резистер в автоматическом режиме управляет выбором критической температуры. В ручном режиме каждый резистер управляет своим кулером.
Детали использовал:
HL1 = Светодиод по вкусу
HL2 = Светодиод по вкусу
IC1 = DS18B20
IC2 = ATMEGA168-20AU
LCD = WH1602M-YGH-CTK
M1 = Кулер 12v
M2 = Кулер 12В с датчиком
R1 = 1k
R2 = 10k
R3 = 4.7k
R4 = 50KПеременный с выключателем
R5 = 50KПеременный
R6 = 100
R7 = 100
R8 = 10k
R9 = 10k
S1 = Выключатель в резисторе
VD1 = диод любой smd
VD2 = диод любой smd
VD3 = диод любой smd
VD4 = диод любой smd
VT1 = КТ315б
VT2 = КТ315б
X = 16MHz
Схема в формате spl7 http://mogalkov.ath.cx/fanbus/fanbus.spl7
Плата в формате lay http://mogalkov.ath.cx/fanbus/fancontrol002.lay
Скетч:
//Эта библиотека входит в комплект АРДУИНО ИДЕ
#include <LiquidCrystal.h> //библиотека ЛСД экранчика
//Эту библиотеку брал тут: http://robocraft.ru/files/library/OneWire.zip
#include <OneWire.h> //Библиотека работы с 1-ware
//А эту тут: dallas.milesburton.com/index.php?title=Dallas_Temperature_Control_Library#Latest
#include <DallasTemperature.h>//Библиотека работы с термодатсиками 1-ware
#define pwmpinA 10 //Выход ШИМ 1
#define pwmpinB 11 //Выход ШИМ 2
#define HallSensor 2 // pin для датчика оборотов вентилятора (прерывание)
#define ONE_WIRE_BUS 1 //Датчик температуры на аналоговом входе 5
//переключатель встроен в переменный резистор, как только повернул ручку - включился управляемый в ручную режим
#define SWBTN 0 //Переключатель режима работы (Авто/Управляемый)
OneWire oneWire(ONE_WIRE_BUS);//скажем библиотеке где у нас градусник
DallasTemperature sensors(&oneWire);//скажем библиотеке где у нас градусник
LiquidCrystal lcd(5,6,7,8,9,12); //пины подключения ЛСД
int potB=5; //потенциометр изменения оборотов 2
int potA=0; //потенциометр изменения оборотов 1
int NbTopsFan, Calc, fadeValue, fadeValueA, procfade, procfadeA, CtempA,CtempB; //целочисленные переменные для расчетов
typedef struct{ // Вводим новый тип переменных для вентиляторов
char fantype;
unsigned int fandiv;
}fanspec;
//Массив переменных нового типа
fanspec fanspace[3]={{0,1},{1,2},{2,8}};
//Переменная, отвечающая за выбор типа датчика вентилятора (1 – униполярный датчик Холла, 2 –биполярный датчик Холла)
char fan = 1;
//Эта функция у нас будет вызываться при каждом прерывании
void rpm(){NbTopsFan++;}
void rpmcalk()//подсчитываем обороты кулера
{
NbTopsFan = 0; // Обнуляем переменную, содержащую обороты
delay (1000); //Ждем 1 секунду
Calc = ((NbTopsFan * 60)/fanspace[fan].fandiv); //Рассчитываем величину оборотов за 60 секунд, поделенную на множитель вентилятора
}
void lcdprn()//отображаем информацию на экран
{
lcd.clear();//очистка экрана
lcd.setCursor(0, 0);//курсор на координаты
lcd.print("RPM:");//пишем текст
lcd.print(Calc);//пишем скорость кулера из переменной
lcd.setCursor(8, 0);//курсор на координаты
lcd.print("Spd1:");//пишем текст
lcd.print(procfade);//пишим проценты скорости кулера1
lcd.setCursor(0, 1);//курсор на координаты
lcd.print("Spd2:");//пишем текст
lcd.print(procfadeA);//пишим проценты скорости кулера2
lcd.setCursor(8, 1);//курсор на координаты
lcd.print("Temp:");//пишем текст
lcd.print(CtempA);//пишим температуру
lcd.print("C");//пишем текст
}
void lcdprnA()//отображаем информацию на экран в режиме автоконтроля
{
lcd.clear();//очистка экрана
lcd.setCursor(0, 1);//курсор на координаты
lcd.print("AUTO");//пишем текст значащий что выбран автоконтроль температуры
lcd.setCursor(9, 1);//курсор на координаты
lcd.print("Spd:");//пишем текст
lcd.print(procfade);//пишим проценты скорости кулеров
lcd.setCursor(0, 0);//курсор на координаты
lcd.print("Tmp:");//пишем текст
lcd.print(CtempA);//пишим текущюю температуру
lcd.print("C");//пишем текст
lcd.setCursor(8, 0);//курсор на координаты
lcd.print("CrT:");//пишем текст
lcd.print(CtempB);//пишим температуру КРИТИЧЕСКОГО реагирования
lcd.print("C");//пишем текст
}
void PotReadALL()//читаем и считаем потенциометры
{
fadeValue=analogRead(potA);//читаем первый потенциометр
fadeValueA=analogRead(potB);//читаем второй потенциометр
fadeValue=fadeValue/4;//уменьшаем показания первого потенциометра до приемлимых для ШИМ вывода
if (fadeValue<=128){fadeValue=128;}//Ограничиваем минимум оборотов до 50%
procfade=(fadeValue/2.54);//пересчитываем показания первого потенциометра в проценты
fadeValueA=fadeValueA/4;//уменьшаем показания второго потенциометра до приемлимых для ШИМ вывода
procfadeA=(fadeValueA/2.54);//пересчитываем показания второго потенциометра в проценты
}
void TempTOvalue()//Читаем температуру с градусника
{
sensors.requestTemperatures();//Опрашиваем градусники
//градусник может быть не один, протокол 1-ware позволяет подключать
//много устройств паралельно, но на моем дисплее место хватило токо на
//один показатель температуры
CtempA=sensors.getTempCByIndex(0);//присваиваем температуру переменной
}
//ручная регулировка скорости вращения
void manualcontrol(){
PotReadALL();//читаем и считаем потенциометры
rpmcalk();//считаем скорость кулера
TempTOvalue();
lcdprn();//Выводим информацию на дисплей
analogWrite(pwmpinA, fadeValue);//задаем скорость вращения кулера 1
analogWrite(pwmpinB, fadeValueA);//задаем скорость вращения кулера 2
}
void autocontrol()//Автоконтроль температуры
{
PotReadALL();//читаки потенциомерты(с них получим установку критической температуры)
CtempB=fadeValueA/3; //переводим результат потенциометра в температуру от 0 до 85
TempTOvalue();//меряем температуру
fadeValue=0;//сбрасываем показатель скорости
if (CtempA>=45){fadeValue=180;}//сверяем скорость с критами
if (CtempA>=50){fadeValue=200;}//сверяем скорость с критами
if (CtempA>=CtempB){fadeValue=254;}//сверяем скорость с заданой температурой, если задана
//температура ниже предыдущих сверок скорость ВСЕГДА на максимуме.
procfade=(fadeValue/2.54);//пересчитываем показания первого потенциометра в проценты
lcdprnA();//Выводим информацию на дисплей
analogWrite(pwmpinA, fadeValue);//задаем скорость вращения кулера 1
analogWrite(pwmpinB, fadeValue);//задаем скорость вращения кулера 2
}
void setup() {
pinMode(HallSensor, INPUT); // Настраиваем pin на получение прерываний
pinMode(SWBTN,INPUT); //пин на переключатель -на вход
attachInterrupt(0, rpm, RISING); //Привязываем прерывание по номеру 0 к нашей функции, причем высчитываться
// она будет каждый раз при смене сигнала
sensors.begin();//включаем сенсор температуры
lcd.begin(16, 2);//Выставляем параметры экрана
lcd.home();//очищаем экран и переводим курсор в начало
}
void loop() {
if (digitalRead(SWBTN)==HIGH){manualcontrol();} //если переключатель включен - ручное управление вентиляторами
else {autocontrol();}//иначе - автоконтроль
}
//При разработке этого устройствы использовал следующие статьи:
//http://mk90.blogspot.com/2010/08/arduino.html
//http://robocraft.ru/blog/arduino/136.htmlhttp://mogalkov.ath.cx/fanbus/FANBAS002.7z Здесь лежит архив со схемами, скетчем и библиотеками.
Температуру зря не мерил, у меня в часах(http://freeduino.ru/forum/viewtopic.php?id=136), 7805 греется от 12В около 80С, повесил радиатор и порядок, год уже работают без проблем. Попробуй если уж очень температура напрягает, снизить напряжение например вольт до 6-7 с помощью LM317 (регулируемый стаб), а уже от туда на дуину пускать. Просто вероятнее всего плавится у тебя не столькр припой, сколько то чем лудили плату. Чтоб уж точно убедиться, если температуру померить не можешь, просто включи и приложи пос61 (Самый распространенный припой)
Не знаю какие припои на фридуино, сам пользуюсь разными, сплав вуда(60С) и сплав розе(96С) использую для лужения плат, какая-то китайская паста baku bk5063 (175С) для фена, ПОС-61 для паяльника (температура пайки 190...260 °С).
По этому мне то что плавится припой вокруг стаба ничего и не говорит. Нужно именно померить. Также желательно померить ток на входе, в разрыв (последовательно) между + аккумулятором и +входа дуины вешай амперметр, если покажет болеше 800мА, значит стаб не тянет. Заменить на более мощьный - не знаю, по параметрам можно, но есть ли подходящий по размерам и цоколевке - хз.
что значит "Motor Shield v2 с допилом для совместной работы"?
какая температура стабилизатора в градусах цельсия?
Греется ли стаб если стоит только Motor Shield?
Греется ли стаб если стоит только Ethernet Shield?
В обход стабилизатора это на моторшилде отдельный разъем с перемычкой выбора внешнее-внутреннее?
Стаб MC33269DT–5.0? Может температура и не критична?
Про него в даташите сказано: Operating Junction Temperature Range TJ –40 to +150 °C
mogalkov пишет:Стабилизатор выдает стабильные 5В(или около того), ты даешь ему 12В, 12В-5В=7В, Куда делись 7В? На обогрев помещения.
При нормальных нагрузках стабилизатору такое не страшно. Мне потому и интересно, кто столько Хавает. С целью запитать его отдельным стабилизатором, сняв нагрузку со стабилизатора freeduino.
Или стабилизатор заменить на аналог более мощный.
Вообще стоит почитать даташит стаба, а какова его крит. температура. Также стоит померить до какой-же именно температуры греется стаб.
Нагревают стаб не только излишки напряжения, но и проходящий через него ток (а моторшилд с моторчиками? Они ток не плохо кушают). Стоит попробовать отключить моторчики и посмотреть какая температура стабилизатора.
Cо сбросом стало понятно (пришел на форум с этим же вопросом), спасибо.
А вы когда запитываете arduino и Ethernet shild, стабилизатор сильно греется? А если еще и Motor Shild?
Столкнулся с тем, что 3 платы (Ethernet Shield v1.21, Freeduino Through-Hole и Motor Shield v2 с допилом для совместной работы) запитаные от 12В аккумулятора нагружают стабилизатор так, что от его нагрева припой вокруг него становиться жидким. Непонятно мне, что там так сильно хавает...
Стабилизатор выдает стабильные 5В(или около того), ты даешь ему 12В, 12В-5В=7В, Куда делись 7В? На обогрев помещения.
delay(50);//задержка для защиты от двойного нажатия, стоит ее подкорректировать под себя
увеличивай время задержки, попробуй 100 150 200 250 300 и так далее.
Также может помоч кондер мелкий (10пФ -100пФ) паралельно кнопке.
Еще для устранения дребезга контактов можно попробовать так:
// проверка кнопки
void buttonread()
{
b = digitalRead(button);// читаем состояние кнопки
//Операция A % B возвращает остаток от деления числа A на B, в данном случае на 100.
// А поскольку условие сравнивает его с нулем, то блок операторов в
//фигурных скобках исполнится только если число миллисекунд будет кратно 100: 100, 200, 300
if ( (millis() % 100) == 0) {
if (b == LOW) // если кнопка нажата
{
C=C+1; //нажали кнопку - увеличили на 1 хранилище
if (C>4){C=0;}//Для примера - 5 положений 0 1 2 3 4, если больше - очищаем хранилище
}
}
delay(50);//задержка для защиты от двойного нажатия, стоит ее подкорректировать под себя
Serial.println(C);
}Вот тут не хочет из цикла выходить
Не пойму почему?for(int j = 0; j <= 15; j++) // цикл
{
b = digitalRead(button);// читаем состояние кнопки
v = analogRead(pot); //мигаем и меняем частоту
v /= 4;
digitalWrite(led10, HIGH);
digitalWrite(led11, LOW);
delay(v);
digitalWrite(led10, LOW);
digitalWrite(led11, HIGH);
delay(v);
Потому что состояние кнопки только читается, но не сравнивается.
добавь в цикл проверку кнопки: if (b==LOW){break;}
Не совсем понял почему кнопка не нажата 1(HIGH), кнопка на размыкание, или кнопка на землю с резистером подтяжки к плюсу? Без схемы не очень понятно.
1) Чтобы кнопка прерывала работу цикла - добавь проверку кнопки внутрь цикла. Например так:
for(int shim10 = 0; shim10 <=255; shim10 +=5) //здесь прервет
{
b = digitalRead(button);// читаем состояние кнопки
if (b == 0){break;} // если кнопка нажата прервать цикл
analogWrite(led10, shim10);
delay(30);
}
for(int shim10 = 255; shim10 >=0; shim10 -=5)
{
b = digitalRead(button);// читаем состояние кнопки
if (b == 0){break;} // если кнопка нажата прервать цикл
analogWrite(led10, shim10);
delay(30);
}2)чтобы использовать кнопку как переключатель нескольких положений надо добавить переменную-хранилище положений и использовать ее для сравнения. Пример:
int led10 = 10;
int led11 = 11;
int led12 = 9;
int led13 = 6;
int button = 2;
int v;// время мигания - регулирутся переменником
int b;// состояние кнопки
int C=0;//переменная-хранилище положений
//поскольку проверка кнопки будет повторяться, чтобы не ломать
//клавиатуру и пальцы вынесем все это в отдельную функцию
void buttonread()
{
b = digitalRead(button);// читаем состояние кнопки
if (b == LOW) // если кнопка нажата
{
C=C+1; //нажали кнопку - увеличили на 1 хранилище
if (C>4){C=0;}//Для примера - 5 положений 0 1 2 3 4, если больше - очищаем хранилище
}
delay(130);//задержка для защиты от двойного нажатия, стоит ее подкорректировать под себя
}
void setup()
{
pinMode(led10, OUTPUT);
pinMode(led11, OUTPUT);
pinMode(led12, OUTPUT);
pinMode(led13, OUTPUT);
pinMode(button, INPUT);
}
void loop()
{
buttonread(); //читаем кнопки используя свою функцию
//Для выбора положений мне удобнее switch-case, но можно и на if - else if, вопрос удобства.
switch (C)
{
case 4: //положение 4, горят все светодиоды
digitalWrite(led10, 1);
digitalWrite(led11, 1);
digitalWrite(led12, 1);
digitalWrite(led13, 1);
break;
case 3: //положение 3, мигают все светодиоды
int i;//Для мигания введем переменную хранилище состояний мигания
i=i+1;//увеличиваем
if (i==2){i=0;}//ограничиваем
digitalWrite(led10, i);
digitalWrite(led11, i);
digitalWrite(led12, i);
digitalWrite(led13, i);
buttonread(); //читаем кнопки используя свою функцию, поскольку в нее уже внесена задержка
//дополнительную паузу не ставим
break;
case 2://а тут поиграем с ШИМ
for(int shim10 = 0; shim10 <=255; shim10 +=5)
{
analogWrite(led10, shim10);
analogWrite(led11, shim10);
analogWrite(led12, shim10);
analogWrite(led13, shim10);
buttonread();//читаем кнопки используя свою функцию, поскольку в нее уже внесена задержка
//дополнительную паузу опять не ставим
if (C!=2){break;}//проверяем, небыло ли изменений в хранилище. Именно так и прервем цикл
}
for(int shim10 = 255; shim10 >=0; shim10 -=5)
{
analogWrite(led10, shim10);
analogWrite(led11, shim10);
analogWrite(led12, shim10);
analogWrite(led13, shim10);
analogWrite(led10, shim10);
buttonread();//читаем кнопки используя свою функцию, поскольку в нее уже внесена задержка
//дополнительную паузу и опять не ставим.
if (C!=2){break;}//проверяем, небыло ли изменений в хранилище
}
break;
case 1://тут все просто выключим
digitalWrite(led10, 0);
digitalWrite(led11, 0);
digitalWrite(led12, 0);
digitalWrite(led13, 0);
break;
default: //если положение хранилища не попадает под описанные ранее, в нашем случае это 0
//что оно делает не предумал
break;
}
}Если есть другая дуина, даже без разъема Х1, все равно можно сделать из нее программатор:
http://mk90.blogspot.com/2011/01/arduin … oader.html
Видео работы:http://www.youtube.com/watch?v=ghEI2i6yKLU
DS1307 это часы реального времени. http://mogalkov.ath.cx/rtc/DS1307.pdf" даташит
Вот схема принципиальная:
Очень внимательно надо отнестись к выбору кварца, от этого зависит точность часов. Не каждый кварц подойдет - в даташите указано что внутренняя емкость кварца нужна 12.5pF. Лучше всего использовать кварц от ненужной материнской платы (он на ней для хода системных часов компьютера). Припаивать кварц лучше как можно ближе к мс(я прямо к ножкам паял).
Также для работы часов необходима батарейка на 3В. Я особо не замарачивался, выпаял с той-же мамки что и кварц.
Перечень элементов:
Bat1 = 3V
C1 = 470µ 25v
C2 = 470µ 25v
C3 = 100n
C4 = 100n
HL1 = ARL-5213RGBC/4C
LCD1 = WH1602A-YGH-CTK
R1 = 1k
R2 = 1k
R3 = 50k//потенциометр выбора настройки и скорости мигания
R4 = 50k//потенциометр установки времени
R5 = 100
R6 = 100
R7 = 100
R8 = 1k
R9 = 1k
R10 = 10k
S1 = тумбле //Переключатель установки
S2 = ртактовая кнопка с фиксацией //переключатель лампы
U1 = 7805
U2 = ATMEGA168
U3 = DS1307
Z1 = 32.768kHz
Z2 = 16 MHz
Печатная плата:
http://mogalkov.ath.cx/rtc/AT168_RTC_004.layПлата в формате lay
Вникать в протокол I2C не стал, скачал готовую библиотеку:
брал тутhttp://code.google.com/p/sjunnesson/downloads/list Также выложил тут: http://mogalkov.ath.cx/rtc/DS1307.rar
скетч:
//необходимые библиотеки, последнюю надо скачивать
#include <LiquidCrystal.h>
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h> //брал тут “http://code.google.com/p/sjunnesson/downloads/list"
//переменные
int realpot;//Переменная хранения данных потенциометра
int setpot; //Переменная хранения данных потенциометра
int potPinST=2; //потенциометр установки времени
int potPinSE=3;//потенциометр выбора настройки и скорости мигания
int potsec000;//установка времени из потенциометра секунды
int potmin000;//установка времени из потенциометра минуты
int pothor000;//установка времени из потенциометра часы
int potday000;//установка времени из потенциометра дни
int potmon000;//установка времени из потенциометра месяцы
int potyer000;//установка времени из потенциометра годы
LiquidCrystal lcd(7, 6, 5, 4, 3, 2); //пины ЛСД
//хранение времени для чтения с часов и вывода на экран
int hr_00;
int mn_00;
int sc_00;
int DD_00;
int MM_00;
int YY_00;
//хранение времени для установки часов
int hr_01=0;
int mn_01=0;
int sc_01=0;
int DD_01=0;
int MM_01=0;
int YY_01=0;
//делитель времени (:)
char delitel =':';
int ledPinR = 9; //пины светодиода
int ledPinG = 11; //пины светодиода
int ledPinB = 10; //пины светодиода
int swset; //параметр переключателя установки
int swled;//параметр переключателя светодиодной лампы
void btn_read() //Запись состояния переключателей в переменные
{
swset=digitalRead(12); //Переключатель установки
swled=digitalRead(8); //переключатель лампы
}
void Var2LCD()//вывод времени на экран
{
lcd.clear(); //очистка экрана
// координаты ; текст
lcd.setCursor(0,0);lcd.print(hr_00);
lcd.setCursor(2,0);lcd.print(delitel);
lcd.setCursor(3,0);lcd.print(mn_00);
lcd.setCursor(5,0);lcd.print(delitel);
lcd.setCursor(6,0);lcd.print(sc_00);
lcd.setCursor(0,1);lcd.print(DD_00);
lcd.setCursor(2,1);lcd.print('-');
lcd.setCursor(3,1);lcd.print(MM_00);
lcd.setCursor(5,1);lcd.print('-');
lcd.setCursor(6,1);lcd.print(YY_00);
}
void RTC_red2var()//читаем с часов в переменные
{
hr_00=RTC.get(DS1307_HR,true);
mn_00=RTC.get(DS1307_MIN,false);
sc_00=RTC.get(DS1307_SEC,false);
DD_00=RTC.get(DS1307_DATE,false);
MM_00=RTC.get(DS1307_MTH,false);
YY_00=RTC.get(DS1307_YR,false);
}
void RTC_set2var()//Установка часов
{
do {
lcd.clear();//очищаем экран
RTC.stop(); //останавливаем часы
btn_read();//читаем переключатели в переменные
setpot=analogRead(potPinSE); //читаем потенциометр выбора настройки от него зависит что настраиваем
setpot=setpot/128;//Делим показания потенциометра выбора настройки на 128 (1024/128=8) получаем от 0 до 8 вариантов (используются 2-7)
switch (setpot) {
case 2:
//;секунды -Все остальные параметры устанавливаются примерно также
realpot=analogRead(potPinST);//читаем потенциометр установки времени
realpot=realpot/16;//Делим показания потенциометра на 16 (1024/16=64) получаем от 0 до 64 вариантов
if (realpot>=60) {realpot=59;}//ограничиваем до 59 (ни разу не видел у себя на часах 64 секунды, может просто невнимательно смотрел)
potsec000=realpot;//установка времени из потенциометра секунды
lcd.setCursor(0, 0); //координаты отображения
lcd.print("SECONDS");//отображаем текст
lcd.setCursor(1, 1);//координаты отображения
lcd.print(potsec000);//отображаем установки времени из потенциометра секунды
RTC.set(DS1307_SEC,potsec000);//записываем время в часы
break;
case 3:
//;минуты
realpot=analogRead(potPinST);
realpot=realpot/16;
if (realpot>=60) {realpot=59;}
potmin000=realpot;
lcd.setCursor(0, 0);
lcd.print("MINUTES");
lcd.setCursor(1, 1);
lcd.print(potmin000);
RTC.set(DS1307_MIN,potmin000); //set the minutes
break;
case 4:
//;часы
realpot=analogRead(potPinST);
realpot=realpot/40;
if (realpot>23) {realpot=23;}
pothor000=realpot;
lcd.setCursor(0, 0);
lcd.print("HOURS");
lcd.setCursor(1, 1);
lcd.print(pothor000);
RTC.set(DS1307_HR,pothor000); //set the hours
break;
case 5:
//;дни
realpot=analogRead(potPinST);
realpot=realpot/32;
if (realpot>31) {realpot=31;}
if (realpot<=0) {realpot=1;}
potday000=realpot;
lcd.setCursor(0, 0);
lcd.print("DAYS");
lcd.setCursor(1, 1);
lcd.print(potday000);
RTC.set(DS1307_DATE,potday000); //set the date
break;
case 6:
//;месяцы
realpot=analogRead(potPinST);
realpot=realpot/84;
if (realpot>12) {realpot=12;}
if (realpot<=0) {realpot=1;}
potmon000=realpot;
lcd.setCursor(0, 0);
lcd.print("MONTH`S");
lcd.setCursor(1, 1);
lcd.print(potmon000);
RTC.set(DS1307_MTH,potmon000); //set the month
break;
case 7:
//;годы
realpot=analogRead(potPinST);
realpot=realpot/4;
potyer000=realpot;
lcd.setCursor(0, 0);
lcd.print("YEARS");
lcd.setCursor(1, 1);
lcd.print(potyer000);
RTC.set(DS1307_YR,potyer000); //set the year
break;
//если показания потенциометра выбора настройки не подпадают под установки времени
//выводит текст SET TIMES AND DATES
default:
lcd.setCursor(0, 0);
lcd.print("SET TIMES");
lcd.setCursor(1, 1);
lcd.print("AND DATES");
break;
}
delay(5);
} while (swset==LOW);//если переключатель выключен - повторяем по новой
RTC.start();//запускаем часы
}
void color_led()//мигаем трехцветным светодиодом
{
do {
RTC_red2var();//прочитать время в переменные
Var2LCD();//отобразить переменные времени на экран
btn_read();//проверяем переключатели
setpot=analogRead(potPinSE);//используем потенциометр выбора настройки для установки скорости изменения цвета
setpot=setpot/128;
int delayTime = setpot;
// красный нарастает, синий гаснет
for (int i=0; i<256; i++)
{
btn_read();//проверяем переключатели
setpot=analogRead(potPinSE);
setpot=setpot/128;
int delayTime = setpot;
analogWrite(ledPinR, i);
analogWrite(ledPinG, 0);
analogWrite(ledPinB, 256-i);
delay(delayTime);
}
// красный гаснет, зеленый нарастает
RTC_red2var();//прочитать время в переменные
Var2LCD();//отобразить переменные времени на экран
for (int i=0; i<256; i++)
{
btn_read();//проверяем переключатели
setpot=analogRead(potPinSE);
setpot=setpot/128;
int delayTime = setpot;
analogWrite(ledPinR, 256-i);
analogWrite(ledPinG, i);
analogWrite(ledPinB, 0);
delay(delayTime);
}
// зеленый гаснет, синий нарастает
RTC_red2var();//прочитать время в переменные
Var2LCD();//отобразить переменные времени на экран
for (int i=0; i<256; i++)
{
btn_read();//проверяем переключатели
setpot=analogRead(potPinSE);
setpot=setpot/128;
int delayTime = setpot;
analogWrite(ledPinR, 0);
analogWrite(ledPinG, 256-i);
analogWrite(ledPinB, i);
delay(delayTime);
}
} while (swset==LOW);
RTC_red2var(); //прочитать время в переменные
Var2LCD(); //отобразить переменные времени на экран
analogWrite(ledPinR, 0);//выключаем светодиод
analogWrite(ledPinG, 0);//выключаем светодиод
analogWrite(ledPinB, 0);//выключаем светодиод
}
void setup()
{
pinMode(ledPinR, OUTPUT); //пин светодиода у нас выход
pinMode(ledPinG, OUTPUT); //пин светодиода у нас выход
pinMode(ledPinB, OUTPUT); //пин светодиода у нас выход
pinMode(12, INPUT);//Переключатель установки
pinMode(8, INPUT); //переключатель лампы
lcd.begin(16, 2);//экран у меня 16 символов на 2е строки
lcd.home();
}
void loop()
{
btn_read(); //проверяем переключатели
if (swset==LOW){RTC_set2var();} //если переключатель установки 0 запускаем установку даты-времени
else if (swled==LOW){color_led();} //Если переключатель лампы 0 запускаем функцию лампы
else {
RTC_red2var();//прочитать время в переменные
Var2LCD(); //отобразить переменные времени на экран
delay(5);
}
}ИМХО Дуина удобна для прототипирования, не более. Делать на дуине конечное устройство - глупо. Покупал (фридуино 2009) только изза того что какой нибудь стандартный AVR-JTAG атмеловский стоит значительно дороже, а на ардуино иде с авр студио+вингсс перешел так как оно удобнее. До этого в основном с тини 13 работал. Делать готовое устройство на дуине - ГЛУПОСТЬ и РАСТОЧИТЕЛЬСТВО. Да и по размерам не удобно, я лучше платку сооружу лутом, на тотже АТмега168-20АU, он меньше (AU значит корпус TQFP для smd монтажа). На той же нано который стоит, но там почему то 328я, отличяющаяся только памятью и ценой.
Как вариант можно еще поискать чистую плату под ардуину, запаять на нее FT232RL и пересадить МК.
Для моделирования и отладки дополнительных модулей удобно использовать Proto-Shield http://freeduino.ru/arduino/proto-shield_kit.html
ИМХО не уверен что этот вариант лучше чем на старую плату напаять юсб-юарт конвертер, и уж точно он мало чем отличается от варианта программатор + контроллер. Учитывая что с программатором ты не привязан к конкретной плате. Используя контроллеры поддерживаемые ардуино иде, можно прошивать их и не имея самой дуины. Ардуино иде создает HEX файл, а узнать где он можно нажав шифт+кнопка компиляции.
Через rx tx прошивается через встроеный загрузчик, так ты сможешь прошит либо через ft232rl, либо поковыряв в программе ардуино (хз где, но по идее где-то можно). Тебе же надо рошивать через ISP, а для этого нужен программатор. Самый простой и дешевый через lpt или com.
http://easyelectronics.ru/avr-shag-perv … mator.html
Следующий -на ft232rl: http://easyelectronics.ru/img/readydev/ … g/ftbb.JPG я себе именно такой собрал, хотя сейчас использую как програматор freeduino 2009. Программатор ISP имеет еще один плюс, для того чтоб собрать устройство на основе дуины (ну или другом авр) тебе достаточно всего лишь мк, кварца и питания (все остальные детали зависят уже от того что собираешься делать).
Если контроллер мигает -он жив. Все остальное не настолько капризное. А вот понять стоит ли она возни вопрос отдельный. Посмотри по деталям, цена платы в основном это контроллер ,ft232rl и труд изготовления. Все остальные детали от 1р до 50р каждая.
Соответственно вот тебе варианты действий:
1)Купить и припаять ft232rl.
2)Купить или собрать программатор ISP.
3)Купить новую дуину. (желательно чтоб ее можно было использовать как программатор ISP)
http://www.platan.ru/cgi-bin/qwery.pl/i … ;group=101 сам недавно покупал здесь.
Без установленной на дуину ft232rl ей тоже можно пользоваться, токо прошивать отдельно, через программатор.
Вот простой программатор на LPT порт
http://www.myrobot.ru/stepbystep/mc_programmer.php
http://eldigi.ru/site/programmators/2.php
вот на ftdi простейший:
http://easyelectronics.ru/skorostnoj-av … llera.html
Форум freeduino.ru → Сообщения от mogalkov
Форум работает на PunBB, при поддержке Informer Technologies, Inc