не с диодом пока до конца не разобрался, но вот назначать входом пин который должен работать как выход , туда же подтянуть резистор как для входа с кнопки и еще после того как тебя ткнули в это носом не сразу устранить обе ошибки а только одну и сидеть думать что же не так - это клиника.
TimeWork у Вас какого типа? А millis какого? И как Вы ловко одно из другого вычитаете?
Кстати,
iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.
В смысле из unsigned long нельзя вычитать int? и в книгах об этом наверняка написано. честно говоря я думал что так как и там и там числовые значения то тип не важен))
#include <iarduino_RTC.h>
iarduino_RTC Time (RTC_DS1302,7,6,5);
char LED = 12;
unsigned long TimeWork ;
void setup(){
delay(300);
Serial.begin(9600);
Time.begin();
pinMode(LED, INPUT);
}
void loop(){
if(millis()%1000==0){
Serial.println (Time.gettime("d-m-Y, H:i:s, D")); // выводим время
}
if (Time.seconds==30){
digitalWrite(LED,HIGH);
TimeWork = millis() ;
}
if (millis() - TimeWork >= 1000){
digitalWrite(LED,LOW);
}
delay(1);
}
вот значит посмотрел, что millis имеет тип unsigned long и с этим учетом изменил тип переменной TimeWork. так эже на всякий случай узнал что значение с RTC модуля приходит в uint8_t а это тип unsigned char, но тут уж я не придумал ни чего исправить(да и эта часть кода вроде бы работает нормально).
но где то я что то еще напортачил, так как слишком уж сильно загружен микроконтроллер (бывает даже в порт пропускает вывод строчки(через секунду прыгает))
попробовал другую библиотеку. может ардуинка из за нее пропускать вывод времени в порт? (промежутки аж по 10 сек бывают) или это от большого кол - ва команд serial.print?
#include <DS1302.h>
DS1302 rtc(7, 6, 5);
unsigned long TimeWork;
boolean LED = 12;
void setup()
{
pinMode(LED,INPUT);
Serial.begin(9600);
}
void loop()
{
Time t = rtc.getTime();
if(millis()%1000==0){
Serial.print(t.year);Serial.print(".");
Serial.print(t.date);Serial.print(".");
Serial.print(t.mon);Serial.print(" ");
Serial.print(t.hour);Serial.print(":");
Serial.print(t.min);Serial.print(":");
Serial.println(t.sec);
}
if (t.sec==10){
digitalWrite(LED,HIGH);
TimeWork = millis() ;
}
if (millis() - TimeWork >= 1000){
digitalWrite(LED,LOW);
}
delay(1);
}
я разобрался по чему светодиод работает 2 секунды. когда время становится равно 30сек программа вновь и вновь переписывает переменной TimeWork значение millis, пока время не станет равно 31сек дальше идет отсчет одной секунды, что бы выключить светодиод, тоесть отсчет начинается не с начала 30й а с конца и + 1 сек. хотя светодиод включается с начала 30й)) жесть. а стоит ли ограничевать количество выполнения функций "if"?
P.S. мне кажется стоит, что бы не ело ресурс. а вы , форумчане, как думаете?
#include <iarduino_RTC.h>
iarduino_RTC Time (RTC_DS1302,7,6,5);
unsigned long TimeWork;
char LED = 12;
unsigned long r;
boolean qr = true;
void setup(){
delay(300);
Serial.begin(9600);
Time.begin();
pinMode(LED, OUTPUT);
r = millis();
}
void loop(){
if( millis()- r >= 1000ul){
Serial.println (Time.gettime("d-m-Y, H:i:s, D"));
r=millis();
}
if (qr = true && Time.seconds == 30){
digitalWrite(LED,HIGH);
TimeWork = millis();
qr = false;
Serial.println("BK");
}
if (millis()- TimeWork == 1000ul){
digitalWrite(LED,LOW);
qr =true;
}
delay(1);
}
вот что получилось. проблемка вроде бы должна быть решена(светодиод работаетать как нужно ровно секунду) но все равно его время работы -2сек. + все время пока длятся эти 2 секунды циклично работает оператор if стр21, (всё время печатается надпись "ВК") ни как не пойму почему? вход в него должна закрывать переменная "qr"
Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).
Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).
Спасибо!!!
Совет: пиши условие так if (10 = x) и компилятор остановится в месте, где юзер недоглядел.
Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).
#include <Servo.h>
#include <iarduino_RTC.h>
iarduino_RTC Time (RTC_DS1302,7,6,5); //назначение пинов обмена данными RST, CLK, DAT
Servo servo; //имя сервопривода
int pos = 0; //переменная хранящая угол поворота сервопривода
unsigned long TimeWork; //переменная хранящая время включения сервопривода
const char LED = 12; //номер пина светодиода(стадия разработки)
unsigned long r; //переменная хранящая время прошедшее с момента вывода даты и времени с RTC в порт
boolean qr = true; //переменная меняющая значение в момент включения и выключения сервопривода(служит для ограничения срабатывания по времени с RTC до одного раза за секунду)
void setup(){
Time.begin(); //инициализация работы часов
servo.attach(4); //назначение пина управления сервоприводом
delay(300); //время на подумать
Serial.begin(9600); //инициализация порта
//Time.settime(0,05,10,02,02,2020,7); // 0 сек, 51 мин, 21 час, 27, октября, 2015 года, вторник
pinMode(LED, OUTPUT); //назначение пина светодиода выходом (индикация работы)
r = millis();
servoOpen(); //выполнить функцию для изначального позицианирования
servoToClose(); //выполнить функцию для изначального позицианирования
}
void loop(){
if( millis()-r>=1000ul){ //оператор для настройки(выполнять раз в секунду)
Serial.println (Time.gettime("H:i:s")); //выводить в серийный порт значения Час:Мин:Сек
r=millis(); //присвоить переменной значение millis
}
if (qr==true&&Time.Hours==15&&Time.minutes==28&&Time.seconds==30){ // если переменная qr имеет значение true и время 15:28:30 то
qr=false; //присвоить переменной значение false
TimeWork=millis(); //присвоить переменной значение millis
digitalWrite(LED,HIGH); //включить светодиод
servoOpen(); //выполнить функцию
Serial.println("BKЛ"); //вывести в серийный порт надпись ВКЛ (стадия настройки, отладки)
}
if (qr==true&&Time.Hours==15&&Time.minutes==28&&Time.seconds==10){ //если переменная qr имеет значение true и время 15:28:10 то
qr=false; //присвоить переменной значение false
TimeWork=millis(); //присвоить переменной значение millis
digitalWrite(LED,HIGH); //включить светодиод
servoOpen(); //выполнить функцию
Serial.println("BKЛ"); //вывести в серийный порт надпись ВКЛ (стадия настройки, отладки)
}
if (millis()-TimeWork>=5000ul&&qr==false){ //если переменная qr имеет значение false, а с момента присвоения переменной TimeWork значения millis прошло 5 сек то
qr=true; //присвоить переменной значение true
digitalWrite(LED,LOW); //вsключить светодиод
servoToClose(); //выполнить функцию
Serial.println("BыKл"); //вывести в серийный порт надпись ВыКл (стадия настройки, отладки)
}
}
void servoOpen(){ //создать функцию
for (pos = 0; pos <= 90; pos += 1){ //оператор:если переменная pos ровна нулю то: это меньше или ровно 90?: если да то прибавить к значению переменной pos единицу и выполнить функцию
servo.write(pos); //повернуть вал сервопривода на градус равный значению переменной pos
delay(5); //перерыв в работе 0.005сек
}
}
void servoToClose(){ //создать функцию
for (pos = 90; pos >= 0; pos -= 1) { //оператор:если переменная pos ровна 90 то: это больше или ровно 0?: если да то отнять от значения переменной pos единицу и выполнить функцию
servo.write(pos); //повернуть вал сервопривода на градус равный значению переменной pos
delay(5); //перерыв в работе 0.005сек
}
}
С изучения какого языка программирования нужно начать, что бы максимально быстро разобраться с операторами? Понять как они работают? Например - когда ставлю в одном условии больше одного оператора "||" Скетч уже не работает как нужно.
С изучения какого языка программирования нужно начать, что бы максимально быстро разобраться с операторами? Понять как они работают? Например - когда ставлю в одном условии больше одного оператора "||" Скетч уже не работает как нужно.
алфавит один, но языки разные, хотя и много похожих слов... а по произношению англичане америкосов понимают с большим трудом и наоборот, на сколько мне известно.
алфавит один, но языки разные, хотя и много похожих слов... а по произношению англичане америкосов понимают с большим трудом и наоборот, на сколько мне известно.
сдается мне, что английский вы знаете примерно на том же уровне, что и Си :)
Мошт он устал без резистора гореть?
пляяяяя... я дурачок по ходу. Не обращайте на меня внимания))
пляяяяя... я дурачок по ходу. Не обращайте на меня внимания))
да как же не обращать-то? Только забудем про вас, расслабимся - вы тут же с кучей новых вопросов...
Что там с диодом было, расскажите, а то сегодня не засну...
не с диодом пока до конца не разобрался, но вот назначать входом пин который должен работать как выход , туда же подтянуть резистор как для входа с кнопки и еще после того как тебя ткнули в это носом не сразу устранить обе ошибки а только одну и сидеть думать что же не так - это клиника.
Господи, ну TimeWork у Вас какого типа? А millis какого? И как Вы ловко одно из другого вычитаете?
Кстати,
iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.
TimeWork у Вас какого типа? А millis какого? И как Вы ловко одно из другого вычитаете?
Кстати,
iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.
В смысле из unsigned long нельзя вычитать int? и в книгах об этом наверняка написано. честно говоря я думал что так как и там и там числовые значения то тип не важен))
вот значит посмотрел, что millis имеет тип unsigned long и с этим учетом изменил тип переменной TimeWork. так эже на всякий случай узнал что значение с RTC модуля приходит в uint8_t а это тип unsigned char, но тут уж я не придумал ни чего исправить(да и эта часть кода вроде бы работает нормально).
но где то я что то еще напортачил, так как слишком уж сильно загружен микроконтроллер (бывает даже в порт пропускает вывод строчки(через секунду прыгает))
ах да, на счет библиотеки - сейчас займусь)
iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.
вот где настоящее г
iarduino_RTC.h == брось каку и никогда не подбирай с помойки что попало.
вот где настоящее г
Вам виднее.
Только проблемы у Вас, а не у меня :-)
не, я к тому что начал искать другую библиотеку, нашел DS1302.h. убил пол вечера на ее изучение, а она оказалась в несколко раз хуже предыдущей...
И это только начало. Через полгода найдете нормальную библиотеку, но поймёте, что этот чип RTC - отстой.
от спасибо)) утешил так утешил)))))) XD
Ну, отстой - не отстой, лишь бы функции свои выполнял. У меня работает как первый советский трактор.)
"Первый советский" трактор был американским ;))
здравствуйте товарищи.
попробовал другую библиотеку. может ардуинка из за нее пропускать вывод времени в порт? (промежутки аж по 10 сек бывают) или это от большого кол - ва команд serial.print?
нет, все таки какая то проблема с 21й строчки начинается, по тому что без этого блока пропуски больше 2х секунд не возникают...
Это лишь "вишенку на торт" добавляет (но, действительно, добавляет).
Основная же проблема в том, что сравнение в строке №13 категорически несовместимо со строкой №28.
Посол, сравнение в строке 13 - это бредятина, кочующая из примера в пример, о ней писалось на форуме многократно. Секунды так отмерять нельзя
Что там с диодом было, расскажите, а то сегодня не засну...
pinMode(LED, OUTPUT);
я на кой то фиг сначала просто удалил, а потом переписал в pinMode(LED, INPUT);
в общем, проблему с яркостью только что решил.
осталась проблема с
микроконтроллер этот оператор постоянно повторяет... сейчас буду разбираться с этим
я разобрался по чему светодиод работает 2 секунды. когда время становится равно 30сек программа вновь и вновь переписывает переменной TimeWork значение millis, пока время не станет равно 31сек дальше идет отсчет одной секунды, что бы выключить светодиод, тоесть отсчет начинается не с начала 30й а с конца и + 1 сек. хотя светодиод включается с начала 30й)) жесть. а стоит ли ограничевать количество выполнения функций "if"?
P.S. мне кажется стоит, что бы не ело ресурс. а вы , форумчане, как думаете?
5,15 = ох и дурень...
не хватает ума что бы придумать как сделать так, что бы функция в 15 строке выполнялась только 1 раз в минуту.
https://youtu.be/sGAECdguKfY
не хватает ума что бы придумать как сделать так, что бы функция в 15 строке выполнялась только 1 раз в минуту.
а зачем для этого RTC ? - это можно сделать на миллис, читайте в сотый раз пример блинк без делей...
а зачем для этого RTC ?
по тому, что этот код пока просто отладка части основного кода, в котором нужны будут показания с RTC
именно проверка условия (строка 15)? - Если это сделать, оно перестанет выполнять свою функцию
Правильно, чтобы строка 15 выполнялась хоть каждую миллисекунду, но срабатывала лишь раз в минуту.
вот что получилось. проблемка вроде бы должна быть решена(светодиод работаетать как нужно ровно секунду) но все равно его время работы -2сек. + все время пока длятся эти 2 секунды циклично работает оператор if стр21, (всё время печатается надпись "ВК") ни как не пойму почему? вход в него должна закрывать переменная "qr"
Внимательно, очень внимательно, very carefully смотрим на вот эту строчку
if
(qr =
true
&& Time.seconds == 30)
Если не помогает, перечитываем "Операторы сравнения" и смотрим снова.
Внимание!
Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).
Спасибо!!!
заработало №2 !!! Спасибо за помощь!
стоит ли ограничевать количество выполнения функций "if"?
P.S. мне кажется стоит, что бы не ело ресурс
Это правильно, ресурс оператора if нужно экономить, его запас на планете не безграничен!
Внимание!
Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).
Спасибо!!!
Совет: пиши условие так if (10 = x) и компилятор остановится в месте, где юзер недоглядел.
Внимание!
Следите, чтобы случайно не использовать знак простого равенства (например, if (x = 10)). Знак простого равенства – это оператор присваивания, и устанавливает значение х равное 10 (заносит значение 10 в переменную х).
Ну, спасибо, что сказали, будем знать.
Да нет, это была цитата из правил использования операторов. И написал я ее к тому, что нашел то, зачем Вы меня туда посылали)))
я сделал!)))
Ваши замечания , товарищи эксперты?
С изучения какого языка программирования нужно начать, что бы максимально быстро разобраться с операторами? Понять как они работают? Например - когда ставлю в одном условии больше одного оператора "||" Скетч уже не работает как нужно.
не может быть!!!
зачем вам начинать с какого иного языка, если вам нужен С/С++ ? - его и изучайте сразу
не верю, показывайте код
не верю, показывайте код
Не верите в то, что ТС может написать простейшее условие так, чтобы оно не работало?
Недооцениваете Вы людей! А кадры - они "решают всё"!
не верю, показывайте код
ужо точно не помню, но что то вроде этого
Даже Javascript таких фокусов показывать не умеет.
зачем вам начинать с какого иного языка, если вам нужен С/С++ ? - его и изучайте сразу
а С и С++ это разве не разные языки? книги вроде разные...
Английский и американский языки - разные?
алфавит один, но языки разные, хотя и много похожих слов... а по произношению англичане америкосов понимают с большим трудом и наоборот, на сколько мне известно.
Ну, вот примерно так же между C и C++
алфавит один, но языки разные, хотя и много похожих слов... а по произношению англичане америкосов понимают с большим трудом и наоборот, на сколько мне известно.
сдается мне, что английский вы знаете примерно на том же уровне, что и Си :)
ужо точно не помню, но что то вроде этого
неудивительно, что это не работает.
Если вы думаете, что запись
означает
"если часы равны восемналцать, или часы равны восемь или часы равны девять"
- то вы жесткого ошибаетесь
Когда вы учебник начнете читать? - полтора месяца прошло - а вы все спрашиваете, с чего начать... Начните уже с чего-нибудь
ужо точно не помню, но что то вроде этого
неудивительно, что это не работает.
Если вы думаете, что запись
означает
"если часы равны восемналцать, или часы равны восемь или часы равны девять"
- то вы жесткого ошибаетесь
именно так я и думал... потом решил в скобочки взять(qr==true&&((Time.Hours==18||8||9)&&(Time.minutes==49||10||15)&&(Time.seconds==30||50||20)))
но это так тоже не работает))
а английский я знаю не хуже яндекс переводчика)) (за то у меня супруга педагог по английскому, вот я на счет своих знаний и не заморачивался никогда)
именно так я и думал... потом решил в скобочки взять(qr==true&&((Time.Hours==18||8||9)&&(Time.minutes==49||10||15)&&(Time.seconds==30||50||20)))
но это так тоже не работает))
я вам повторяю, что даже в одной скобочке
- у вас уже чушь написана
я вам повторяю, что даже в одной скобочке
- у вас уже чушь написана