Здравствуйте. Совсем недавно посетила меня идея сделать плавный автоматический свет для аквариума. Под рукой был какой-от таймер с али и маленькая на attiny85 ардуинка. Алгоритм работы программы таков:
Когда на timer_pin у нас 1 программа ничего не делает. Но вот таймер досчитывает до опр. времени и опускает timer_pin в 0, начинается плавное наращивание якрости. После того как яркость достинает максимума, программа ничего не делает и ждет, когда таймер перестанет timer_pin укладывать в 0 и на нем снова появится 1. Когда это происходит, начинается плавное снижение яркости.
Как сделать так, чтобы после того как яркость достигнет своего предела, ее можно бы было уменьшать и прибавлять с момощью двух кнопок? (одна, соответственно, на повышение, другая - на понижение). Также измененное значение ярксти должно сохранятся.
В процессе проб и ошибок получилось аж два варианта кода. Какой из них более верный и в какой будет лучше внедрить вышеописанное?
В программировании я, ну конечно же, новичок. Да и в целом гуманитарий. Меня в детстве математичка по голове транспортиром била.
Вариант 1:
03 | #define spd 20 //скорость наращивания яркости |
09 | pinMode(led_pin, OUTPUT); |
10 | pinMode(timer_pin, INPUT); |
15 | while ((digitalRead(timer_pin) == 0) && (x < 255)){ |
16 | if ((millis() - timing) > spd){ |
18 | y = 0.003921569 * pow(x, 2); |
19 | analogWrite(led_pin, y); |
24 | while ((digitalRead(timer_pin) == 1) && (x > 0)){ |
25 | if ((millis() - timing) > spd){ |
27 | y = 0.003921569 * pow(x, 2); |
28 | analogWrite(led_pin, y); |
Вариант 2:
03 | #define spd 20 //скорость наращивания яркости |
09 | pinMode(led_pin, OUTPUT); |
10 | pinMode(timer_pin, INPUT); |
16 | if ((millis() - timing) > spd){ |
17 | if ((digitalRead(timer_pin) == 0) && (x < 255)){ |
20 | else if ((digitalRead(timer_pin) == 1) && (x > 0)){ |
23 | y = 0.003921569 * pow(x, 2); |
24 | analogWrite(led_pin, y); |
Код 2. while (строки 15 и 28) удалить. Вместо цифры 255 (максимум) сделать переменную, и её мотать кнопками.
Синтаксис записи:
1
#include <EEPROM.h> // добавить наверху
2
3
byte
x=EEPROM.read(addr);
// чтение
4
// addr = int, число не более размера EEPROM -1, можно просто 0
5
6
EEPROM.write(addr,x);
// x = byte, запись
EEPROM.update() экономичней при верном использовании.
я чутка придерусь ... :)
1
if
((digitalRead(timer_pin) == 0) && (x < 255))
зачем стока скобок ?
я не профи, может по стандартам чистого С оно так и надо, ЕвгенийП что скажите ?
я чутка придерусь ... :)
1
if
((digitalRead(timer_pin) == 0) && (x < 255))
зачем стока скобок ?
я не профи, может по стандартам чистого С оно так и надо, ЕвгенийП что скажите ?
я чутка придерусь ... :)
1
if
((digitalRead(timer_pin) == 0) && (x < 255))
зачем стока скобок ?
я не профи, может по стандартам чистого С оно так и надо, ЕвгенийП что скажите ?
Хотя бы потому, что в различных языках установлен разный приоритет операций.
А скобки этот факт нивелируют.
И вообще, уж на что не следует скупиться, так это именно на скобки. Они снимают все возможные неоднозначности.
ну не знаю, наверное дело привычки, но совсем параноидная запись
1
if
(((digitalRead(timer_pin) == 0) && (x < 255)))
для меня просто становится не читаемой.
ну не знаю, наверное дело привычки, но совсем параноидная запись
1
if
(((digitalRead(timer_pin) == 0) && (x < 255)))
для меня просто становится не читаемой.
спор ни о чем
Я тоже пишу "совсем параноидально" - то есть в примере выше я именно так скобки и расставил бы.
На мой вгляд, если поставишь лишнюю пару скобок - это может кого-то насмешит, но ошибкой не станет. Недостаток скобок всегда хуже.
ну не знаю, наверное дело привычки, но совсем параноидная запись
1
if
(((digitalRead(timer_pin) == 0) && (x < 255)))
для меня просто становится не читаемой.
Это Вы, наверное, на Лиспе не писали :)
Хакерам удалось украсть последние 50 МБ исходного кода программы на Lisp, которая управляет запуском баллистических ракет США.
К счастью, там были только закрывающие скобки. (С)
Это Вы, наверное, на Лиспе не писали :)
нет, даже не "нюхал".
спор ни о чем
я не вижу ни малейшего намека на спор.
На мой вгляд, если поставишь лишнюю пару скобок - это может кого-то насмешит, но ошибкой не станет.
так-же как и не станет ошибкой их отсутствие.
не исключаю, что это может кого-то расстроить.
Спасибо всем большое за ответы, не думал, что столько людей откликнется.
Вот что у меня получилось:
01
#define led_pin 10
02
#define timer_pin 7
03
#define spd 10
04
05
byte
t = 255;
06
float
x;
07
unsigned
long
timing;
08
09
void
setup
(){
10
pinMode(led_pin, OUTPUT);
11
pinMode(timer_pin, INPUT);
12
pinMode(3, INPUT);
13
pinMode(2, INPUT);
14
Serial
.begin(9600);
15
}
16
void
loop
(){
17
byte
y;
18
if
(digitalRead(3) == 1){
19
delay(50);
20
t--;
21
x--;
22
}
23
else
if
((digitalRead(2) == 1) && (x < 255)){
24
delay(50);
25
t++;
26
x++;
27
}
28
if
((millis() - timing) > spd){
29
if
((digitalRead(timer_pin) == 0) && (x < t)){
30
x++;
31
}
32
else
if
((digitalRead(timer_pin) == 1) && (x > 0)){
33
x--;
34
}
35
y = 0.003921569 * pow(x, 2);
36
analogWrite(led_pin, y);
37
Serial
.println(x);
38
timing = millis();
39
}
40
}
Получилось примерно так. Теперь все как и положено: яркость можно регулировать кнопками. Но! Первый момент, как реализовать антидребезг и задержку (чтоб при малейшем нажатии у меня сразу в огромный минус переменные не уходили) у кнопок без delay? Я пытался туда millis заколхозить, но в итоге вышла ерунда полная и ничего не заработало. Второй момент, не получилось реализовать eeprom, так как при первом запуске программы t присваивется значение 255, а без этого, мне кажется, никак.
По поводу скобок. Я как-то недавно писал скрипт на php для вк (это был мой первый опыт в программировании) и меня по этому поводу один хороший человек консультировал, он-то как раз и порекомендовал мне эти скобки расставлять. С ними, на мой взгляд, код чуть лучше воспринимается на глаз, но тут уж кто как привык.
Эй, ну куда же вы все подевались(
Программа у вас "не той системы". А все как реализовать уже написано мной не один раз и неоднократно. Просто повторяться надоедает.
Как понять "не той системы"?
Написано на "кухаркином блинк программировании". Вот от туда и все проблемы растут. Зато код понятен как полено.
Как понять "не той системы"?
Ну, как, так и понимать: https://www.youtube.com/watch?v=NHaPCiKwUq8
А в коде, написанный мной, в составных логических условиях будут "лишние" скобки - для наглядности и однозначности, ибо для моего уровня знакомства с языком такая запись надежнее.