Ничего не изменилось, по сравнению с предыдущей версией. Часы как тикали с нуля при включении питания, так и будут тикать. Посмотрите пример внимательней, там в самом конце полный исходник, где время компиляции разбирается на переменные, происходит подсчет хэша времени и так далее...
тпо этого Код (Text): #include <Wire.h> #include "DS1307.h" #include <EEPROM.h> int led = 9; int ledStatus = 0; int LED_ON = 0; int LED_OFF = 1; int hour; int minute; int second; //Массив, содержащий время компиляции char compileTime[] = __TIME__; DS1307 clock;//define a object of DS1307 class void setup() { pinMode(led, OUTPUT); //Запускаем часы реального времени clock.begin(); //Импровизированный хэш времени //Содержит в себе количество секунд с начала дня unsigned int hash = hour * 60 * 60 + minute * 60 + second; //Проверяем несовпадение нового хэша с хэшем в EEPROM if (EEPROMReadInt(0) != hash) { //Сохраняем новый хэш EEPROMWriteInt(0, hash); //Готовим для записи в RTC часы, минуты, секунды clock.fillByHMS(hour, minute, second); //Записываем эти данные во внутреннюю память часов. //С этого момента они начинают считать нужное для нас время clock.setTime(); } } void turnOffLed() { // fade in from min to max in increments of 5 points: for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) { // sets the value (range from 0 to 255): analogWrite(led, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(30); } // fade out from max to min in increments of 5 points: for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) { // sets the value (range from 0 to 255): analogWrite(led, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(30); } } void loop() { { clock.getTime(); if(clock.hour == 7 && ledStatus == LED_ON)//Время включения { ledStatus = LED_OFF;//статус светодиодной дорожки } else if(clock.hour == 21 && ledStatus == LED_OFF)//время выключения { //Запись двухбайтового числа в память void EEPROMWriteInt(int address, int value) { EEPROM.write(address, lowByte(value)); EEPROM.write(address + 1, highByte(value)); } //Чтение числа из памяти unsigned int EEPROMReadInt(int address) { byte lowByte = EEPROM.read(address); byte highByte = EEPROM.read(address + 1); return (highByte << 8) | lowByte; } } } }
а как их описать так int address = 0; byte value;или так int EEPROMReadInt= 0; int EEPROMWriteInt= 0; ?
типо это Код (Text): //Получаем число из строки, зная номер первого символа byte hour = getInt(compileTime, 0); byte minute = getInt(compileTime, 3); byte second = getInt(compileTime, 6);
Никита, у меня складывается такое чувство что вы совершенно не знакомы с программированием и пытаетесь вставлять в код где-то взятые куски по принципу что красивее выглядит. Примерно так у нас народ на машины клеит японские иероглифы, порой даже не зная их смысла. Не знание это не страшно, все начинали с не знания, главное что бы было желание, но поверьте если вы желаете что-то делать дальше с ардуином, вам как не крути придется взяться за изучение Си. Рекомендую вам данную книгу, для новичков по Си лучше я пока не встречал, можете где-либо купить в бумажном виде или скачать в электроном, потратьте пару недель на ее чтение и вам станет гораздо проще во всем этом разбираться, хватит уже пытаться из "японских иероглифов" складывать выражение "ура заработало" ориентируясь лишь на их внешний вид
Я не знаком с данной книгой. На самом деле подойдет любая которая будет вам понятна, главное что бы вы начали изучение. Я просто дал ссылку на книгу которая написана в ОЧЕНЬ доступном стиле, но вы можете использовать любую что вам по душе
Потихоньку начал разбираться. Добавил в код логики, ну а с компиляция времени пока в процессе Код (Text): /* Этот пример кода показывает как включать и выыключать какой-нибудь прибор по времени */ #include <Wire.h> #include "DS1307.h" int led = 9;//LED лампа int ledStatus = 0; int LED_ON = 0; int LED_OFF = 1; int sensorPin = A0; // variables: int sensorValue = 0; //sensorValue int sensorMin = 1023; // минемальное sensor value int sensorMax = 0; // максимальное sensor value DS1307 clock;//define a object of DS1307 class void setup() { pinMode(led, OUTPUT); Serial.begin(9600); clock.fillByYMD(2013,1,19);//Jan 19,2013 clock.fillByHMS(15,28,30);//15:28 30" clock.fillDayOfWeek(SAT);//Saturday clock.begin(); clock.setTime();//write time to the RTC chip Serial.println(" Connected to RTS "); } void turnOffLed() { Serial.print(" Morning "); // fade in from min to max in increments of 5 points: for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) { // sets the value (range from 0 to 255): analogWrite(led, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(1200); } Serial.print(" Sunset "); // fade out from max to min in increments of 5 points: for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) { // sets the value (range from 0 to 255): analogWrite(led, fadeValue); // wait for 30 milliseconds to see the dimming effect delay(1200); } } void loop() { clock.getTime(); delay(60000); sensorValue = analogRead(sensorPin); // apply the calibration to the sensor reading sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255); // in case the sensor value is outside the range seen during calibration sensorValue = constrain(sensorValue, 0, 255); if(analogRead(sensorValue) == 255) { Serial.print(" LIGHT ON to 22:00 "); if(clock.hour == 7 && ledStatus == LED_ON)//Время включения { ledStatus = LED_OFF;//статус светодиодной дорожки } else if(clock.hour == 21 && ledStatus == LED_OFF)//время выключения sensorValue = analogRead(sensorPin); // apply the calibration to the sensor reading sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255); // in case the sensor value is outside the range seen during calibration sensorValue = constrain(sensorValue, 0, 255); if(analogRead(sensorValue) == 0) { Serial.print(" LIGHT OFF to 07:00 "); { } } } }
Прежде, чем выкладывать код на форум, нажимайте Ctrl+T в Arduino IDE либо тыкайте мышкой по пункту "Автоформатирование" в меню "Сервис" пожалуйста. Тогда Ваш код станет можно читать.
Опять натыкано готовых кусков без понимания того, как они работают. Откомментируйте каждую строку кода самостоятельно и сравните то, что делает код с тем, что Вы хотите от него добиться. Займитесь изучением синтаксиса языка, чтобы не было ляпов вроде этого: Код (Text): Serial.print(" LIGHT OFF to 07:00 "); { } В коде определен массив с временем компиляции, но он нигде не используется. Вместо этого при каждом включении часы устанавливаются на 19 янв 2013 15:28:30. С какой целью в каждом цикле программы производится задержка на минуту? Почему функция turnOffLed сначала зажигает, а потом сразу гасит светодиод? Что делает строка analogRead(sensorValue) ?
Короче я управляю самодельной лампой led в аквасе. Mассив пока в процессе вписал когда разбирался и не удалил. OffLed она нужна для плавного включения лампы типо рассвет/закат. Это занимает около часа . analogRead(sensorValue) это сканер который подтверждает включение лампы. Инфа уходит по BT ну или по шнуру юсб в комп, но потом она будет отправляться по GSM
вот всё расписал и вписал ОNLed Код (Text): /* Этот пример кода показывает как включать и выыключать какой-нибудь прибор по времени */ //включаем библиотеки #include <Wire.h> #include "DS1307.h" int led = 9;//LED лампа int ledStatus = 0;//статус LED int LED_ON = 0;//константа int LED_OFF = 1;//константа int sensorPin = A0;//фотодиод // variables: int sensorValue = 0; //переменная sensorValue int sensorMin = 1023; // минемальное sensor value int sensorMax = 0; // максимальное sensor value DS1307 clock;//определяет объект класса DS1307 void setup() { pinMode(led, OUTPUT); Serial.begin(9600);// инициализация последовательной связи на скорости 9600 бит в секунду clock.fillByYMD(2013,1,19);//ноябрь 12,2013 clock.fillByHMS(15,28,30);//12:46:30" clock.fillDayOfWeek(SAT);//суббота clock.begin();//Запускаем часы реального времени clock.setTime();//время записи на чип RTC Serial.println(" Connected to RTS ");//печатаем сообщение // Включить светодиод для сигнализации о начале периода калибровки: pinMode(13, OUTPUT); digitalWrite(13, HIGH); // Калибровки в течение первых пяти секунд while (millis() < 5000) { sensorValue = analogRead(sensorPin); //Записываем максимальное значение датчика if (sensorValue > sensorMax) { sensorMax = sensorValue; } //Записываем минимальное значение датчика if (sensorValue < sensorMin) { sensorMin = sensorValue; } } // Сигнал об окончании периода калибровки digitalWrite(13, LOW); } void turnONLed() //плавное включение Led { Serial.print(" Morning "); //печатаем сообщение //загорается от минимального до максимального с шагом в 1 for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) { // устанавливает значение (в диапазоне от 0 до 255) analogWrite(led, fadeValue); // ждать в течение 1200 миллисекунд, чтобы увидеть эффект разгорание delay(1200); } } void turnOffLed()//плавное выключение { Serial.print(" Sunset ");//печатаем сообщение // гаснет от максимального до минемального с шагом в 1 for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) { //устанавливает значение (в диапазоне от 0 до 255) analogWrite(led, fadeValue); // ждать в течение 1200 миллисекунд, чтобы увидеть эффект затухания delay(1200); } } void loop() { clock.getTime(); //начинаем подсчет времени sensorValue = analogRead(sensorPin);//читаем с датчика // применить калибровки показания датчика sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255); // В случае, если значение датчика выходит за пределы диапазона видели во время калибровки sensorValue = constrain(sensorValue, 0, 255); if(analogRead(sensorValue) == 255) //если analogRead(sensorValue) == 255) { //эта надпись появиться только после того как значение полученное с фоторезистора достигнет 255 //она выполняет функцию потверждения включения света Serial.print(" LIGHT ON to 22:00 ");//пишем что свет включён if(clock.hour == 7 && ledStatus == LED_ON)//Время включения { ledStatus = LED_OFF;//статус светодиодной дорожки } else if(clock.hour == 21 && ledStatus == LED_OFF)//время выключения sensorValue = analogRead(sensorPin);//считываем показания // применить калибровки показания датчика sensorValue = map(sensorValue, sensorMin, sensorMax, 0, 255); //В случае, если значение датчика выходит за пределы диапазона видели во время калибровки sensorValue = constrain(sensorValue, 0, 255); if(analogRead(sensorValue) == 0)//если (analogRead(sensorValue) == 0) { Serial.print(" LIGHT OFF to 07:00 ");// пишем что свет выключен { } } } }