нужна помощь с арифметической функцией

0259
0259 аватар
Offline
Зарегистрирован: 30.03.2014

Здравствуйте читатели и Помогатели

для Начала Ноздравляю Вас с Наступающим Новым Годом!

Теперь к теме;

Писал я код который двигает серво привод по таймеру реального времени (качелька серво должна отклониться 6 раз через каждые 25 мин но во мой недочет (переменная interval в неё загружается время с таймера) время первого отклонения определяется кнопкой butt.

Вот что я бы хотел понять как сделать переменную  (interval) не бездонной а не более значения 60

Да еще притом что к переменой каждый раз должно прибавляться 25 и не переполняться больше 60

 

P.S. мне очень сложно такое объяснить даже людям посмотрите код пожалуйста!

Он должен прояснить взгляд на ситуацыю!




#include <stdio.h>
#include <DS1302.h>
#include <Servo.h>

namespace {


const int kCePin   = 8;  // Chip Enable
const int kIoPin   = 9;  // Input/Output
const int kSclkPin = 10;  // Serial Clock
int butt = 0;
int interval = 110;
Servo myservo;

DS1302 rtc(kCePin, kIoPin, kSclkPin);

String dayAsString(const Time::Day day) {
  switch (day) {
    case Time::kSunday: return "Sunday";
    case Time::kMonday: return "Monday";
    case Time::kTuesday: return "Tuesday";
    case Time::kWednesday: return "Wednesday";
    case Time::kThursday: return "Thursday";
    case Time::kFriday: return "Friday";
    case Time::kSaturday: return "Saturday";
  }
  return "(unknown day)";
}



}  
void setup() {
  Serial.begin(9600);
  myservo.attach(3);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(22,INPUT);
  pinMode(24,OUTPUT);
  pinMode(28,OUTPUT);
  digitalWrite(28,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,HIGH);
  
rtc.writeProtect(false);
rtc.halt(false);

 
}

void printTime() {

digitalWrite(24,HIGH);
delay(1000);
for(int i = 0 ; i < 6; i++){
  for(int pos = 20; pos < 180; pos += 1)  
  {                                  
    myservo.write(pos);              
    delay(1);                    
  } 
  for(int pos = 180; pos>=20; pos-=1)   
  {                                
    myservo.write(pos);              
    delay(1); 
    myservo.write(20);             
  }   
    }
}




void loop() {
  
  Time t = rtc.time();

 
  const String day = dayAsString(t.day);

  
  char buf[50];
  snprintf(buf, sizeof(buf), "%s %04d-%02d-%02d %02d:%02d:%02d",
           day.c_str(),
           t.yr, t.mon, t.date,
           t.hr, t.min, t.sec);

  
  Serial.println(buf);
  butt = digitalRead(22);
  if(butt == LOW){interval = t.sec; };
  if(t.sec == interval){ printTime();
   interval = interval + 25;
  Serial.println(interval);}
  digitalWrite(24,LOW);
  if(interval > 60){digitalWrite(28,HIGH);}else{digitalWrite(28,LOW);}
  delay(1000);
}

и у меня стоят сикунды в коде для наглядности

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Чтобы переменная не переполнялась можно использовать if . В чем проблема его использовать?

0259
0259 аватар
Offline
Зарегистрирован: 30.03.2014

kisoft пишет:
Чтобы переменная не переполнялась можно использовать if . В чем проблема его использовать?

 

Тут не все так просто ! если в (interval)было помешено таймером 55 функция в программе прибавляет 25 получается (80) функцией if я сброшу (interval) на ноль а должно не обнуляться а получаться (20) так то можно но тут начинается одна проблема она в том что в (interval) я помещаю значение с таймера и предугадать что получиться функцией if будит очень сложно!!!

вот представте

if(interval == 80){interval = 20;}
if(interval == 75){interval = 15;}
if(interval == 70){interval = 10;}
if(interval == 65){interval = 5;}
....

 

это только кусок и представьте сколько это памяти и придется код писать не накаждые 5 мин а на каждую мин!

faraddin
Offline
Зарегистрирован: 11.08.2013

если интервал больше 60 отнять 60. повторить.

0259
0259 аватар
Offline
Зарегистрирован: 30.03.2014

я вам очень благодарен спасибо элементарно просто а я дойти сам не мог 



if(interval == 60) {interval = interval - 60;}   //Всего одна строка 
//faraddin огромное спасибо 

 

faraddin
Offline
Зарегистрирован: 11.08.2013

0259 пишет:

я вам очень благодарен спасибо элементарно просто а я дойти сам не мог 



if(interval == 60) {interval = interval - 60;}   //Всего одна строка 
//faraddin огромное спасибо 

 

А если интервал будет 61? Тут нужно  if (interval >= 60 ) ну или просто (interval >60) в зависимости какую максимальную цифру вам надо, 60 или 59