Самые недорогие цифровые часы своими руками

Что еще можно сделать?

Мы создали одно из простейших устройств, но возможности по работе с Ардуино и другими микроконтроллерами, на самом деле, безграничны. С помощью разных дополнительных сенсоров можно реализовать много всяких устройств:

  • Анемометр — стационарный прибор для измерения скорости ветра;
  • Акселерометр — сенсор, позволяющий определять ускорение и ориентацию в пространстве;
  • Аналоговый термометр — аналоговый сенсор для измерения температуры;
  • Барометр — сенсор, позволяющий определять атмосферное давление и температуру;
  • Датчик влажности почвы — сенсор, позволяющий узнать о пересыхании земли
  • Датчик водорода — датчик для обнаружения водорода;
  • Датчик тока — аналоговый сенсор для измерения силы тока;
  • Датчик уровня воды — цифровой датчик уровня воды в ёмкости;
  • Датчик температуры и влажности — сенсор, предоставляющий информацию об окружающей температуре и влажности в виде цифрового сигнала;
  • Датчик пульса — аналоговый датчик для измерения частоты сердечных сокращений
  • Гироскоп — сенсор, позволяющий определять собственную угловую скорость.

Это лишь малая часть датчиков и сенсоров, которые вы можете использовать для создания своих устройств. Мы уже много интересного сделали и в планах еще много всего интересного сделать

Желаем вам отличных проектов. Подписывайтесь на нашу группу ВКонтакте.

Шаг 3: Подключаем электронику

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

После нескольких итераций было придуманы эти шаги, чтобы упростить сборку. Предлагаем посмотреть на фотографии, чтобы увидеть, как решены некоторые проблемы с соединительными проводами.

Подключите Bluefruit LE к Arduino с помощью гибких проводов.
Создайте панель для сенсорных кнопок и прикрепите контакты. Прикрепите эту плату к Arduino с помощью гибких проводов. (Штифты отрезаны от светодиодов).
Измените некоторые контакты для OLED-дисплея и соберите его с Arduino.
Подключите гибкий провод к земле, сделайте это достаточно длинным, чтобы добраться до задней части часов, которые должны быть в контакте с корпусом (это необходимо, так как емкостное прикосновение требует заземления для правильной работы).
Присоедините разъем микро-USB с помощью гибких проводов к земле и RAW

Посмотрите на схему распиновки микро USB, чтобы узнать, как подключать заземление и положительное напряжение.Обратите внимание! Подключите положительный провод от USB к RAW, а не VCC.

Прикрепите аккумулятор с помощью гибких проводов к земле и RAW.Обратите внимание! Подключите положительный провод от аккумулятора к RAW, а не VCC.

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

Кроме того, необходимо настроить зарядное устройство для часов:

  1. Отрежьте USB-кабель USB.
  2. Прикрепите красный провод USB-кабеля к красному проводу от разъема аккумулятора и черный провод в кабеле USB к черному проводу от разъема аккумулятора.

Важно! Обратите внимание, что умные часы НЕ МОГУТ заряжаться напрямую от 5 В USB с помощью обычного USB-кабеля. Вместо этого требуется зарядное устройство Li-Po, иначе батарея может быть повреждена.
Используйте изоляционную ленту для изоляции между компонентами, чтобы избежать короткого замыкания

Код

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

Также не забываем, что мы в самом начале подключаем библиотеку LiquidCrystal, которую вы можете скачать в разделе Библиотеки на нашем сайте.

/*
 ###  Самые простые часы на Arduino UNO ###

 Для проекта часов нужны только жк-дисплей 16х2 LCD и 2 кнопки
 Никаких потенциометров для контраса, никаких резисторов 
 Функции кнопок:
 
 - короткое нажатие одной из кнопок включает подсветку на 30 с
 
 Настройка времени
 - Нажмите H для увеличения Часов
 - Нажмите M для увеличения Минут и сброса секунд
*/

#include "LiquidCrystal.h"

// Определяем соединение ЖК-дисплея с цифровыми контактами
const int rs = 2, en = 3, d4 = 4, d5 = 5, d6 = 6, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// Настройка контрастности ЖК
int cs=9;// пин 9 для контраста ШИМ
const int contrast = 100;// контраст по умолчанию

// Начальное отображение времени 12:59:45 PM
int h=12;
int m=59;
int s=45;
int flag=1; //PM

// Кнопки установки времени
int button1;
int button2;

// Определение пинов для Кнопок установки времени
int hs=0;// pin 0 для настройки Часов
int ms=1;// pin 1 для настройки Минут

// Тайм-аут подсветки 
const int Time_light=150;
int bl_TO=Time_light;// Тайм-аут подсветки
int bl=10; // Пин подсветки
const int backlight=120; // НЕ БОЛЕЕ 7mA !!!

// Для точного считывания времени используйте часы реального времени Arduino, а не только задержку delay()
static uint32_t last_time, now = 0; // RTC

void setup()
{
  lcd.begin(16,2);
  pinMode(hs,INPUT_PULLUP);// избегать внешних Pullup резисторов для кнопки 1
  pinMode(ms,INPUT_PULLUP);// и кнопки 2
  analogWrite(cs,contrast);// Настроить контрастность VO
  analogWrite(bl,backlight);// Включить подсветку 
  now=millis(); // читать начальное значение RTC  
}

void loop()
{ 
  lcd.begin(16,2);// каждую секунду
// Обновить ЖК-дисплей
// Вывести время TIME в Hour, Min, Sec + AM/PM (часы, минуты, секунды)
 lcd.setCursor(0,0);
 lcd.print("Time ");
 if(h<10)lcd.print("0");// всегда 2 цифры
 lcd.print(h);
 lcd.print(":");
 if(m<10)lcd.print("0");
 lcd.print(m);
 lcd.print(":");
 if(s<10)lcd.print("0");
 lcd.print(s);

 if(flag==0) lcd.print(" AM");
 if(flag==1) lcd.print(" PM");
 
 lcd.setCursor(0,1);// для Line 2
 lcd.print("Precision clock");

// улучшенная замена delay(1000) 
// гораздо лучшая точность, менее зависимая от времени выполнения цикла

for ( int i=0 ;i<5 ;i++)// сделать 5-кратный цикл 200 мс, для более быстрого ответа кнопок
{
  while ((now-last_time)<200) //задержка delay 200ms
  { 
    now=millis();
  }
 // внутренний цикл 200ms
 last_time=now; // готовим следующий цикл 

 // read Setting Buttons (читаем кнопки настройки)
 button1=digitalRead(hs);// Read Buttons
 button2=digitalRead(ms);

 //Время подсветки 
 bl_TO--;
 if(bl_TO==0)
 {
  analogWrite(bl,0);// ВЫКЛ подсветки
  bl_TO++;
 }
 
 // Нажмите что-либо, чтобы активировать подсветку 
 if(  ((button1==0)|(button2==0)) & (bl_TO==1)  )
 {
  bl_TO=Time_light;
  analogWrite(bl,backlight);
  // дождитесь отпускания кнопки
  while ((button1==0)|(button2==0))
  {
   button1=digitalRead(hs);// Read Buttons
   button2=digitalRead(ms);
  }
 }
 else
 // Поведение Кнопки 1 или Кнопки 2 пока подсветка ВКЛ 
 {
  if(button1==0){
   h=h+1;
   bl_TO=Time_light;
   analogWrite(bl,backlight);
  }

 if(button2==0){
  s=0;
  m=m+1;
  bl_TO=Time_light;
  analogWrite(bl,backlight);
  }

/* ---- управлять секундами, минутами, часами am / pm ----*/
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 }

 if((button1==0)|(button2==0))// Обновить дисплей, если нажата кнопка
 {
  // Обновить ЖК
  // Вывести время TIME в часах, минутах, секундах + AM/PM
  lcd.setCursor(0,0);
  lcd.print("Time ");
  if(h<10)lcd.print("0");// всегда 2 цифры
  lcd.print(h);
  lcd.print(":");
  if(m<10)lcd.print("0");
  lcd.print(m);
  lcd.print(":");
  if(s<10)lcd.print("0");
  lcd.print(s);

  if(flag==0) lcd.print(" AM");
  if(flag==1) lcd.print(" PM");
 
  lcd.setCursor(0,1);// для Line 2
  lcd.print("Precision clock");
 }

 } // end if else
}// end for

// outer 1000ms loop (завершение цикла)
 s=s+1; //увеличение секунд
        
// ---- управлять секундами, минутами, часами + am/pm ----
 if(s==60){
  s=0;
  m=m+1;
 }
 if(m==60)
 {
  m=0;
  h=h+1;
 }
 if(h==13)
 {
  h=1;
  flag=flag+1;
  if(flag==2)flag=0;
 }  
// Loop end (конец цикла)
}

Создаем скетч для Arduino Nano

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

Если мы идем по первому пути — мы должны добавить следующий код в наше приложение:

int redPin = 12;

void setup() {
  // initialize Leds
  pinMode(redPin, OUTPUT);
}

void loop() {
  digitalWrite(redPin, HIGH);
  delay(1000);
  digitalWrite(redPin, LOW);
  delay(1000);
}

Второй вариант — это выбор уже готового проекта в нашей IDE. Для этого нужно сделать следующее.

File → Examples → 01. Basics → Blink
(Файл → Примеры → 01. Основы → Моргание)

После чего мы увидим код в нашем окне программы:

И здесь важный момент — нужно нажать стрелку сверху, чтобы скомпилировать скетч. После чего вы увидите надпись «Компиляция скетча» (Compiling sketch…) слева и справа процентную шкалу. В свою очередь стрелка запуска сверху поменяет свой цвет:

После этого светодиод начнет мигать.

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

Способ программирования Arduino для работы с DS1302

Обязательно нужно скачать действующую библиотеку из надёжных источников.

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

#include <iarduino_RTC.h> // Подключаем библиотеку.iarduino_RTC ОБЪЕКТ ( НАЗВАНИЕ ]] ); // Создаём объект.

Функция begin (); // Инициализация работы RTC модуля.

Функция settime ( СЕК ]]]]] ); // Установка времени.

Функция gettime (  ); // Чтение времени.

функция blinktime ( ПАРАМЕТР  ); // Заставляет функцию gettime «мигать» указанным параметром времени.

функция period ( МИНУТЫ ); // Указывает минимальный период обращения к модулю в минутах.

Переменная seconds // Возвращает секунды от 0 до 59.

Переменная minutes// Возвращает минуты от 0 до 59.

Переменная hours // Возвращает часы от 1 до 12.

Переменная Hours // Возвращает часы от 0 до 23.

Переменная midday // Возвращает полдень 0 или 1 (0-am, 1-pm).

Переменная day // Возвращает день месяца от 1 до 31.

Переменная weekday // Возвращает день недели от 0 до 6 (0-воскресенье, 6-суббота).

Переменная month // Возвращает месяц от 1 до 12.

Переменная year // Возвращает год от 0 до 99.

Пишем простенькую программу. Установка текущего времени в RTC модуль (DS1302):

Arduino

#include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1302,6,7,8); void setup() { delay(300); Serial.begin(9600); time.begin(); time.settime(0,51,21,27,10,15,2); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(time.gettime(«d-m-Y, H:i:s, D»)); // выводим время delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14

#include <iarduino_RTC.h>

iarduino_RTCtime(RTC_DS1302,6,7,8);

voidsetup(){

delay(300);

Serial.begin(9600);

time.begin();

time.settime(,51,21,27,10,15,2);// 0  сек, 51 мин, 21 час, 27, октября, 2015 года, вторник

}

voidloop(){

if(millis()%1000==){// если прошла 1 секунда

Serial.println(time.gettime(«d-m-Y, H:i:s, D»));// выводим время

delay(1);// приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс

}

}

Считываем текущее время с RTC модуля (DS1302) и выводим в «Последовательный порт» :

#include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1302,6,7,8); void setup() { delay(300); Serial.begin(9600); time.begin(); } void loop(){ if(millis()%1000==0){ // если прошла 1 секунда Serial.println(time.gettime(«d-m-Y, H:i:s, D»)); // выводим время delay(1); // приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс } }

1
2
3
4
5
6
7
8
9
10
11
12
13

#include <iarduino_RTC.h>

iarduino_RTC time(RTC_DS1302,6,7,8);

voidsetup(){

delay(300);

Serial.begin(9600);

time.begin();

}

voidloop(){

if(millis()%1000==){// если прошла 1 секунда

Serial.println(time.gettime(«d-m-Y, H:i:s, D»));// выводим время

delay(1);// приостанавливаем на 1 мс, чтоб не выводить время несколько раз за 1мс

}

}

С вами на связи был я, Сёма. Пишите в комментах, подписывайтесь на новости, пишите письма.

Что за идея

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

По факту — сделать правильную секунду в цифровых часах не так просто. Нужно правильно работать с циклами. Мы нашли много комментариев на англоязычных сайтах:

На скриншоте выше видно, что код реализован таким образом, что теперь инкремент s будет выполняться каждую 1 секунду и не больше, в зависимости от времени выполнения цикла loop{}.

В связи с этим резисторы и потенциометры мы полностью удалили.

Кнопки настройки времени вы можете использовать встроенные в микросхему ATmega328P.

pinMode(hs, INPUT_PULLUP) избегает использования внешнего Pullup. Подробнее о INPUT_PULLUP читайте в нашем Справочнике программиста Ардуино.

Избегайте потенциометра ЖК-дисплея.

Контрастность ЖК-дисплея может быть установлена с помощью сигнала PWM (Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM))) Arduino.

То же самое для подсветки, которая питается сигналом ШИМ (PWM) Arduino, поэтому её можно установить как вкл/выкл с помощью Arduino.

Часы с выводом на экран Nokia 5110

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

В этом уроке используются лишь несколько компонентов — только перемычки, Arduino и дисплей Nokia 5110/3110.

Комплектующие

Детали, используемые в этом проекте ниже.

Оборудование

  • Arduino UNO и Genuino UNO × 1
  • Adafruit дисплей Nokia 5110 × 1
  • Соединительные провода (универсальные) × 1
  • Резистор 221 Ом × 1

Программное обеспечение

Схема соединения

Соединяем детали часов на Ардуино как на схеме выше:

  • контакт pin 3 — последовательный тактовый выход (SCLK) // pin 3 — Serial clock out (SCLK)
  • контакт pin 4 — выход серийных данных (DIN) // pin 4 — Serial date out (DIN)
  • контакт pin 5 — дата / выбор команды (D / C) // pin 5 — date/Command select (D/C)
  • контакт pin 6 — выбор ЖК-чипа (CS / CE) // pin 6 — LCD chip select (CS/CE)
  • контакт pin 7 — сброс ЖК (RST) // pin 7 — LCD reset (RST)

Код урока

Код второй версии часов вы можете скачать или скопировать ниже.

#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>

Adafruit_PCD8544 display = Adafruit_PCD8544(3,4,5,6,7);

int second,minute, hour, day, mounth,year; 
unsigned long UtlTime; 

void setup() 
pinMode(2,OUTPUT);
UtlTime=0;   {   

minute=0;   
hour=0;   
day=0;   
mounth=0;   
year=0;   
Serial.begin(9600);   
  display.begin();
  display.setContrast(50); // Adjust the display contrast
  display.clearDisplay();   //Apaga o buffer e o display
  display.setTextSize(1);  //Seta o tamanho do texto
  display.setTextColor(BLACK); //Seta a cor do texto      
   
display.print(" date e hour ");   
display.setCursor(0,10);   
display.print(" com Arduino");   
display.display();
delay (5000); 

//Configura o minute   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("minute: ");
display.display();
Serial.print("\nin between minute:");  
while(minute==0)   {     
if (Serial.available() > 0)     
{       
minute= Serial.parseInt();     
}   
}   
display.print(minute);   
display.display();
delay(1000); 

//Configura a hour   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("hour: ");   
display.display();
Serial.print("\nin between hour:"); 
while(hour==0)   
{     
if (Serial.available() > 0)     
{       
hour= Serial.parseInt();     
}   
}   
display.print(hour);   
display.display();
delay(1000);    

//Configura o day   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("day: ");
display.display();   
Serial.print("\nin between day:");   
while(day==0)   
{     
if (Serial.available() > 0)     
{       
day= Serial.parseInt();     
}   
}   
display.print(day);   
display.display();
delay(1000);    

//Configura o mês   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("mounth: "); 
display.display();  
Serial.print("\nin between mounth:");  
while(mounth==0)   
{     
if (Serial.available() > 0)     
{       
mounth= Serial.parseInt();     
}   
}   
display.print(mounth);  
 display.display();
delay(1000);    

//Configura o year   
display.clearDisplay();   
display.setCursor(0,0);   
display.print("year: ");   
display.display();
Serial.print("\nin between year:");   
while(year==0)   
{     
if (Serial.available() > 0)     
{       
year= Serial.parseInt();     
}   
}   
display.print(year);   

display.display();   
delay(1000);
display.clearDisplay(); 

} 

void loop() 
{   

if(millis()-UtlTime<0)   
{     
UtlTime=millis();   
}   
else   
{     
second=int((millis()-UtlTime)/1000);   
}   
if(second>59)   
{     
second=0;     
minute++;     
UtlTime=millis();     
if(minute>59)     
{       
hour++;       
minute=0;       
if(hour>23)       
{         
day++;         
hour=0;         
if(mounth==1||mounth==3||mounth==5||mounth==7||mounth==8||mounth==10||mounth==12)         
{           
if(day>31)           
{             
day=1;             
mounth++;             
if(mounth>12)             
{               
year++;               
mounth=1;             
}           
}         
}         
else if(mounth==2)         
{           
if(year%400==0)           
{             
if(day>29)             
{               
day=1;               
mounth++;             
}           
}           
else if((year%4==0)&&(year%100!=0))           
{             
if(day>29)             
{              
day=1;               
mounth++;             
}           
}           
else           
{             
if(day>28)             
{               
day=1;               
mounth++;             
}           
}         
}         
else         
{           
if(day>30)           
{             
day=1;             
mounth++;           
}         
}       
}     
}   
}    

display.clearDisplay(); 
delay(1000); 
Serial.print(day);   
Serial.print("/");   
Serial.print(mounth);   
Serial.print("/");   
Serial.print(year);   
Serial.println();      

display.setCursor(0,0);   
display.print("date ");   
display.print(day);   
display.print("/");   
display.print(mounth);   
display.print("/");   
display.print(year);

 
display.display();
Serial.print(hour);   
Serial.print(":");   
Serial.print(minute);   
Serial.print(":");   
Serial.print(second);   
Serial.print("\n");   
Serial.println();      

display.setCursor(0,10);   
display.print("hour ");   
display.print(hour);   
display.print(":");   
display.print(minute);   
display.print(":");   
display.print(second); 
display.display();
char tecla;
tecla = Serial.read();
if(tecla=='1'){
digitalWrite(2,LOW);
}
if(tecla=='2'){
  digitalWrite(2, HIGH);
}

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

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

Adblock
detector