Электрификация

Справочник домашнего мастера

Часы на atmega8

Суточный таймер на один выход, одним расписанием и часами реального времени на DS1307, код из видео.

код.

#include <EEPROM.h> #include <Wire.h> #include <LiquidCrystal.h> #define DS1307_I2C_ADDRESS 0x68 LiquidCrystal lcd(8, 9, 4, 5, 6, 7); const byte outPin = 13; // выход на реле byte setMinClockOn; // byte setHorClockOn; byte setMinClockOff; // byte setHorClockOff; byte key(){ //// для кнопок ЛСДшилда int val = analogRead(0); if (val < 50) return 5; else if (val < 150) return 3; else if (val < 350) return 4; else if (val < 500) return 2; else if (val < 800) return 1; else return 0; } /////////// часы .. byte decToBcd(byte val){ return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val){ return ( (val/16*10) + (val%16) ); } void setDateDs1307(byte second, // 0-59 byte minute, // 0-59 byte hour, // 1-23 byte dayOfWeek, // 1-7 byte dayOfMonth, // 1-28/29/30/31 byte month, // 1-12 byte year) // 0-99 { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.write(decToBcd(dayOfWeek)); Wire.write(decToBcd(dayOfMonth)); Wire.write(decToBcd(month)); Wire.write(decToBcd(year)); Wire.endTransmission(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 7); *second = bcdToDec(Wire.read() & 0x7f); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read() & 0x3f); *dayOfWeek = bcdToDec(Wire.read()); *dayOfMonth = bcdToDec(Wire.read()); *month = bcdToDec(Wire.read()); *year = bcdToDec(Wire.read()); } //// void setClock(){ // установка часов byte pos = 1; byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print(«set to save»); lcd.setCursor(0, 0); // выводим инфу if (hour < 10) lcd.print(«0»); lcd.print(hour); lcd.print(«:»); if (minute < 10) lcd.print(«0″); lcd.print(minute); lcd.print(» «); if (dayOfMonth < 10) lcd.print(«0»); lcd.print(dayOfMonth); lcd.print(«/»); if (month < 10) lcd.print(«0»); lcd.print(month); lcd.print(«/»); if (year < 10) lcd.print(«0″); lcd.print(year); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 13) pos += 3; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 3; else if (pos == 1 && KEY == 3) hour++; // крутим значения else if (pos == 1 && KEY == 4) hour—; else if (pos == 4 && KEY == 3) minute++; else if (pos == 4 && KEY == 4) minute—; else if (pos == 7 && KEY == 3) dayOfMonth++; else if (pos == 7 && KEY == 4) dayOfMonth—; else if (pos == 10 && KEY == 3) month++; else if (pos == 10 && KEY == 4) month—; else if (pos == 13 && KEY == 3) year++; else if (pos == 13 && KEY == 4) year—; if (hour > 23) hour = 0; else if (minute > 59) minute = 0; else if (dayOfMonth > 31) dayOfMonth = 0; else if (month > 12) month = 1; else if (year > 99) year = 0; }// конец цикла setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year); lcd.noBlink(); lcd.clear(); lcd.print(» Saved»); delay(1500); }/// void setOnOff(){ byte pos = 0; lcd.clear(); lcd.blink(); while(key() != 1){ // крутим цикл byte KEY = key(); // читаем состояние кнопок delay(200); lcd.setCursor(1, 1); lcd.print(«set to save»); lcd.setCursor(0, 0); // выводим инфу if (setHorClockOn < 10) lcd.print(«0»); lcd.print(setHorClockOn); lcd.print(«:»); if (setMinClockOn < 10) lcd.print(«0″); lcd.print(setMinClockOn); lcd.print(» «); if (setHorClockOff < 10) lcd.print(«0»); lcd.print(setHorClockOff); lcd.print(«:»); if (setMinClockOff < 10) lcd.print(«0″); lcd.print(setMinClockOff); lcd.setCursor(pos, 0); // устанавливаем курсор согласно позиции if (KEY == 5 && pos < 9) pos += 3; // крутим позицию else if (KEY == 2 && pos > 1) pos -= 3; else if (pos == 0 && KEY == 3) setHorClockOn++; // крутим значения else if (pos == 0 && KEY == 4) setHorClockOn—; else if (pos == 3 && KEY == 3) setMinClockOn++; else if (pos == 3 && KEY == 4) setMinClockOn—; else if (pos == 6 && KEY == 3) setHorClockOff++; else if (pos == 6 && KEY == 4) setHorClockOff—; else if (pos == 9 && KEY == 3) setMinClockOff++; else if (pos == 9 && KEY == 4) setMinClockOff—; if (setHorClockOn > 23) setHorClockOn = 0; else if (setMinClockOn > 59) setMinClockOn = 0; else if (setHorClockOff > 23) setHorClockOff = 0; else if (setMinClockOff > 59) setMinClockOff = 0; }// конец цикла lcd.noBlink(); lcd.clear(); EEPROM.write(0, setMinClockOn); EEPROM.write(1, setHorClockOn); EEPROM.write(3, setMinClockOff); EEPROM.write(4, setHorClockOff); lcd.print(» Saved»); delay(1500); }/// void menu(){ lcd.clear(); char menuTxt = {«set ON/OFF >>», «set clock >>»}; byte pos = 0; while(1){ delay(200); byte KEY = key(); lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print(«.»); lcd.print(menuTxt); if (KEY == 3 && pos != 0) pos—; else if (KEY == 4 && pos < 1) pos++; if (KEY == 5 && pos == 0) setOnOff(); else if (KEY == 5 && pos == 1) setClock(); } } void setup(){ Wire.begin(); lcd.begin(16, 2); lcd.clear(); pinMode(outPin, OUTPUT); digitalWrite(outPin, LOW); setMinClockOn = EEPROM.read(0); setHorClockOn = EEPROM.read(1); setMinClockOff = EEPROM.read(3); setHorClockOff = EEPROM.read(4); } void loop() { byte second, minute, hour, dayOfWeek, dayOfMonth, month, year; getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // обработка кнопок if (key() == 1) menu(); // если нажата селект else if (key() == 3) digitalWrite(outPin, HIGH); else if (key() == 4) digitalWrite(outPin, LOW); // сравниваем время и управляем выходом// if (setMinClockOff == minute && setHorClockOff == hour && second == 0) digitalWrite(outPin, LOW); if (setMinClockOn == minute && setHorClockOn == hour && second == 0) digitalWrite(outPin, HIGH); // lcd.clear(); lcd.setCursor(0, 0); if (hour < 10) lcd.print(«0»); lcd.print(hour); lcd.print(«:»); if (minute < 10) lcd.print(«0»); lcd.print(minute); // lcd.print(«:»); // if (second < 10) lcd.print(«0″); // lcd.print(second); // lcd.setCursor(8, 0); // lcd.print(» «); lcd.setCursor(0, 1); if (dayOfMonth < 10) lcd.print(«0»); lcd.print(dayOfMonth); lcd.print(«/»); if (month < 10) lcd.print(«0»); lcd.print(month); lcd.print(«/»); if (year < 10) lcd.print(«0»); lcd.print(year); // lcd.setCursor(11, 0); if (setHorClockOn < 10) lcd.print(«0»); lcd.print(setHorClockOn); lcd.print(«:»); if (setMinClockOn < 10) lcd.print(«0»); lcd.print(setMinClockOn); lcd.setCursor(11, 1); if (setHorClockOff < 10) lcd.print(«0»); lcd.print(setHorClockOff); lcd.print(«:»); if (setMinClockOff < 10) lcd.print(«0»); lcd.print(setMinClockOff); lcd.setCursor(7, 0); if (digitalRead(outPin)) lcd.print(«ON «); else lcd.print(«Off»); delay(200); // нужно для нармальной работы кнопок }

Всем привет! Собрав таймер на Ардуино из этой инструкции, вы сможете контролировать включение и выключение ваших устройств в нужное вам время. Это могут быть ночные фонари, система орошения сада и т.д. Мы воспользуемся Ардуино, дисплеем и RTC 1307, отображающим и управляющим временем. Вы можете задать часы «ВКЛ» и «ВЫКЛ» при помощи 4 кнопок, что позволит вам изменять настройки микросхемы таймера.

Также вы научитесь создавать часы, базирующиеся на Ардуино. Я приложил схему из fritzing и видео, так что вы без проблем соберёте данное устройство.

Сначала посмотрите видео, чтобы понять, о чем идет речь, используйте его как руководство.

Шаг 1: Материалы

  • Arduino Uno
  • Модуль RTC 1307
  • Дисплей 16X2
  • Модуль реле 5V
  • Подстроечный потенциометр 10K
  • Резистор 1K
  • Резисторы 10K x 4 штуки
  • Кнопки x 4 штуки
  • Макетная плата, джамперы.

Шаг 2: Устанавливаем часы

Следуйте схеме из Fritzing.

Соедините 5V и GND с Ардуино с соответствующими контактами (Красный – 5V, синий – земля)

Дисплей к Ардуино:

  1. VSS к GND
  2. VDD к 5V
  3. VO к центру потенциометра
  4. RS к пину 2
  5. RW к GND
  6. EN или E к пину 3
  7. D0 NC
  8. D1 NC
  9. D2 NC
  10. D3 NC
  11. D4 к пину 4
  12. D5 к пину 5
  13. D6 к пину 6
  14. D7 к пину 7
  15. A к 5V
  16. K к GND через резистор 1K
  17. Остальные контакты потенциометра на 5V и GND

RTC к Arduino:

  • SDA к пину 4
  • SCL у пину 5
  • GND и 5V

Шаг 3: Устанавливаем время

Пришло время настроить часы. Запустите код «Set time RTC». Этот скетч возьмёт данные о дате и времени из вашего компьютера прямо во время компиляции кода и использует их для программирования RTC. Если у вас на компьютере неправильные установки, то поправьте их перед запуском программы. Затем нажмите кнопку Upload, чтобы немедленно загрузить откомпилированный код.

Внимание: Если вы скомпилируете код, а загрузите его позже, то данные о времени устареют.

Далее откройте окно Serial Monitor, чтобы увидеть, что время было установлено.

Файлы

  • Set_Time_RTC.ino

Шаг 4: Часы

После того, как установите время, откройте и загрузите скетч «Clock with RTC LCD». Потенциометр в схеме нужен для настройки контрастности дисплея, покрутите его, чтобы чётко видеть символы.

Файлы

  • Clock_with_RTC_LCD.ino

Шаг 5: Устанавливаем таймер

Теперь мы добавим кнопки и реле. Опять же, следуйте схеме Fritzing.

Пины 8,9, 10 и 11 соединены с GND через резисторы 10K. Когда вы нажмете на кнопку, то на контакты пойдёт напряжение 5V.

Реле соединяется с пином 12. С помощью него можно управлять вашими устройствами, но будьте осторожны с максимальной нагрузкой на реле!

Шаг 6: Таймер

Откройте и загрузите код «Timer with on off set point». Нажимайте кнопки, чтобы сместить время назад или вперёд. Если электронный таймер будет в пределах настроенного интервала, то он начнет работать сразу же. Если же он не попадает в нужный интервал, то будет ждать час «ВКЛ».

Этот код имеет интересные функции, которые можно использовать в других проектах. Я постарался отделить каждую функцию, чтобы всё было максимально понятным.

Файлы

Нам понадобятся:

  • Arduino UNO или иная совместимая плата;
  • модуль ZS-042 с часами реального времени DS3231;
  • модуль с часами реального времени DS1307;
  • соединительные провода (рекомендую вот такой набор);
  • макетная плата (breadboard);
  • персональный компьютер со средой разработки Arduino IDE.

1Подключение к Arduino модуля ZS-042 с часами реального времени DS3231

Модуль ZS-042 с часами реального времени (RTC) имеет следующие характеристики:

  • Календарь до 2100 года с отсчётами секунд, минут, часов, числа месяца, месяца, дня недели и года (с учётом високосных годов);
  • 12- или 24-часовой формат;
  • 2 будильника;
  • напряжение питания: 3,3 или 5 В;
  • точность: ± 0.432 сек в день;
  • внутренний кварцевый генератор с частотой 32768 Гц;
  • поддерживаемый протокол: I2C со скоростью от 100 до 400 кГц;
  • габариты: 38×22×15 мм;
  • диапазон рабочих температур −40…+85°C.

На модуле присутствуют: микросхема таймера реального времени DS3231 (1 на рисунке), микросхема памяти AT24C32 объёмом 32 кбит (2 на рисунке), места для трёх перемычек A0, A1 и A2 (3 на рисунке), с помощью которых можно менять адресацию памяти микросхемы памяти; место для батареи питания размером 2032 (4 на рисунке).

Внешний вид модуля ZS-042

Назначение выводов модуля такое:

Название Назначение
32K выход генератора 32 кГц;
SQW выход прямоугольного сигнала; частота задаётся с помощью регистра управления 0x0E и может составлять 1, 1024, 4096 или 8192 Гц;
SCL шина тактовых импульсов интерфейса I2C;
SDA шина данных интерфейса I2C;
VCC питание – 3,3 или 5 вольт;
GND земля.

С противоположной стороны модуля выводы SCL, SDA, питание и земля дублируются. На выходе 32K постоянно присутствует сигнал с встроенного кварцевого генератора:

Сигнал на выходе 32K модуля ZS-042

Теперь нужно подключить модуль к Arduino. Мы уже знаем, что линия SDA нужно подключать к пину A4 Arduino UNO и Nano, а линию SCL – к пину A5. Для питания возьмём выход 5V платы Arduino, землю модуля соединим с землёй Arduino.

Схема подключения модуля ZS-042 с таймером DS3231 к Arduino

Вот как это выглядит вживую:

Модуль ZS-042 с таймером DS3231 подключён к Arduino

Рассмотрим диаграммы записи и чтения для таймера реального времени DS3231:

Обзор передачи данных по последовательной шине I2CДиаграмма записи и диаграмма чтения таймера реального времени DS3231

Как видно, тут всё стандартно для интерфейса I2C. Осталось только узнать, какие регистры за что отвечают, и мы будем готовы начать обмен данными с таймером DS3231. А вот и карта регистров:

Карта регистров таймера реального времени DS3231

Первым делом нужно выставить дату и время. А затем нужно будет только читать значение времени и календаря. Расширенные функции – установка будильников и т.д. – всё это делается аналогично, поэтому останавливаться на этом не будем. Итак, чтобы выставить дату и время, нас интересуют регистры 0x00…0x06. Для записи значений в них, нужно послать команду записи, указать начальный адрес (0x00), а дальше – 7 байтов, сформированных для нужной даты и времени. Например, чтобы записать дату 02 января 2019 года, среда, и время 17 час 30 мин 02 сек, нужно отправить ведомому устройству с I2C адресом 0x68 массив: 00 02 30 17 03 02 01 19. Скетч, который реализует это, будет таким:

#include <Wire.h> void setup() { Wire.begin(); // старт i2c Wire.beginTransmission(0x68); // начинаем обмен с DS3231 с i2c адресом 0x68 byte arr = {0x00, 0x02, 0x30, 0x17, 0x03, 0x02, 0x01, 0x19}; Wire.write(arr, 8); // записываем 8 байтов массива arr Wire.endTransmission(); // завершение передачи } void loop() { // здесь не делаем ничего }

Вот как выглядит диаграмма записи этого массива в память таймера реального времени DS3231:

Диаграмма выставления времени на RTC DS3231

Таймер запомнит выставленную дату и время. Если подключена батарейка, то данные будут храниться в памяти устройства до сброса или до полного разряда батареи, ведь в этом и есть назначение устройств такого рода. Давайте теперь будем с периодом 1 секунда читать значение времени и выводить в монитор последовательного порта. Для этого напишем вот такой скетч:

Скетч для чтения времени с часов DS3231 (разворачивается) #include <Wire.h> const byte DS3231 = 0x68; // I2C адрес таймера DS3231 void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Wire.beginTransmission(DS3231); // начинаем обмен с DS3231 Wire.write(byte(0x00)); // записываем адрес регистра, с которого начинаем чтение!!! Wire.endTransmission(); // завершаем передачу byte t; // массив для хранения даты и времени int i = 0; // индекс текущего элемента массива Wire.beginTransmission(DS3231); // начинаем обмен с DS3231 Wire.requestFrom(DS3231, 7); // запрашиваем 7 байтов у DS3231 while(Wire.available()) { // пока есть данные от DS3231 t = Wire.read(); // читаем 1 байт и сохраняем в массив t i++; // инкрементируем индекс элемента массива } Wire.endTransmission(); // завершаем обмен printDateTime(t); // выводим дату и время delay(1000); // пауза 1 секунда } // разбирает считанный массив и выводит дату и время void printDateTime(byte *arr) { if (arr}

Обратите внимание, что каждую итерацию цикла loop() мы записываем адрес регистра 0x00. Если этого не делать, то мы будем каждый раз сдвигаться по карте регистров на 7 позиций, и возвращаемые данные будут совсем не те, что мы ожидаем.

Вот как выглядит в мониторе последовательного порта результат работы данного скетча:

Вывод даты и времени в монитор последовательного порта

А вот так выглядит временная диаграмма, порождаемая работой этого скетча:

Временная диаграмма чтения регистров времени DS3231

Напоследок давайте немного усложним нашу программу и будем читать также значение температуры:

Скетч для чтения времени и температуры с часов DS3231 (разворачивается) #include <Wire.h> const byte DS3231 = 0x68; // I2C адрес таймера DS3231 void setup() { Wire.begin(); Serial.begin(9600); } void loop() { Wire.beginTransmission(DS3231); // начинаем обмен с DS3231 Wire.write(byte(0x00)); // записываем адрес регистра, с которого начинаются данные даты и времени Wire.endTransmission(); // завершаем передачу byte dateTime; // 7 байтов для хранения даты и времени int i = 0; // индекс текущего элемента массива Wire.beginTransmission(DS3231); // начинаем обмен с DS3231 Wire.requestFrom(DS3231, 7); // запрашиваем 7 байтов у DS3231 while(Wire.available()) // пока есть данные от DS3231 { dateTime = Wire.read(); // читаем 1 байт и сохраняем в массив dateTime i+=1; // инкрементируем индекс элемента массива } Wire.endTransmission(); // завершаем передачу printDateTime(dateTime); // выводим дату и время Wire.beginTransmission(DS3231); // начинаем новый обмен с DS3231 Wire.write(byte(0x11)); // записываем адрес регистра, с которого начинается температура Wire.endTransmission(); // завершаем передачу i = 0; // обнуляем счётчик элементов массива byte temp; // 2 байта для хранения температуры Wire.beginTransmission(DS3231); // начинаем обмен с DS3231 Wire.requestFrom(DS3231, 2); // запрашиваем 2 байта у DS3231 while(Wire.available()) { temp = Wire.read(); i+=1; } Wire.endTransmission(); printTemp(temp); // выводим температуру delay(1000); // пауза на 1 сек } // выводит дату и время void printDateTime(byte *dateTime) { if (dateTime} // выводит температуру void printTemp(byte *temp) { Serial.print(«\t»); // символ табуляции для разделения между временем и температурой float temperature = getTemp(temp); Serial.print(temperature); Serial.println(«oC»); // градусы Цельсия } // преобразует содержимое регистров 0x11 и 0x12 в значение температуры // для подробностей см. datasheet на ds3231 float getTemp(byte *temp){ float temperature = temp; // целая часть temperature += (temp*0.25/100); // дробная часть return temperature; }

Вот как теперь выглядит вывод нашей программы:

Вывод даты, времени и температуры в монитор последовательного порта

Само собой, в интернете полно библиотек для Arduino, которые упрощают работу с часами реального времени DS3231 и модулем ZS-042 в частности. Они делают всю рутинную работу, и вам не нужно будет разбираться с картой регистров и проводить манипуляции с перестановкой полученных байтов, чтобы получить удобочитаемое значение времени. В конце статьи дана ссылка на скачивание архива, в котором лежат несколько библиотек для работы с часами реального времени DS3231 и DS1307.

2Подключение к Arduino модуля с часами реального времени DS1307

Таймер DS1307 в отличие от DS3231 проще по функциональности: он имеет меньше регистров, не имеет встроенного датчика температуры и встроенного генератора тактовой частоты. Не имеет он также и функции будильника. Шина I2C функционирует только на частоте 100 кГц. Модуль с часами реального времени DS1307 может выглядеть вот так:

Внешний вид модуля с часами реального времени DS1307

Здесь номером 1 обозначена микросхема собственно таймера DS1307, номер 2 – микросхема памяти AT24C32 объёмом 32 кбит, 3 – кварцевый резонатор с частотой 32,768 кГц, 4 – держатель для батареи типа 2032.

На модуле имеются две группы контактов: P1 и P2. Группа P2 имеет стандартные выводы для шины I2C, плюс дополнительный вывод DS, к которому можно подключить внешний датчик температуры DS18B20. Группа P1 имеет большее число контактов:

Название Назначение вывода
SQ Выход прямоугольного сигнала 30 кГц;
DS подключение внешнего датчика температуры DS18B20;
SCL шина тактирования интерфейса I2C;
SDA шина данных интерфейса I2C;
VCC питание модуля – 3.3 или 5 вольт;
GND земля;
BAT вход питания от внешней батареи с напряжением в диапазоне 2,0…3,5 В.

Подключение этого модуля к Arduino осуществляется абсолютно так же, как и рассмотренного ранее: VCC модуля – 5V Arduino, GND – GND, SDA – A4, SCL – A5.

Теперь пришла пора познакомиться с устройством регистров часов DS1307. Карта регистров приведена на рисунке:

Карта регистров часов реального времени DS1307

Если присмотреться, увидим, что регистры 0x00…0x06 в точности совпадают с аналогичными регистрами рассмотренного таймера DS3231, а регистр 0x07 отвечает за частоту генерируемого прямоугольного сигнала. Кроме того, I2C адрес DS1307 также аналогичен адресу модуля DS3231. Поэтому логично предположить, что скетч установки времени подойдёт и здесь. В этом легко убедиться, если загрузить скетч в Arduino с подключённым модулем DS1307. Не забудьте только обновить установочный массив в соответствии с временем, которое будете выставлять на часах. Пример разобран в предыдущем разделе.

Скетч вывода времени также будет работать с этим модулем. После установки времени загрузим скетч и проверим это. Всё работает!

Модуль с таймером DS1307 подключён к Arduino

Библиотеки для работы с часами реального времени DS1307 и DS3231

В приложенном архиве лежат две разные библиотеки для Arduino (используйте ту, которая будет вам наиболее удобна), а также технические описания (datasheet) на микросхемы DS1307 и DS3231.

Установка библиотек проводится стандартным способом: помещением директории с библиотекой в директорию libraries среды Arduino IDE или через меню Sketch Include Library. Проще всего начать знакомство с библиотекой с изучения примеров, которые появятся в меню File Examples после установки библиотеки. Там имеются примеры и установки времени, и чтения показаний часов.

Сообщества ›
Электронные Поделки ›
Блог ›
Простой AVR-Transistortester на ATmega8 (88)

На одном из сайтов нашёл статью, где предлагают собрать простой тестер полупроводниковых проборов именуемый AVR-Transistortester. Изучая данную тему, нашел, что AVR-Transistortester выполнены почти все по одной схеме отличия только в применяемых микроконтроллерах и дисплеев. Самая простая схема на ATmega8 можно использовать и ATmega48, содержит весь необходимый минимум, деталей, что не составит большого труда собрать начинающему радиолюбителю.

Типы тестируемых деталей:
(имя элемента — индикация на дисплее):
— NPN транзисторы — на дисплее «NPN»
— PNP транзисторы — на дисплее «PNP»
— N-канальные-обогащенные MOSFET — на дисплее «N-E-MOS»
— P-канальные-обогащенные MOSFET — на дисплее «P-E-MOS»
— N -канальные-обедненные MOSFET — на дисплее «N-D-MOS»
— P -канальные-обедненные MOSFET — на дисплее «P-D-MOS»
— N-канальные JFET — на дисплее «N-JFET»
— P-канальные JFET — на дисплее «P-JFET»
— Тиристоры — на дисплее «Tиристор»
— Симисторы — на дисплее «ТРИАК»
— Диоды — на дисплее «Диод»
— Двухкатодные сборки диодов — на дисплее «Дв диод CA»
— Двуханодные сборки диодов — на дисплее » Дв диод CС»
— Два последовательно соединенных диода — на дисплее «2 диода послед.»
— Диоды симметричные — на дисплее «2 диода встречные»
— Резисторы — диапазон от 1 Ом до 10 МОм
— Конденсаторы — диапазон от 0,2nF до 5000uF

Описание дополнительных параметров измерения:
— H21e (коэффициент усиления по току) — диапазон до 1000
— (1-2-3) — порядок подключенных выводов элемента
— Наличие элементов защиты — диода — «Символ диода»
— Прямое напряжение – Uf
— Напряжение открытия (для MOSFET) — Vt
— Емкость затвора (для MOSFET) — C=

Традиционно для себя перечертил схему в ДипТрейс и развёл плату под свои компоненты. Я применил планарную микросхему с тридцати двумя выводами.
Вот моя схема.

Полный размер

Схема

плата верх

плата низ

Плату старался развести так чтобы все детали, были под дисплеем, а тестовая панель, кнопка и контрольный светодиод были перед дисплеем. Применил стандартный разъём питания для подключения любого адаптера до 15в., на точность показаний это ни как не влияет.

Полный размер

без дисплея

Полный размер

сторона дорожек и МК

Что касаемо применяемых деталей.
Транзисторы VT1-VT3 любые маломощные соответствующие переходу.
Резисторы тоже любые, любого класса точности кроме R7-R12, главное чтобы их сопротивление не сильно отличались от требуемых. Очень важно, чтобы резисторы R7-R12 были более высокого класса точности. Если таковых у вас нет, то нужно вооружиться хорошим, точным тестером и отобрать резисторы R7-R12, с минимальной погрешностью.
От этого зависит точность показаний. Правильно собранный из рабочих деталей прибор в наладке не нуждается. Работает сразу, транзисторы и другие детали кроме конденсаторов большой ёмкости тестирует достаточно быстро.

Я, подобные микросхемы программирую, уже впаянную в плату.

Полный размерпрограмирование

Проводки подпаиваю к дорожкам ведущие к соответствующим выводам. А потом уже припаиваю остальные детали. Можно программировать и после окончательной сборки приборчика.

А каким программатором, или какой программой пользоваться уже дело вкуса. Мне так понравилась программа AVRDUDE.

Главное установить правильные фьюзы.

Для ATmega8: lfuse = 0xc1; hfuse = 0xd9
Для ATmega48: lfuse = 0x42; hfuse = 0xdf; efuse = 0xff

В архиве выкладываю все свои и не свои материалы по изготовлению данного устройства.
Также в архиве, есть прошивка для русификации показаний прибора (английский и русский EEPROM, правильное отображение в кирилице µ и Omega), это в том случае если у вас дисплей поддерживает русские символы. Мой дисплей к несчастью оказался не из таких.

Простейший программатор для ATmega8

В современных электронных схемах все чаще и чаще применяются микроконтроллеры. Да что там говорить, если сегодня не найти даже обыкновенную елочную гирлянду без микроконтроллера внутри — он задает различные программы иллюминации.

Я впервые столкнулся с микроконтроллерами, когда собирал свой первый импульсный металлоискатель Клон. Вот тогда-то и выяснилось, что контроллер без прошивки — это просто кусок пластмассы с ножками.

А чтобы залить нужную прошивку в АТМЕГу, никак не обойтись без программатора. Далее мы рассмотрим две самые простые и проверенные временем схемы программаторов.

Схема первая

С помощью этого программатора можно прошивать практически любой AVR-контроллер от ATMEL, надо только свериться с распиновкой микросхемы.

СОМ-разъем на схеме — это «мама».

На всякий случай привожу разводку печатной платы для атмеги8 (), хотя такую примитивную схему проще нарисовать от руки. Плату перед печатью нужно отзеркалить.

Файл печатной платы открывать с помощью популярной программы Sprint Layout (если она у вас еще не установлена, то качайте 5-ую версию или лучше сразу 6-ую).

Как понятно из схемы, для сборки программатора потребуется ничтожно малое количество деталек:

Вместо КТ315 я воткнул SMD-транзистор BFR93A, которые у меня остались после сборки микромощных радиомикрофонов.

А вот весь программатор в сборе:

Питание (+5В) я решил брать с USB-порта.

Если у вас новый микроконтроллер (и до этого никто не пытался его прошивать), то кварц с сопутствующими конденсаторами можно не ставить. Работа без кварцевого резонатора возможна благодаря тому, что камень с завода идет с битом на встроенный генератор и схема, соответственно, тактуется от него.

Если же ваша микросхема б/у-шная, то без внешнего кварца она может и не запуститься. Тогда лучше ставьте кварц на 4 МГц, а конденсаторы лучше на 33 пФ.

Как видите, я кварц с конденсаторами не ставил, но на всякий случай предусмотрел под них места на плате.

Заливать прошивку лучше всего с помощью программы PonyProg ().

Прошивка с помощью PonyProg

Заходим в меню Setup -> Calibration -> Yes. Должно появиться окошко «Calibration OK».

Теперь втыкаем микроконтроллер в панельку программатора, и подаем питание 5 вольт (можно, например, от отдельного источника питания или порта ЮСБ). Затем жмем Command -> Read All.

После чтения появляется окно «Read successful». Если все ок, то выбираем файл с нужной прошивкой для заливки: File -> Open Device File. Жмем «Открыть».

Теперь жмем Command -> Security and Configuration Bits и выставляем фьюзы, какие нужно.

Тщательно все проверяем и жмем «OK». Далее нажимаем Command -> Write All -> Yes. Идет прошивка и проверка. По окончании проверки появляется окно «Write Successful».

Вот и все, МК прошит и готов к использованию!

Имейте в виду, что при прошивке с помощью других программ (не PonyProg) биты могут быть инверсными! Тогда их надо выставлять с точностью до наоборот. Определить это можно, считав фьюзы и посмотрев на галку «SPIEN».

Схема вторая

Еще одна версия программатора, с помощью которого можно залить прошивку в микроконтроллер АТМЕГа (так называемый программатор Геннадия Громова). Схема состоит всего из 10 детатей:Диоды можно взять любые импульсные (например, наши КД510, КД522). Разъем — «мама». Питание на МК (+5В) нужно подавать отдельно, например, от того же компьютера с выхода USB.

Все это можно собрать навесным монтажом прямо на разъеме, но если вы крутой паяльник и знаете, что такое smd-монтаж, то можете сделать красиво:

Алгоритм прошивки с помощью программатора Громова

Программатор с установленной микросхемой подключаем к СОМ-порту компьютера, затем запускаем Uniprof, затем подаем питание на микроконтроллер. И первым делом проверяем, читаются ли фьюз-биты.

Если все ок, выбираем файл с нужной прошивкой и жмем запись.

Будьте предельно внимательны и осторожны, потому что если глюканет при записи фьюзов, то МК либо на выброс, либо паять схему доктора (а она сложная). Если поменяете бит SPIEN на противоположный — результат будет тот же (к доктору).

Сообщества ›
Электронные Поделки ›
Блог ›
Многоканальный суточный таймер

Привет всем любителям спаять что-то своими руками.
Возникла потребность у меня управлять 4-мя небольшими нагрузками по времени.В частности включать несколько раз в сутки в гараже приток и выход вентиляции в подвале и в самом помещении, беда в том, что электричество на ночь отключается, необходим был таймер с встроенными часами реального времени, после недолгих поисков нашёл проект подходящий под все мои хотелки .
Оригинал статьи здесь arv.radioliga.com/content/view/179
Там же описание и характеристики, форум с доработками исправлениями, вариантами прошивок.Повторяться здесь не вижу смысла, здесь же предложу свою реализацию этого проекта человека под ником AVR .Отдельное ему спасибо.
После небольших доработок некоторых людей с форума схема приобрела следующий вид:

Я думаю многие радиолюбители согласятся, что спаять и запустить плату это, ещё пол дела, а придать изделию законченный вид та ещё работка :).
Что касаемо меня, всегда стараюсь придать любой поделке, внешний вид насколько это в моих силах приближённый к заводскому, не люблю и не делаю никогда надписей на лицевой панели маркером от руки, стараюсь избегать шляпок винтов на видимой стороне изделия.Благо сейчас разнообразие корпусов в магазинах на вкус и цвет.Выбор пал на корпус под DIN-рейку 159.5х90.2х57.5мм, под него и под детали имеющиеся в наличии сделал плату.Фото ниже:
Вытравлены и спаяны платки, отмыты от флюса и покрыты акриловым лаком.
Платы соединяются между собой 2-мя шлейфами.
Надписи на лицевой панели: в этот раз не стал мудрить с цветной самоклейкой, просто распечатал на обычной офисной бумаге, заламинировал и приклеил на двусторонний скотч.
Обычно корпуса на din-рейке устанавливаются в шкаф/электрощит, но в моём уже места не было, под руки попался пластиковый корпус с прозрачной крышкой куда и было решено вмонтировать таймер, заодно и сделать ручное управление т.к автор не стал делать его программно.Я использовал переключатели 3-х позиционные на 3А на каждый канал.Также корпус позволяет сделать монтаж проводов более цивильно.
Проверка работы дома на столе
Ну и финал-в гараже рядом с электрощитом
Проверен на месте с подключенными вентиляторами в течении двух недель, зависаний, глюков не проявлялось, часы идут нормально.Я доволен.Всем спасибо, может кому конструктив пригодится .
Схема, плата на яндекс диске yadi.sk/d/E164Ql9V3MA8Vg

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх