нужна помощь с арифметической функцией
- Войдите на сайт для отправки комментариев
Здравствуйте читатели и Помогатели
для Начала Ноздравляю Вас с Наступающим Новым Годом!
Теперь к теме;
Писал я код который двигает серво привод по таймеру реального времени (качелька серво должна отклониться 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);
}
и у меня стоят сикунды в коде для наглядности
Чтобы переменная не переполнялась можно использовать 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 мин а на каждую мин!
если интервал больше 60 отнять 60. повторить.
я вам очень благодарен спасибо элементарно просто а я дойти сам не мог
if(interval == 60) {interval = interval - 60;} //Всего одна строка //faraddin огромное спасибоя вам очень благодарен спасибо элементарно просто а я дойти сам не мог
if(interval == 60) {interval = interval - 60;} //Всего одна строка //faraddin огромное спасибоА если интервал будет 61? Тут нужно if (interval >= 60 ) ну или просто (interval >60) в зависимости какую максимальную цифру вам надо, 60 или 59