тыкать ли пин каждый цикл?

Kest430
Offline
Зарегистрирован: 21.06.2016

Добрый день.

 

Есть ардуина, к которой подключен блок релешек.

Управляется все это по блютусу, кнопочками и сенсорным экраном.

 

boolean Relay_flag[8];

#define PIN_RELAY_01 22
#define PIN_RELAY_02 23
#define PIN_RELAY_03 24
#define PIN_RELAY_04 25

void setup()
{
тут какой-то код
}

void loop()
{
if (нажата кнопка 1) Relay_flag[0] = !Relay_flag[0]
if (нажата кнопка 2) Relay_flag[1] = !Relay_flag[1]
if (с блютуса прилетела команда 3) Relay_flag[2] = !Relay_flag[2]
if (на экране нажата кнопка 4) Relay_flag[3] = !Relay_flag[3]

  digitalWrite (PIN_RELAY_01, Relay_flag[0]);
  digitalWrite (PIN_RELAY_02, Relay_flag[1]);
  digitalWrite (PIN_RELAY_03, Relay_flag[2]);
  digitalWrite (PIN_RELAY_04, Relay_flag[3]); 
}

 

Получается что каждый цикл ардуина тыкает пин, говоря ему High он или Low.

Правильно ли это? Или грамотнее завести еще один массив переменных "bool Prev_Relay_flag[8]", сравнивать текущее значение флага с предыдущим и, если изменилось - тыкать пин?

evgta
Offline
Зарегистрирован: 02.09.2016

Тыкает и тыкает есть не просит. Имхо

Logik
Offline
Зарегистрирован: 05.08.2014

Для простого проект пофиг. Главное чтоб не сложилось мнение что надо обязательно тыкать каждый раз. В принципе однажды установить достаточно и на века будет, т.е. до ребута.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Я бы не "тыкал"

boolean Relay_flag[8];

#define PIN_RELAY_01 22
#define PIN_RELAY_02 23
#define PIN_RELAY_03 24
#define PIN_RELAY_04 25

void setup()
{
тут какой-то код
}

void loop()
{
	if (нажата кнопка 1) { 
		Relay_flag[0] = !Relay_flag[0];
		digitalWrite (PIN_RELAY_01, Relay_flag[0]);
	};
	
	if (нажата кнопка 2) {
		Relay_flag[1] = !Relay_flag[1];
		digitalWrite (PIN_RELAY_02, Relay_flag[1]);
	};
	
	if (с блютуса прилетела команда 3) { 
		Relay_flag[2] = !Relay_flag[2];
		digitalWrite (PIN_RELAY_03, Relay_flag[2]);	
	};
	
	if (на экране нажата кнопка 4) {
		Relay_flag[3] = !Relay_flag[3];
		digitalWrite (PIN_RELAY_04, Relay_flag[3]); 
	};	
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Это мне напоминает анекдот:

Жил- был один дибил. И что не сделает , то выходит по дибильному.
Вот и жалуется всем. 
- Что это везде вокруг работа дибильная. Найдите мне нормальную работу, потому что я делать дибильную задолбался.

Ну почему не делать так.

boolean Relay_flag[8];

#define PIN_RELAY_01 22
#define PIN_RELAY_02 23
#define PIN_RELAY_03 24
#define PIN_RELAY_04 25

void setup()
{
  тут какой -то код
}

void loop()
{
  if (нажата кнопка 1)               digitalWrite (PIN_RELAY_01, Relay_flag[0] = !Relay_flag[0]);
  if (нажата кнопка 2)               digitalWrite (PIN_RELAY_02, Relay_flag[1] = !Relay_flag[1]);
  if (с блютуса прилетела команда 3) digitalWrite (PIN_RELAY_03, Relay_flag[2] = !Relay_flag[2]);
  if (на экране нажата кнопка 4)     digitalWrite (PIN_RELAY_04, Relay_flag[3] = !Relay_flag[3]);

}

Тогда и темы тупой бы не было.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
if (нажата кнопка 1)               digitalWrite (PIN_RELAY_01, Relay_flag[0] = !Relay_flag[0]);

Хотел так написать, но подумал у ТС мозг вскипит.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Kest430 пишет:

Правильно ли это? Или грамотнее завести еще один массив переменных "bool Prev_Relay_flag[8]", сравнивать текущее значение флага с предыдущим и, если изменилось - тыкать пин?

правильней будет изменять аппаратное состояние пина реле в том же месте кода, где изменилось значение элемента массива.


boolean Relay_flag[8];

#define PIN_RELAY_01 22
#define PIN_RELAY_02 23
#define PIN_RELAY_03 24
#define PIN_RELAY_04 25

void setup(){ // здесь не какой-то код, а инициализация пинов RELAY как выходов.
pinMode(PIN_RELAY_01, OUTPUT);
pinMode(PIN_RELAY_02, OUTPUT);
pinMode(PIN_RELAY_03, OUTPUT);
pinMode(PIN_RELAY_04, OUTPUT);

}

void loop() {
if (нажата кнопка 1)               {Relay_flag[0] = !Relay_flag[0]; digitalWrite(PIN_RELAY_01, Relay_flag[0]);}
if (нажата кнопка 2)               {Relay_flag[1] = !Relay_flag[1]; digitalWrite(PIN_RELAY_02, Relay_flag[1]);}
if (с блютуса прилетела команда 3) {Relay_flag[2] = !Relay_flag[2]; digitalWrite(PIN_RELAY_03, Relay_flag[2]);}
if (на экране нажата кнопка 4)     {Relay_flag[3] = !Relay_flag[3]; digitalWrite(PIN_RELAY_04, Relay_flag[3]);}
}

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

xDriver пишет:

if (нажата кнопка 1)               digitalWrite (PIN_RELAY_01, Relay_flag[0] = !Relay_flag[0]);

Хотел так написать, но подумал у ТС мозг вскипит.

ок. раз пошла такая пьянка:


// boolean Relay_flag[8];

#define PIN_RELAY_01 22
#define PIN_RELAY_02 23
#define PIN_RELAY_03 24
#define PIN_RELAY_04 25

void setup(){ // здесь не какой-то код, а инициализация пинов RELAY как выходов.
pinMode(PIN_RELAY_01, OUTPUT);
pinMode(PIN_RELAY_02, OUTPUT);
pinMode(PIN_RELAY_03, OUTPUT);
pinMode(PIN_RELAY_04, OUTPUT);

}

void loop() {
if (нажата кнопка 1)               {digitalWrite(PIN_RELAY_01, !digitalRead(PIN_RELAY_01));}
if (нажата кнопка 2)               {digitalWrite(PIN_RELAY_02, !digitalRead(PIN_RELAY_02));}
if (с блютуса прилетела команда 3) {digitalWrite(PIN_RELAY_03, !digitalRead(PIN_RELAY_03));}
if (на экране нажата кнопка 4)     {digitalWrite(PIN_RELAY_04, !digitalRead(PIN_RELAY_04));}
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

xDriver пишет:

Хотел так написать, но подумал у ТС мозг вскипит.

Пусть кипит. Все должно быть по-взрослому, а так никогда не научатся программировать. Короткая запись в Си затавляет мозгу шевелить, кроме тех случаев, когда там сплошная кость. Да и глаз привыкает к таким конструкциям.

Kest430
Offline
Зарегистрирован: 21.06.2016

Спасибо всем за комменты и за идею.

Текущую конструкцию подглядел у кого-то в скетче и использовал. Скорее всего я бы допер до этого решения и сам, раз решил оптимизировать код и задал вопрос (сначала сам себе, а потом уже и тут). 

 

Спасибо еще раз.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Клапауций 112 пишет:

xDriver пишет:

if (нажата кнопка 1)               digitalWrite (PIN_RELAY_01, Relay_flag[0] = !Relay_flag[0]);

Хотел так написать, но подумал у ТС мозг вскипит.

ок. раз пошла такая пьянка:


// boolean Relay_flag[8];

#define PIN_RELAY_01 22
#define PIN_RELAY_02 23
#define PIN_RELAY_03 24
#define PIN_RELAY_04 25

void setup(){ // здесь не какой-то код, а инициализация пинов RELAY как выходов.
pinMode(PIN_RELAY_01, OUTPUT);
pinMode(PIN_RELAY_02, OUTPUT);
pinMode(PIN_RELAY_03, OUTPUT);
pinMode(PIN_RELAY_04, OUTPUT);

}

void loop() {
if (нажата кнопка 1)               {digitalWrite(PIN_RELAY_01, !digitalRead(PIN_RELAY_01));}
if (нажата кнопка 2)               {digitalWrite(PIN_RELAY_02, !digitalRead(PIN_RELAY_02));}
if (с блютуса прилетела команда 3) {digitalWrite(PIN_RELAY_03, !digitalRead(PIN_RELAY_03));}
if (на экране нажата кнопка 4)     {digitalWrite(PIN_RELAY_04, !digitalRead(PIN_RELAY_04));}
}

 

продолжаем "бухать" :)

void setup(){ // инициализация пинов RELAY как выходов.
	DDRA |= B00001111;
}

void loop() {
	if (нажата кнопка 1)                  PORTA ^= 1;
	if (нажата кнопка 2)                  PORTA ^= 2;
	if (с блютуса прилетела команда 3)    PORTA ^= 4;
	if (на экране нажата кнопка 4)        PORTA ^= 8;
}

после этого ТС точно научится программировать !

Kest430
Offline
Зарегистрирован: 21.06.2016

а если этих реле 28 штук?

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Kest430 пишет:

а если этих реле 28 штук?

И что должно поменяться ?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Kest430 пишет:

а если этих реле 28 штук?

это неспортивно! - количество реле должно быть равно 8-ми.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

xDriver пишет:

после этого ТС точно научится программировать !

Поменьшей мере "прозреет". А то будет думать , что кипяченое молоко это разбавленая манная каша, и будет там комочки искать. А так сразу будет ответ на вопрос, как сократить размеры скетча. Второй по популярности вопрос.

ПС: Первый популярный вопрос это танцы вокруг millis() , а точнее у меня очень много delay()  и скечь не совсем работает.

Kest430
Offline
Зарегистрирован: 21.06.2016

не, от delay() я избавился на первом же этапе

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Kest430 пишет:
а если этих реле 28 штук?

SPI

Kest430
Offline
Зарегистрирован: 21.06.2016

xDriver пишет:

продолжаем "бухать" :)

void setup(){ // инициализация пинов RELAY как выходов.
	DDRA |= B00001111;
}

void loop() {
	if (нажата кнопка 1)                  PORTA ^= 1;
	if (нажата кнопка 2)                  PORTA ^= 2;
	if (с блютуса прилетела команда 3)    PORTA ^= 4;
	if (на экране нажата кнопка 4)        PORTA ^= 8;
}

после этого ТС точно научится программировать !

 

А вот спасибо!! Реально, СПАСИБО!

Вернулся с командировки, разобрался, переделал скетч, съэкономил память заменив все digitalWrite и pinMode

negavoid
Offline
Зарегистрирован: 09.07.2016

Kest430 пишет:

переделал скетч, съэкономил память заменив все digitalWrite и pinMode

, заменил arduino uno на какой-нибудь due или wemos, упс, перестало работать :)

Kest430
Offline
Зарегистрирован: 21.06.2016

negavoid пишет:
заменил arduino uno на какой-нибудь due или wemos, упс, перестало работать :)

Ну если не вынимать голову из задницы, то да, перестанет работать.