Акваконтроллер. Помогите исправить ошибки
- Войдите на сайт для отправки комментариев
Пнд, 22/12/2014 - 23:40
На форумах Аквалого наткнулся на интереснй скетч. Но он, как оказалось, с ошибками. Часть явных сам поправил, а дальше ни как.
#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.
Забыл добавить, при компиляции пишет:
проверьте синтаксис кода, скобки () и {}
строка 21 - может быть нано "void setup()" ?
строка 08 - объявление класса вы закрыли ?
строки 40 ... 43 - тоже надо проверить