Часы на DS1307
- Войдите на сайт для отправки комментариев
Ср, 03/04/2013 - 08:07
Привет всем не как не могу разобраться часами на DS1307 собрал схему
в одном месте написано к аналоговому входу подключать 4-5 тока не пойму как они от него программируются и должны работать
в другом месте к sda- scl
#include <WProgram.h>
#include <Wire.h>
#include <DS1307.h>
int rtc[7];
int ledPin = 13;
void setup()
{
DDRC|=_BV(2) |_BV(3); // POWER:Vcc Gnd
PORTC |=_BV(3); // VCC PINC3
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
RTC.stop();
RTC.set(DS1307_SEC,1);
RTC.set(DS1307_MIN,57);
RTC.set(DS1307_HR,17);
RTC.set(DS1307_DOW,2);
RTC.set(DS1307_DATE,18);
RTC.set(DS1307_MTH,1);
RTC.set(DS1307_YR,10);
RTC.start();
}
void loop()
{
RTC.get(rtc,true);
for(int i=0; i<7; i++)
{
Serial.print(rtc[i]);
Serial.print(" ");
}
Serial.println();
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}
вот код но почему он ругается на RTC.stop();
Объясните пожалуйста всё процедуру как запустить часы и чтобы они отображались в сериал

Вы как бы и не первый день на форуме.
Невозможно найти то, чего нет. Но! Темы три точно есть по часам. Там и найдете все, что интересует!
ОТ И ДО! Не ленитесь пожалуйста! :)))
Темы на форуме я их читал но всё равно не могу понять ,видимо что то я пропустил?
Конечно пропустили - не скачали или скачали не ту библиотеку, скачали библиотеку не работающую с данной версией IDE, не правильно ее распаковали или не туда положили.
А еще не плохо было бы показывать и нам что у вас там за ошибки.
Так же ко всему данный код для версий IDE 0023 и ниже , если у вас 1.0 и выше, то укакзавать надо не #include <WProgram.h> ,а #include <Arduino.h>.
Я так предпологаю так у вас ругается - http://arduino.ru/forum/programmirovanie/ds1307#comment-24452, а точнее http://arduino.ru/forum/programmirovanie/ds1307-pokazyvayut-strannoe-vremya-kotoroe-stoit#comment-22660

Так вот эта тема первая в поиске по сайту по запросу "DS1307", и в ней же есть решение http://arduino.ru/forum/programmirovanie/ds1307-pokazyvayut-strannoe-vremya-kotoroe-stoit#comment-22002
Так что можно сделать вывод что вы вообще не искали прежде чем создать новую тему или поленились почитать найденые ветки.
С библиотекой я уже разобрался её просто там не было это всё моя не внимательность
Эту <DS1307.h> библиотеку нашел установил
А вот эту найти не получается найти <WProgram.h>
Подскажите где её скачать?
Не надо ее искать перечитайте второй обзац сообщения #3.
#include <WProgram.h> #include <Wire.h> #include <DS1307.h> int rtc[7]; int ledPin = 13; void setup() { DDRC|=_BV(2) |_BV(3); // POWER:Vcc Gnd PORTC |=_BV(3); // VCC PINC3 pinMode(ledPin, OUTPUT); Serial.begin(9600); RTC.stop(); RTC.set(DS1307_SEC,1); RTC.set(DS1307_MIN,57); RTC.set(DS1307_HR,17); RTC.set(DS1307_DOW,2); RTC.set(DS1307_DATE,18); RTC.set(DS1307_MTH,1); RTC.set(DS1307_YR,10); RTC.start(); } void loop() { RTC.get(rtc,true); for(int i=0; i<7; i++) { Serial.print(rtc[i]); Serial.print(" "); } Serial.println(); digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); }Сделал так в сериал идут нули чесы не тикают
0 0 0 0 0 0 2000
#if defined(ARDUINO) && ARDUINO >=100 #include "Arduino.h" #else #include "WProgram.h" #eldif #include <Wire.h> #include <DS1307.h> int rtc[7]; int ledPin = 13; void setup() { DDRC|=_BV(2) |_BV(3); // POWER:Vcc Gnd PORTC |=_BV(3); // VCC PINC3 pinMode(ledPin, OUTPUT); Serial.begin(9600); RTC.stop(); RTC.set(DS1307_SEC,1); RTC.set(DS1307_MIN,57); RTC.set(DS1307_HR,17); RTC.set(DS1307_DOW,2); RTC.set(DS1307_DATE,18); RTC.set(DS1307_MTH,1); RTC.set(DS1307_YR,10); RTC.start(); } void loop() { RTC.get(rtc,true); for(int i=0; i<7; i++) { Serial.print(rtc[i]); Serial.print(" "); } Serial.println(); digitalWrite(ledPin, HIGH); delay(500); digitalWrite(ledPin, LOW); delay(500); }А вот так пишет ошибка
sketch_apr03a.cpp:5:2: error: invalid preprocessing directive #eldif
sketch_apr03a.cpp:1:1: error: unterminated #else
Не могу понять как чесы стартуют через аналоговый вход
Не видимо я опять что то напутал
А вот так пишет ошибка
sketch_apr03a.cpp:5:2: error: invalid preprocessing directive #eldif
Ну вот так, надо быть внимательней
Вот такой скетчик из той библы
/ This is for compatibility with both arduino 1.0 and previous versions #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include <Wire.h> #include <DS1307.h> void setup() { Serial.begin(9600); use(); read_RTC(); } // use explanation message void use() { Serial.println("\nUSE : u U r R h[00-23]m[00-59]s[00-59]j0[1-7]D[01-31]M[01-12]A[00-49]"); Serial.println("\nEXEMPLE : h09m35d03 set time to 09h35 and day of week 3 (thuesday)."); Serial.println("\nCommands : h** : hour, m** : minutes, s** : seconds, d0* : day of week"); Serial.println(" M** : month, Y** : year, D** : day of month."); Serial.println(" r stops clock, R starts it. "); Serial.println(" u or U shows this message, all other caracter shows time."); } // DS1307 time read function void read_RTC() { Serial.print("\nActual time : "); Serial.print(RTC.get(DS1307_HR,true)); //read the hour and also update all the values by pushing in true Serial.print(":"); Serial.print(RTC.get(DS1307_MIN,false));//read minutes without update (false) Serial.print(":"); Serial.print(RTC.get(DS1307_SEC,false));//read seconds Serial.print(" "); // some space for a more happy life Serial.print(RTC.get(DS1307_DOW,false)); Serial.print(" "); Serial.print(RTC.get(DS1307_DATE,false));//read date Serial.print("/"); Serial.print(RTC.get(DS1307_MTH,false));//read month Serial.print("/"); Serial.println(RTC.get(DS1307_YR,false)); //read year } // set clock values void write_RTC() { char value=0; char command=0; command = Serial.read(); delay(50); //delay to allow good serial port reading value=byte((Serial.read()-48)*10); //-48 becaus ASCII value for 0 is 48, 1 is 49, etc and *10 because we read tens first delay(50); value+=byte((Serial.read()-48)); //and then we read units switch (command) { case 'h' : RTC.set(DS1307_HR,value); Serial.print("hours set to "); Serial.println(value,DEC); break; case 'm' : RTC.set(DS1307_MIN,value); Serial.print("minutes set to "); Serial.println(value,DEC); break; case 's' : RTC.set(DS1307_SEC,value); Serial.print("seconds set to "); Serial.println(value,DEC); break; case 'D' : RTC.set(DS1307_DATE,value); Serial.print("day of month set to "); Serial.println(value,DEC); break; case 'd' : RTC.set(DS1307_DOW,value); Serial.print("day of week set to "); Serial.println(value,DEC); break; case 'M' : RTC.set(DS1307_MTH,value); Serial.print("month set to "); Serial.println(value,DEC); break; case 'Y' : RTC.set(DS1307_YR,value); Serial.print("year set to "); Serial.println(value,DEC); break; case 'u' : case 'U' : use(); break; case 'r' : RTC.stop(); Serial.println("Clock stopped"); break; case 'R' : RTC.start(); Serial.println("Clock running"); break; default : break; } read_RTC(); } void loop() { if (Serial.available()) { write_RTC(); } }Не хотят часики тикать отображает в сериал
0 0 0 0 0 2000
И всё тут,
3v с батер есть 5v тоже резисторы стоят
Не понимаю что не так?
За тикали)))
Привет всем помогите пожалуйста мне с кодам как то он не корректно работает точнее он работает когда включаешь сериал монитор.
Суть кода такова устройства будит включатся и выключатся каждый день в заданное время даже если были сбои по основному питанию
#include <WProgram.h> #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include <Wire.h> #include <DS1307.h> int ledPin =13; int x; void setup() { pinMode(ledPin, OUTPUT); RTC.start(); } void loop() { x= (RTC.get(DS1307_SEC,true)); if((x>19)&&(x<30)) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }Поправьте пожалуйста код
RTC.start();А Вам их точно надо каждый раз стартовать заново?Ой нет это я проморгал
Подскажите пожалуйста как сделать так чтобы при отправки в сериал соединения 10-20
Чтобы устройство включалось на 10 и выключалось на 20 сек и чтобы этот цикл прописывался в энергонезависимую память ,
И если на ардуино выключить и включить питания чтобы этот if((x>10)&&(x<20))
Читался из памяти и выполнял те же действия на 10 – 20 сек
И соответственно если мы отправляем 30-40 то это время включения устройства также прописывается в энергонезависимой памяти и приключения ардуино включает устройства на 30-40 сек/час
#include <WProgram.h> #if defined(ARDUINO) && ARDUINO >= 100 #include "Arduino.h" #else #include "WProgram.h" #endif #include <Wire.h> #include <DS1307.h> // written by mattt on the Arduino forum and modified by D. Sjunnesson int ledPin =13; int x; byte mode = 0; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { x= (RTC.get(DS1307_SEC,false));// Читаем сек и сохраняем в х Serial.print(RTC.get(DS1307_HR,true)); Serial.print(":"); Serial.print(RTC.get(DS1307_MIN,false)); Serial.print(":"); Serial.print(RTC.get(DS1307_SEC,false));/ Serial.print(" "); Serial.print(RTC.get(DS1307_DATE,false)); Serial.print("/"); Serial.print(RTC.get(DS1307_MTH,false)); Serial.print("/"); Serial.print(RTC.get(DS1307_YR,false)); Serial.println(); delay(1000); if(Serial.available()) { String slovo = ""; while(Serial.available()) { delay(2); slovo += (char)Serial.read(); } if(slovo.substring(0,6) == "10-20") ; // Если оправляем в сериал соединения 10 - 20 то делаем то что вскопках { if((x>10)&&(x<20)) // Читаем из х значения и если эти значения с 10 по 20 секунду то делаем действия в скобках { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } if(slovo.substring(0,6) == "30-40") ; // Если оправляем в сериал соединения 30 -40 то делаем то что вскопках { if((x>30)&&(x<40)) //Читаем из х значения и если эти значения с 30 по 40 секунду то делаем действия в скобках { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } } } }http://arduino.ru/forum/obshchii/izmenenie-vremeni-taimera-na-ds1307#comment-28970 этот пример можно под ваши нужды переделать.
да с этим мне разбираться и разбираться
Привет подскажите как вот с этой штукой разобраться.
Как сделать синхронизацию часиков через GPS.
Я взял модуль TIV-ST-0-000 подключил его отправил на него команды для запуска и он мне стал присылать данные вот только я не как не могу разобраться где тут дата и время
И как мне это всё синхронизировать с часами
Подскажите пожалуйста
Оно? http://ru.wikipedia.org/wiki/NMEA_0183
Что то с трудом верится, что это синхронизация по времени, это навигационные данные, IMHO.
Дак да это приёмник GPS сигнала там координаты и должно быть время и дата как я полагаю
Да это то что нужно спасибо
Дак да это приёмник GPS сигнала там координаты и должно быть время и дата как я полагаю
Судя по описанию полей:
073339.115 - это время 07 часов 33минуты 39.115 секунд230513 - это дата 23 мая 13 года.Вот как это на сях распарсить и натолкать в массив данных - не подскажу.В awk или perl - делается достаточно просто.С этим та я разобрался , а вот как мне данные синхронизировать в часы реального времени
Вопрос в том как мне извлечь определенные цифры из строки
$GPRMC,113445.271,A,5672.2457,N,06095.7650,E,0.10,385.78,230513,,*04
11 34 45
23 05 13
Я думаю как то так нужно сделать но не знаю как реализовать.
Считываем строку с сериал соединения и сохраняем в переменную Х 8 и 9 знак
в W 10 и 11 знак
$ G P R M C , 1 1 3 4 4 5 . 2 7 1,A,5672.2457,N,0
1 2 3 4 5 6 7 8 9 10 11 12
Я думаю как то так нужно сделать но не знаю как реализовать.
Используя запятую в качестве сепаратора надо получить из строки массив из 12 полей, после чего у нас в двух элементах массива будут лежать искомые строки с временем и датой. Второй итерацией через substr() разбиваем, например, "
073339.115" на три фрагмента по два знака, отбрасывая дробную часть секунд.Если это делать на компьютере - то там все просто:echo "$GPRMC,073339.115,A,5652.2763,N,06035.7225,E,0.03,330.21,230513,,*0A" |\ awk -F, '{ sub(/[0-9][0-9]/, "&:", $2); sub(/.*:[0-9][0-9]/,"&:",$2); sub(/[0-9][0-9]/, "&-", $10); sub(/-[0-9][0-9]/, "&-20", $10); print $2 " " $10 }'Получаем:
07:33:39.115 23-05-2013
только поотнимать 0х30 надо будет.
Описание протоклоа на русском:
http://nvs-gnss.ru/support/communications-protocol/item/30-nmea.html
А на счет выделения из строки данных можно почитать, например, здесь:
http://arduino.ru/forum/programmirovanie/strengh-sscanf
Я это всё на ардуине пытаюсь собрать
А по ссылкам слабо пройтись? Ок, удачи!
- Ты в баню?
- Нет, в баню!
- Аааа, я думал в баню
Привет всем , а можно как то более по подробней, а то для меня это сложно по одной строке разобраться
легче считать посылку в обычный буфер, и обращаться к нужным элементам по номерам. buff[x]
легче считать посылку в обычный буфер, и обращаться к нужным элементам по номерам. buff[x]
Это если строка строго по позициям разбита, а здесь формат плавающий
Раздробить строку получилось , а вот как числа разделить подскажи пожалуйста?
строка
$GPRMC,072653.700,A,56
Раздробленная строка
$GPRMC
072653.700
A
56
Разделённые числа
07
26
53.700
int i=0; char buffer[100]; //если есть данные - читаем if(Serial.available()){ delay(100); //загоняем прочитанное в буфер while( Serial.available() && i< 99) { buffer[i++] = Serial.read(); } //закрываем массив buffer[i++]='\0'; } //если буфер наполнен if(i>0){ //разбераем его на части отделенные запятой sscanf(buffer, "%[^,] ,%[^,], %[^,], %[^,]", stpoka1, &stpoka2, &stpoka3, &stpoka4); } Serial.println(stpoka1); Serial.println(stpoka2); Serial.println(stpoka3); Serial.println(stpoka4); stpoka1 [0] = '\0'; stpoka2 [0] = '\0'; stpoka3 [0] = '\0'; stpoka4 [0] = '\0'; delay(5000);Подсказка помогла спасиб, а вот дальше как?
Как мне это число раздробить по частям 072653.700 чтобы получилось 07 26 53?
Как мне это число раздробить по частям 072653.700 чтобы получилось 07 26 53?
substring(pos1, pos2); не помогает?
http://arduino.cc/en/Tutorial/StringSubstring - на редкость бестолково описана функция, но уж что есть - то есть...
Как мне это число раздробить по частям 072653.700 чтобы получилось 07 26 53?
substring(pos1, pos2); не помогает?
http://arduino.cc/en/Tutorial/StringSubstring - на редкость бестолково описана функция, но уж что есть - то есть...
Привет в этом примере я так и не смог разобраться
Как мне это число раздробить по частям 072653.700 чтобы получилось 07 26 53?
Привет в этом примере я так и не смог разобраться
Ну, смотрите:
Ваша строка: 072653.700
Позиции: 0123456789 (иногда нумеруют начиная с единицы - это надо проверять, т.к. пишут все как попало...)
Функция позволяет вырезать определенный фрагмент, т.е. в переменную A загнать кусочек строки (например с позиции 0 по позицию 1) и так далее. Да, там по ссылке в примере слово "текст" (на английском!) из пяти букв, так что готовьтесь к тому, что придется проверять - правильно ли оно вырезает фрагменты из строки. :)
Почему у меня этот код пишет ошибку, что в нём не хватает?
void setup() { // Open serial communications and wait for port to open: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } // send an intro: Serial.println("\n\nString substring():"); Serial.println(); } void loop() { // Set up a String: String stringOne = "Content-Type: text/html"; Serial.println(stringOne); // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(19) == "html") { Serial.println("It's an html file"); } // you can also look for a substring in the middle of a string: if (stringOne.substring(14,18) == "text") { Serial.println("It's a text-based file"); } // do nothing while true: while(true); }sketch_may26c.cpp: In function 'void setup()':
sketch_may26c:3: error: no match for 'operator!' in '!Serial'
sketch_may26c.cpp:7: note: candidates are: operator!(bool) <built-in>
Удалите 4, 5 и 6 строки.
Удалять я удалял но он не работает или я что то не то делаю
Я отправляю в сериал символы а в ответ тишина
Максим подскажи пожалуйста с кодам.
Я пытаюсь синхронизировать часы на микросхеме DS1307 с помощью GPS приёмника .
Подключил GPS приёмник скинул на него настройки и он мне стал выдавать строку
$GPRMC,113445.271,A,5672.2457,N,06095.7650,E,0.10,385.78,230513,,*04
Время дата
Причём это строка может уменьшатся и увеличиваться в размерах из за координат поэтом у я её раздробил по частям
С помощью этого кода я разобрал строку по частям.
int i=0; char buffer[100]; //если есть данные - читаем if(Serial.available()){ delay(100); //загоняем прочитанное в буфер while( Serial.available() && i< 99) { buffer[i++] = Serial.read(); } //закрываем массив buffer[i++]='\0'; } //если буфер наполнен if(i>0){ //разбераем его на части отделенные запятой sscanf(buffer, "%[^,] ,%[^,], %[^,], %[^,]", stpoka1, &stpoka2, &stpoka3, &stpoka4); } Serial.println(stpoka1); Serial.println(stpoka2); Serial.println(stpoka3); Serial.println(stpoka4); stpoka1 [0] = '\0'; stpoka2 [0] = '\0'; stpoka3 [0] = '\0'; stpoka4 [0] = '\0'; delay(5000);и у меня получилась так
$GPRMC,
113445.271,
A,
А для синхронизации мне нужно время и дату разобрать на двоичные числа
Разделить по частям
11 час
34 мин
45 сек
Привет все вроде бы вот с этой примером разобрался.
Но не как не могу сообразить как мне не сверять значения между 20,21, а сохранять
Что бы патом выводить Serial.println("");
Подскажите пожалуйста как это сделать?
String stringOne = "asdfghjytrewqasdfghy100qawsedrft"; // Разбираем строку на знаки и сохраняем в stringOne Serial.println(stringOne); if (stringOne.substring(20,23) == "100") { // Читаем из stringOne смотрим что между знаками 20,23 и если между ними 100 то делаем действия в скобках Serial.println("It's an 100 file"); }Как то вот так должно быть но у меня почему та в сериал просто приходит 0
String stringOne = "asdfghjytrewqasdfghy100qawsedrft"; // Разбираем строку на знаки и сохраняем в stringOne Serial.println(stringOne); asd=stringOne.substring(20,23); // Читаем из stringOne смотрим что между строками 20,23 и сохраняем в asd Serial.println(asd);всё работает. сериал нормально работает?
Вот что он выдаёт
asdfghjytrewqasdfghy100qawsedrft
0
asdfghjytrewqasdfghy100qawsedrft
0
asdfghjytrewqasdfghy100qawsedrft
0
asdfghjytrewqasdfghy100qawsedrft
Вместо нуля должно быть 100
у меня 100. а asd как объявлен?