Нужна помощь "Будильник-светильник на Ардуино"

serhigol
Offline
Зарегистрирован: 28.02.2016

Добрый день! Пытаюсь повторить данный проект «Светильник-будильник на Ардуино» 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();
    }
  }
  
}


ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Перечитайте свой пост сами. Внимательно. Перечитали? А теперь скажите, в чём именно нужна помощь ТС? В чём его проблема? Что у него получается, а что - нет?

Ответ на все вопросы один - ХЗ.

И Вы реально расчитываете получить адекватную помощь? 

Araris
Offline
Зарегистрирован: 09.11.2012

Фраза "Подскажите как прикрутить получение начальных данных от DS1307" осталась незамеченной.

serhigol
Offline
Зарегистрирован: 28.02.2016

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

Есть скетч.В нем используется несколько библиотек:

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Araris пишет:

Фраза "Подскажите как прикрутить получение начальных данных от DS1307" осталась незамеченной.

Точно! 

Ну, нельзя же, блин, так форматировать!

serhigol
Offline
Зарегистрирован: 28.02.2016
В скетче примера 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??

serhigol
Offline
Зарегистрирован: 28.02.2016

В библиотеке 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);

На часах получаю нули?

Подскажите что , где еще прописать надо?

 

 

 

 

 

 

 

 

fogary
Offline
Зарегистрирован: 05.03.2016

serhigol пишет:

когда пытаюсь заменить в библиотеке 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());

Перед

_time = new Time(now.day(),now.hour(),now.minute(),now.second());

должна стоять строка:

DateTime now = rtc.now();