Нужна помощь "Будильник-светильник на Ардуино"
- Войдите на сайт для отправки комментариев
Добрый день! Пытаюсь повторить данный проект «Светильник-будильник на Ардуино» http://www.hobbylab.ru/projects/detail.php?ID=1696 Но с использованием модуля Tiny RTC на DS1307.
В оригинальной версии начальное время задается вручную в библиотеке в строке:
_time = new Time(0,13,37,00);
/************************* ** AlarmSettings.cpp ************************/ #include "AlarmSettings.h" char* _tomorrow = "Tomorrow"; AlarmSettings::AlarmSettings() { _wakeUpDur = 30; _wakeUpLum = 255; _snoozeDur = 5; _backlightDur = 5; _fadeOutDur = 30; _fadeOutActive = false; _time = new Time(0,13,37,00); _dayAlarm = new Alarm(); _weekAlarm = new WeekAlarm(); _alarmCfgNo = 7; } Подскажите как прикрутить получение начальных данных от DS1307 ?
Скетч
#include <Wire.h>
#include <Time.h>
#include <LiquidCrystal_I2C.h>
#include <AlarmController.h>
#include <AlarmSettings.h>
#include <Bounce.h>
#include <Alarm.h>
const uint8_t snoozePin = 2; //Purple
const uint8_t leftPin = 3; //Green
const uint8_t rightPin = 4; //Brown
const uint8_t upPin = 5; //Blue
const uint8_t downPin = 6; //Orange
const uint8_t okPin = 8; //Yellow
const uint8_t cancelPin = 8; //Grey
const uint8_t ledPin = 9; //White
const uint8_t buzzerPin = 13;
const uint8_t bounceDelay = 8;
double fadeValue = 0.0;
unsigned long timeStart = 0;
unsigned long timeHigh = 0;
unsigned long timeOn = 0;
unsigned long timeOnPrev = 0;
unsigned long buzzerStart = 0;
// x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
const int buzzerP[] = {150,2000,150,2000,150,2000,150,2000,150,80,150,2000,150,80,150,2000,150,80,150,80,150,2000,150,80,150,80,150,2000,150,80,150,80,150,80,150,2000,150,80,150,80,150,80,150,2000,150,80,150,80,150,80,150,80,150,2000,150,80,150,80,150,80,150,80,150,1000};
const int buzzerPL = 64;
const uint8_t buzzerL = 54;
int buzzerPI = 0;
AlarmSettings set;
LiquidCrystal_I2C lcd(0x27,16,2);
AlarmController ac(&set,&lcd,ledPin);
Bounce btnLeft = Bounce(leftPin,bounceDelay);
Bounce btnRight = Bounce(rightPin,bounceDelay);
Bounce btnUp = Bounce(upPin,bounceDelay);
Bounce btnDown = Bounce(downPin,bounceDelay);
Bounce btnOK = Bounce(okPin,bounceDelay);
Bounce btnCancel = Bounce(cancelPin,bounceDelay);
Bounce btnSnooze = Bounce(snoozePin,bounceDelay);
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(snoozePin, INPUT);
pinMode(leftPin, INPUT);
pinMode(rightPin, INPUT);
pinMode(upPin, INPUT);
pinMode(downPin, INPUT);
pinMode(okPin, INPUT);
pinMode(cancelPin, INPUT);
pinMode(buzzerPin, OUTPUT);
timeStart = millis();
timeOn = millis();
timeOnPrev = timeOn;
lcd.init();
lcd.setBacklight(1);
lcd.home();
lcd.print(F("setup "));
uint8_t ledOff[8] = {0b00000,
0b00000,
0b00000,
0b00000,
0b00100,
0b01110,
0b01110,
0b01110 };
uint8_t ledOn[8] = {0b00100,
0b10101,
0b10101,
0b00000,
0b00100,
0b01110,
0b01110,
0b01110 };
uint8_t checkbox1[8] = {0b00000,
0b11111,
0b10001,
0b10001,
0b10001,
0b10001,
0b11111,
0b00000 };
uint8_t checkbox2[8] = {0b00000,
0b11111,
0b10001,
0b10101,
0b10101,
0b10001,
0b11111,
0b00000 };
lcd.createChar(0b00000, ledOff);
lcd.createChar(0b00001, ledOn);
lcd.createChar(0b00010, checkbox1);
lcd.createChar(0b00011, checkbox2);
digitalWrite(buzzerPin, LOW);
analogWrite(ledPin, 0);
ac.setMakeLight(analogWrite);
}
void loop() {
//update time
timeOn = millis();
if(timeOn<timeOnPrev) { //overflow!!
set.getTime()->addMillis((4294967295ul - timeOnPrev) + timeOn);
}
else{
set.getTime()->addMillis(timeOn - timeOnPrev);
}
timeOnPrev = timeOn;
//update AlarmState
ac.checkAlarmState();
//make noise?
if(ac.mustMakeNoise()) {
if(buzzerPI % 2 == 0) {
digitalWrite(buzzerPin, HIGH);
}
else {
digitalWrite(buzzerPin, LOW);
}
if(abs(millis() - buzzerStart) > buzzerP[buzzerPI]) {
buzzerPI++;
if(buzzerPI == buzzerPL)
buzzerPI = buzzerL;
buzzerStart = millis();
}
}
else {
buzzerPI = 0;
digitalWrite(buzzerPin, LOW);
}
//update LCD
ac.printLCD();
//check snooze-button
btnSnooze.update();
if(btnSnooze.risingEdge()) {
ac.doSnooze();
if(ac.getAlarmState() == 0) {
timeStart = millis();
btnSnooze.update();
ac.printLCD();
fadeValue = 0.0;
analogWrite(ledPin,round(fadeValue));
while(btnSnooze.read() == HIGH) {
if(abs(millis() - timeStart) > 600) {
//fadeValue += 15;
fadeValue += (fadeValue / 600) + 1;
if(fadeValue > 255) {
fadeValue = 255.0;
}
analogWrite(ledPin,round(fadeValue));
delay(10);
}
btnSnooze.update();
}
}
}
//Check other buttons
btnLeft.update();
btnRight.update();
btnUp.update();
btnDown.update();
btnOK.update();
btnCancel.update();
if(btnOK.risingEdge()) {
ac.doOK();
}
else if(btnCancel.risingEdge()) {
ac.doCancel();
}
else if(btnLeft.risingEdge()) {
ac.doLeft();
}
else if(btnLeft.fallingEdge()) {
ac.endLeft();
}
else if(btnRight.risingEdge()) {
ac.doRight();
}
else if(btnRight.fallingEdge()) {
ac.endRight();
}
else if(btnUp.risingEdge()) {
ac.doUp();
btnUp.update();
timeStart = millis();
ac.printLCD();
while(btnUp.read() == HIGH) {
if(abs(millis() - timeStart) > 800) {
ac.doUp();
ac.printLCD();
delay(140);
}
btnUp.update();
}
}
else if(btnDown.risingEdge()) {
ac.doDown();
btnUp.update();
timeStart = millis();
ac.printLCD();
while(btnDown.read() == HIGH) {
if(abs(millis() - timeStart) > 800) {
ac.doDown();
ac.printLCD();
delay(140);
}
btnDown.update();
}
}
}
Перечитайте свой пост сами. Внимательно. Перечитали? А теперь скажите, в чём именно нужна помощь ТС? В чём его проблема? Что у него получается, а что - нет?
Ответ на все вопросы один - ХЗ.
И Вы реально расчитываете получить адекватную помощь?
Фраза "Подскажите как прикрутить получение начальных данных от DS1307" осталась незамеченной.
Согласен, пост немного сумбурный. Попытаюсь обьяснить еще раз что мне надо.
Есть скетч.В нем используется несколько библиотек:
Alarm
AlarmController
AlarmSettings
WeekAlarm
Задание начального времени часов происходит в строке библиотеки AlarmSettings :
/************************* ** AlarmSettings.cpp ************************/ #include "AlarmSettings.h" char* _tomorrow = "Tomorrow"; AlarmSettings::AlarmSettings() { _wakeUpDur = 30; _wakeUpLum = 255; _snoozeDur = 5; _backlightDur = 5; _fadeOutDur = 30; _fadeOutActive = false; _time = new Time(0,13,37,00); _dayAlarm = new Alarm(); _weekAlarm = new WeekAlarm(); _alarmCfgNo = 7; }_time = new Time(0,13,37,00);
фрагмент данной библиотеки:
Имеется модуль RTC1307 и библиотека RTClib.h
Уровень программирования у меня слабоват,и мне не ясно как в данную строку:
_time = new Time(0,13,37,00);
подтянуть данные реального времени из RTClib.h
Фраза "Подскажите как прикрутить получение начальных данных от DS1307" осталась незамеченной.
Точно!
Ну, нельзя же, блин, так форматировать!
// Date and time functions using a DS1307 RTC connected via I2C and Wire lib #include <Wire.h> #include "RTClib.h" RTC_DS1307 rtc; char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; void setup () { Serial.begin(57600); } void loop () { DateTime now = rtc.now(); Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.println(); delay(3000); }когда пытаюсь заменить в библиотеке AlarmSettings:
_time = new Time(0,13,37,00);
на
_time = new Time(now.day(),now.hour(),now.minute(),now.second());
выдает ошибку:
error: 'now' was not declared in this scope
_time = new Time(now.day(),now.hour(),now.minute(),now.second());
Подскажите куда копать , как данные из одной библиотеки RTClib, передать в другую AlarmSettings??
В библиотеке AlarmSettings.cpp добавил :
#include <RTClib.h>
В файле AlarmSettings.h объявил четыре переменные:
uint8_t _getDay;
uint8_t _getHour;
uint8_t _getMin;
uint8_t _getSec;
Что нужно сделать , чтобы RTClib передавала данные в эти переменные??
При использовании в строке _time = new Time(0,13,37,00);
вместо числовых значений переменные:
_time = new Time(_getDay,_getHour,_getMin,_getSec);
На часах получаю нули?
Подскажите что , где еще прописать надо?
когда пытаюсь заменить в библиотеке AlarmSettings:
_time = new Time(0,13,37,00);
на
_time = new Time(now.day(),now.hour(),now.minute(),now.second());
выдает ошибку:
error: 'now' was not declared in this scope
_time = new Time(now.day(),now.hour(),now.minute(),now.second());
должна стоять строка: