Акваконтроллер. Помогите исправить ошибки

pal
Offline
Зарегистрирован: 06.03.2014

На форумах Аквалого наткнулся на интереснй скетч. Но он, как оказалось, с ошибками. Часть явных сам поправил, а дальше ни как.

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 RTC;

float minutes(uint8_t hh,uint8_t mm) {return hh*60+mm;}

class Led
{
private:
uint8_t Hours_Start_Sunrise, Minutes_Start_Sunrise, Hours_End_Sunrise, Minutes_End_Sunrise;
uint8_t Hours_Start_Sunset, Minutes_Start_Sunset, Hours_End_Sunset, Minutes_End_Sunset;
uint8_t Meridian_PWM, Midnight_PWM, Current_PWM, PWM_Pin;
public:
Led(uint8_t HSSr,uint8_t MSSr,uint8_t HESr,uint8_t MESr,
uint8_t HSSs,uint8_t MSSs,uint8_t HESs,uint8_t MESs,
uint8_t MerPWM,uint8_t MidPWM,uint8_t CurPWM,uint8_t PWMPin)
: Hours_Start_Sunrise(HSSr),Minutes_Start_Sunrise(MSSr),Hours_End_Sunrise(HESr),Minutes_End_Sunrise(MESr),
Hours_Start_Sunset(HSSs), Minutes_Start_Sunset(MSSs), Hours_End_Sunset(HESs), Minutes_End_Sunset(MESs),
Meridian_PWM(MerPWM), Midnight_PWM(MidPWM), Current_PWM(CurPWM), PWM_Pin(PWMPin)
{
pinMode(PWM_Pin, OUTPUT);
analogWrite(PWM_Pin, Midnight_PWM);
}
void Dim(DateTime now)
{
if (now.hour() if (now.hour()>Hours_End_Sunrise && now.minute()>Minutes_End_Sunrise) {analogWrite(PWM_Pin,Meridian_PWM);return;}
if (now.hour() if (now.hour()>Hours_End_Sunset && now.minute()>Minutes_End_Sunset) {analogWrite(PWM_Pin,Midnight_PWM);return;}
if (now.hour()>=Hours_Start_Sunrise && now.minute()>=Minutes_Start_Sunrise)
{
Current_PWM = (int)(minutes(now.hour(),now.minute())-minutes(Hours_Start_Sunrise,Minutes_Start_Sunrise))/(minutes (Hours_End_Sunrise,Minutes_End_Sunrise)-minutes(Hours_Start_Sunrise,Minutes_Start_Sunrise))*(Meridian_PWM-Midnight_PWM);
analogWrite(PWM_Pin,Midnight_PWM);
return;
}
if (now.hour()>=Hours_Start_Sunset && now.minute()>=Minutes_Start_Sunset)
{
Current_PWM = (int)(minutes(Hours_End_Sunset,Minutes_End_Sunset)-minutes(now.hour(),now.minute()))/(minutes(Hours_End_Sunset,Minutes_End_Sunset)-minutes(Hours_Start_Sunset,Minutes_Start_Sunset))*(Meridian_PWM-Midnight_PWM);
analogWrite(PWM_Pin,Midnight_PWM);
return;
}
}
};

// конструктор объектов (часы начала восхода, минуты начала восхода, часы конца восхода, минуты конца восхода,
// часы начала заката, минуты начала заката, часы конца заката, минуты конца заката, макс светимость, мин светимость, текущая светимость, пин)

Led CoolWhite(11,0,15,0,17,0,21,0,128,0,0,3);
Led TrueViolet(9,0,12,0,20,0,23,0,192,0,0,5);
Led RoyalBlue(10,0,13,0,19,0,22,0,192,0,0,6);
Led Blue(11,0,14,0,18,0,21,0,192,0,0,9);
Led DeepRed(12,0,15,0,17,0,21,0,128,0,0,10);
Led Green(12,0,15,0,17,0,21,0,128,0,0,11);

uint8_t coolerPin = 7;
uint8_t moonlightPin = 8;
DateTime now;

void night(DateTime now)
{
if (now.hour()<9 && now.hour()>22)
{
digitalWrite(coolerPin, LOW);
digitalWrite(moonlightPin, HIGH);
}
else
{
digitalWrite(coolerPin, HIGH);
digitalWrite(moonlightPin, LOW);
}
}

void setup()
{
Serial.begin(57600);
Wire.begin();
RTC.begin();
if (! RTC.isrunning()) Serial.println("RTC is NOT running!");
pinMode(coolerPin, OUTPUT);
pinMode(moonlightPin, OUTPUT);
}

void loop()
{
now = RTC.now();
CoolWhite.Dim(now);
TrueViolet.Dim(now);
RoyalBlue.Dim(now);
Blue.Dim(now);
DeepRed.Dim(now);
Green.Dim(now);
night(now);
}

Еще сюда хотелось бы прикрутить кусок для корректировки часов. Что-то типа такого

#include "DS1307new.h"
// устанавливает часы модуля на какое-то заранее определенное время
void setSomeTime(){
  RTC.stopClock();// останавливаем часы
  RTC.fillByHMS(21,01,0); // "подкручиваем стрелки на 21:01:00
  //RTC.fillByYMD(2014,12,14);//дата год,месяц,день
  RTC.setTime();// отправляем "подкрученное время" самому модулю
  RTC.startClock(); // и опять запускаем часы
}
 
// слушает из Serial команды и выполняет их. Каждая команда - один символ.
// доступны команды:
//  s - установить время указанное в функции setSomeTime()
void doSerialCommands(){
  if(Serial.available()){ // что-нибудь пришло?
    char ch=Serial.read(); // читаем что пришло
     
    switch(ch){
      case 's': // команда установки времени
           setSomeTime(); // устанавливаем
           break;
              
    };
  }
}

но не по команде из serial, а по кнопке. Чтоб не подкручивать значение через шлейф, а в удобное время (например в 21-00) по третьему зелёному свистку точного времени нажав на кнопочку сбрасывали время в RTC.

pal
Offline
Зарегистрирован: 06.03.2014

Забыл добавить, при компиляции пишет:

sketch_dec22a:92: error: expected `}' at end of input
sketch_dec22a.ino: In member function 'void Led::Dim(DateTime)':
sketch_dec22a:27: error: expected `)' before 'if'
sketch_dec22a:41: error: expected primary-expression before '}' token
sketch_dec22a:41: error: expected `;' before '}' token
sketch_dec22a.ino: At global scope:
sketch_dec22a:41: error: expected unqualified-id at end of input
SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

проверьте синтаксис кода, скобки () и {}

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строка 21 - может быть нано "void setup()" ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строка 08 - объявление класса вы закрыли ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строки 40 ... 43 - тоже надо проверить