Помогите пожалуйста разобраться

serenka
Offline
Зарегистрирован: 08.03.2017

Всем доброй ночи. Сегодня приобрел arduino, несколько диодиков, хотел поэксперементировать (в программировании полный 0). Почитал умные статьи, побаловался в скетчем Blink, Хочу его модернизировать. А имменно сделать следующее: Если 1-й диод горит (ledWrite), то 2-й (ledRed) должен мигать. Написал скетч

int ledWrite=1; - говорю что белый диод подключил к 1 пину
int ledRed=2; - красный диод ко 2-му пину
 
void setup ()
 
{
  pinMode (ledWrite, OUTPUT); - что 1 пин это выход
  pinMode (ledRed, OUTPUT); - что 2-й пин это выход
  digitalWrite (ledWrite, LOW); - хочу сказать что 1-й пин отключен
 }
 void loop ()
 {
  if (ledWrite == HIGH); - написал условие, если 1-й пин включен (горит диод), то второй должен мигать.
   {
    digitalWrite (ledRed, HIGH);
    delay (1000);
    digitalWrite (ledRed, LOW);
    delay (1000);
   }
 }
 
С таким скетчем 1-й пинг не горит, второй мигает. Помогите пожалуйста разобраться, где я не правильно написал? Ведь прямо указал, что 1-й диод не светится (он и не светится). А раз он не светится, то 2-й диод мигать не должен (а он мигает).
Заранее благодарен.
vvadim
Offline
Зарегистрирован: 23.05.2012

сначала правильно вставь отформатированный код

кто включает вообще то светодиод, такой команды нет.

 

serenka
Offline
Зарегистрирован: 08.03.2017

Извиняюсь, что значит правильно вставить код? Первый раз у вас на форуме, невкурсе как вставлять. Т.е. я правильно понял, что нельзя мой замысел что это сделать невозможно? Я думал что условие смотрит есть ли на 1-м пине сигнал, раз его нет, то условие не выполняется. Так нельзя что ли?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

serenka пишет:

Извиняюсь, что значит правильно вставить код? Первый раз у вас на форуме, невкурсе как вставлять. 

На любом форуме принято сначала читать, а потом уж писать. Вот здесь написано как вставлять код - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

serenka
Offline
Зарегистрирован: 08.03.2017
int ledWrite=1; - говорю что белый диод подключил к 1 пину
int ledRed=2; - красный диод ко 2-му пину
 
void setup ()
 
{
  pinMode (ledWrite, OUTPUT); - что 1 пин это выход
  pinMode (ledRed, OUTPUT); - что 2-й пин это выход
  digitalWrite (ledWrite, LOW); - хочу сказать что 1-й пин отключен
 }
 void loop ()
 {
  if (ledWrite == HIGH); - написал условие, если 1-й пин включен (горит диод), то второй должен мигать.
   {
    digitalWrite (ledRed, HIGH);
    delay (1000);
    digitalWrite (ledRed, LOW);
    delay (1000);
   }
 }

 

serenka
Offline
Зарегистрирован: 08.03.2017

Глубоко извиняюсь. Буду знать, исправил. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Есть два вопроса

1. Что Вы хотели сказать строкой 13?

2. Отдельный вопрос - что в той же строке делает точка с запятой?

serenka
Offline
Зарегистрирован: 08.03.2017

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Переменная не девка - она не может находиться в положении.

Переменная ledWrite в строке 1 получила значение 1. И больше нигде в программе она не изменяется. Значит она всегда будет равна  1 и никогда не станет равной ничему другому.

serenka
Offline
Зарегистрирован: 08.03.2017

Как-то странно получается. Насколько я понял, переменные, в отличии от констант могут принимать разные значения. К примеру была 1, прибавили к ней еще 1 (число) стала 2 отняли 2 стала нулем и т.д. Тоже самое вроде как говорит команда  digitalWrite (ledRed, LOW/HIGH); Т.е. был на пине сигнал, нет на пине сигнала. 

Подскажите тогда пожалуйста какой командой мне организовать мою задумку?

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Попробуйте так

if (digitalRead(ledWrite == HIGH))

 

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

serenka пишет:

digitalWrite (ledRed, LOW/HIGH);

это Lisp?

serenka
Offline
Зарегистрирован: 08.03.2017

vosara пишет:

Попробуйте так

if (digitalRead(ledWrite == HIGH))

 

 

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

serenka
Offline
Зарегистрирован: 08.03.2017

Lisp - это язык программирования? Тогда нет, вроде как Си. Хотя этот вопрос явно не ко мне, я 1-й день тут :)

arDubino
Offline
Зарегистрирован: 12.01.2017

смысл было говорить огород если он у вас всех выключен и нигде не включается. 

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

serenka пишет:

Как-то странно получается. Насколько я понял, переменные, в отличии от констант могут принимать разные значения. К примеру была 1, прибавили к ней еще 1 (число) стала 2 отняли 2 стала нулем и т.д. Т

А Вы хоть что-нибудь из этого сделали? Приавили 1, отняли 2? Нет! Вы как присвоили 1 в первой строке, так больше её и не меняли. ну, и с чего она поменяется-то?

serenka пишет:

digitalWrite (ledRed, LOW/HIGH); Т.е. был на пине сигнал, нет на пине сигнала. 

Эта функция устанавливает состояние пина. Но никаких перемнных она не меняет.

Если Вам нужно прочитать состояние пина и сохранить его в переменной, то Вам нужны функция digitalRead

И кстати, Вы мой вопрос про ":" проигнорировали, а там тоже засада.

 

 

arDubino
Offline
Зарегистрирован: 12.01.2017

и более того вайт это вайт. а переменная у вас цифрвоая и вроде как номер ноги.

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

 

01 int ledWhite=1; - говорю что белый диод подключил к 1 пину
02 int ledRed=2; - красный диод ко 2-му пину
03  
04 void setup ()
05  
06 {
07   pinMode (ledWhite, OUTPUT); - что 1 пин это выход
08   pinMode (ledRed, OUTPUT); - что 2-й пин это выход
09   digitalWrite (ledWhite, LOW); - хочу сказать что 1-й пин отключен
10  }
11  void loop ()
12  
13   if (digitalRead(ledWhite) == HIGH); - написал условие, если 1-й пин включен (горит диод), то второй должен мигать.
14    {
15     digitalWrite (ledRed, HIGH);
16     delay (1000);
17     digitalWrite (ledRed, LOW);
18     delay (1000);
19    }
20  }

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

vosara пишет:

Попробуйте так

if (digitalRead(ledWrite == HIGH))

Блин, он же именно так и скопировал! И поскольку у него пин первый - у него всё заработало!

Vosara, если это не случайная описка, а умышленно - это жестокая шутка, Вы не находите? Парень-то вроде адекватный, зачем его так.

Описка?

serenka
Offline
Зарегистрирован: 08.03.2017

Вы много хотите от человека не знакомого с программированием вообще и первый раз видевший ардуино. У меня не стояла цель автоматизировать настолько, чтобы она еще сама бы проверяла, горит там диод или нет. Его состояние, я хотел указать ручками в строке digitalWrite (ledWrite, LOW/HIGH) и уже от значения в этой стоке, я хотел чтобы выполнялось действие.

serenka
Offline
Зарегистрирован: 08.03.2017

ЕвгенийП пишет:

А Вы хоть что-нибудь из этого сделали? Приавили 1, отняли 2? Нет! Вы как присвоили 1 в первой строке, так больше её и не меняли. ну, и с чего она поменяется-то?

Я думал, что раз диод не горит, значит сигнала на диод нет, раз сигнала на диод нет, значит ledWrite, LOW. Условие я написал, if (digitalWrite ledWrite == HIGH), т.е. вкл, то выполняется действие. Но выше я явно указал, что ledWrite, LOW, а он всеравно мигал. 

ЕвгенийП пишет:

Если Вам нужно прочитать состояние пина и сохранить его в переменной, то Вам нужны функция digitalRead 

Спс за разъяснение. Думал digitalRead нужно для считывания данных приходящих на пин. К примеру показаний датчика. А тут я думал, что раз сигнал на пин не подается, значит котроллер сам знает, что состояние пина выключено. Получается, что нет?

ЕвгенийП пишет:

И кстати, Вы мой вопрос про ":" проигнорировали, а там тоже засада.

Старался ответить на все Ваши вопросы. : - это Вы про ;? опечатка была, при компилировании не ругнулся, я и не заметил. Потом написал, что удалил.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

serenka пишет:

котроллер сам знает, что состояние пина выключено. Получается, что нет?

Ему пофиг. И Вашу переменную он менять точно не будет, даже если чего-то и знает.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Серёнька, исправте пожалуста ledWrite на ledWhite везде где он встречается в теле программы, а то глаз режет, думаю, не только людям, а когда-нибудь и компилятору тоже ))))

"int ledWrite=1; - говорю что белый диод подключил к 1 пину" - сами так себя запутаете. Ничего никуда Вы не подключили в этой строке. Вы просто переменной ledWhite присвоили значение еденица.

Это - тоже не совсем верно: if (ledWrite == HIGH) Вы забыли что ledWrite - это целочисленная переменная (integer) и она не может принимать состояние HIGH или LOW. Это может только пин на ардуине. Вот как Вам подсказали: if (digitalRead(ledWhite) == HIGH)  так - правильно.

А вообще-то: "верной дорогой идёте, товарищи". Почитайте вот тут: Как для начала, так вполне хватит. Я так и делал год назад )))

serenka
Offline
Зарегистрирован: 08.03.2017

Buzzer2010 пишет:

Серёнька, исправте пожалуста ledWrite на ledWhite везде где он встречается в теле программы, а то глаз режет, думаю, не только людям, а когда-нибудь и компилятору тоже ))))

"int ledWrite=1; - говорю что белый диод подключил к 1 пину" - сами так себя запутаете. Ничего никуда Вы не подключили в этой строке. Вы просто переменной ledWhite присвоили значение еденица.

Это - тоже не совсем верно: if (ledWrite == HIGH) Вы забыли что ledWrite - это целочисленная переменная (integer) и она не может принимать состояние HIGH или LOW. Это может только пин на ардуине. Вот как Вам подсказали: if (digitalRead(ledWhite) == HIGH)  так - правильно.

А вообще-то: "верной дорогой идёте, товарищи". Почитайте вот тут: Как для начала, так вполне хватит. Я так и делал год назад )))

Сори, опечатался. Конечно же ledWhite.

Спасибо, про то, что я переменной присвоил просто число, уже разобрался. В приведенном ниже примере, чтобы не путаться вообще убрал. К сожалению, в учебниках во всех (видимо с одного источника скопированы) говорится: int название переменной = 1; // номер контакта. Отсюда и я полагал, что это не цифра, а номер пина.

 П.С. приведенный справочник, 2-й день активно юзаю. :)

serenka
Offline
Зарегистрирован: 08.03.2017

Извиняюсь, что надоедаю, но немогли бы еще раз подсказать. Решил модернизировать свое творение и сделать следующее: 1-й диод (белый) мигает 20 раз, после того как он мигнет 5 раз, хочу чтобы начал мигать параллельно 2-й диод (красный).Написал скетч. Все вроде работает, с 1 проблемой. с 5 мигания до 10 мигания белого, они мигают не одновременно, а по очереди. Как исправить, не подскажете?


void setup() {
pinMode (1, OUTPUT);
pinMode (2, OUTPUT);

for (int blinks=0; blinks<=20; blinks++)
{
  digitalWrite (1, HIGH);
  delay (1000);
  digitalWrite (1, LOW);
  delay (1000); 
  if (blinks>= 5 && blinks <= 10){
      digitalWrite (2, HIGH);
      delay (1000);
      digitalWrite (2, LOW);
      delay (1000); }
}


}

void loop() {

}

 

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

serenka пишет:

 Как исправить, не подскажете?

Как бы это не страно звучит, но поменять программиста.

serenka
Offline
Зарегистрирован: 08.03.2017

Нельзя так писать? Может подскажете какой командой, а я сам попытаюсь дальше..

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

serenka пишет:

Нельзя так писать? Может подскажете какой командой, а я сам попытаюсь дальше..

Ну тогда вам надо в эту сторону Полный скетч здесь https://yadi.sk/d/U_gtAoSN3AtYSM

Главный файл сюда.

/* class_Led.ino 
  #1 светодиод ->13
  #2 кнопка 1 -> 2 вкл светодиод
  #3 кнопка 2 -> 3 светодиод мигает
  #4 кнопка 3 -> 4 выкл светодиод
*/
// #1 светодиод
#include "Cl_led.h"
const byte led1_pin = 13;
Cl_led Led1; // создать
// #2 кнопка
#include "Cl_do_btn.h"
const byte btn1_pin = 2;
Cl_do_btn Do_btm1; // создать
void func_1() {
  Led1.ON();
}
// #3 кнопка
const byte btn2_pin = 3;
Cl_do_btn Do_btm2; // создать
void func_2() {
  Led1.OFF();
}
// #4 кнопка
const byte btn3_pin = 4;
Cl_do_btn Do_btm3; // создать
void func_3() {
  Led1.blink();
}
void setup() {
  //#1 светодиод
  Led1.T_blink = 500;
  Led1.logic = 1;
  Led1.setup(led1_pin);
  //#2 кнопка 1
  Do_btm1.setup(btn1_pin);
  //#3 кнопка 2
  Do_btm2.setup(btn2_pin);
  //#4 кнопка 3
  Do_btm3.setup(btn3_pin);
}

void loop() {
  // #1 светодиод
  Led1.loop();
  // #2 кнопка 1
  Do_btm1.loop(& func_1);
  // #3 кнопка 2
  Do_btm2.loop(& func_2);
  // #4 кнопка 3
  Do_btm3.loop(& func_3);
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

serenka

1. Вы крайне неудачно выбрали номера пинов. Пины с номерами 0 и 1 используются для связи с компьютером: заливка скетча, отладка через консоль и пр. Поэтому использовать эти пины в своих целях крайне нежелательно.

2. Судя пао Вашим сообщениям, Вы путаете два понятия: "номер пина" и "состояние пина". Номер пина (для Arduino Uno) может принимать значения от 0 до 19 - это номер того контакта, с коротым мы работаем. Состояние пина - это какое напряжение он выдает на выходе - 0 В или 5В. Любой из двадцати пинов может находиться в любом из двух состояний (не считая того, что каждый из пинов может быть настроен на вход, а не на выход).

3. Вы неправильно подходите к организации кода. Функция setup() служит для первоначальной настройки. В Вашем случае это pinMode(). Ничего другого в нее помещать не нужно. А вся работа помещается в loop() и эта loop() уже сама организует цикл.

4. По вашему коду: код работает в точности итак, как написан. Просто пройдитесь с карандашом последовательно по всем операторам на протяжении первых 10 проходов цикла, и Вы поймете, что именно делает Ваш цикл. И тогда у Вас самого появятся идеи, как его "исправить".

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

serenka
Offline
Зарегистрирован: 08.03.2017

Спасибо за разъяснения. Хотел уточнть. Если я помещу весь свой код в void loop(), то он будет же выполняться бесконечно. А мне нужно чтобы всего 1 раз. Т.е. промигал 20 раз и больше не мигает. 4. Написал на бумажке как Вы сказали. Теперь понятно почему так происходит. Получается на 5 мигании происходит: включение белого диода, пауза, выключение белого диода, пауза, включение красного диода, пауза, выключение. В теории понятно, а как на практике сделать, укажите пжл. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну так и делайте

1. ВключениеБелого (всегда)

2. if (<надо включать красный>) ВключениеКрасного

3. Пауза (одна на оба. В это время кому надо - светится)

4. ВыключениеБелого

5. ВыключениеКрасного (даже если не был включён)

6. Пауза (в это время никто не светится)

Разумеете вместо <надо включать красный> ставите нормальное условие, оно у Вас уже есть.

serenka
Offline
Зарегистрирован: 08.03.2017

ЕвгенийП пишет:

Ну так и делайте

1. ВключениеБелого (всегда)

2. if (<надо включать красный>) ВключениеКрасного

3. Пауза (одна на оба. В это время кому надо - светится)

4. ВыключениеБелого

5. ВыключениеКрасного (даже если не был включён)

6. Пауза (в это время никто не светится)

Разумеете вместо <надо включать красный> ставите нормальное условие, оно у Вас уже есть.

Спасибо. Переправил, все работает. Последний вопрос. Человек Выше написал, что в void setup() писать нельзя, все нужно в void loop(). Как ходить из ситуации когда нужно 1 раз прокрутить? К примеру, вдруг мне в проекте, как сейчас потребуется после включения адруино мигнуть диодом всего 1 раз.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну и мигайте себе в сетапе или где Вам удобно. Тут понятия "нельзя" относительное - можно всё, если с умом, если понимаешь что и зачем делаешь и т.п.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

serenka пишет:

Последний вопрос. Человек Выше написал, что в void setup() писать нельзя, все нужно в void loop().

Не "нельзя", а "не предназначено". Никто не обязывает использовать что-то обязательно по назначению. 

Тут, правда, складывается некий парадокс. Реальное устройство практически всегда должно работать до выключения питания, а не "одни раз". Зато в демонстрационных примерах "один раз" - достаточно обыденное явление. Поэтому зачастую такие примеры "учат неправильно". Хотя и в реальности цикл loop() может быть пустым, например, когда вся полезная работа делается в прерываниях.

В общем, есть общие рекомендации, а есть конкретные случаи, которые не всегда следуют рекомендациям.

Цитата:

Как ходить из ситуации когда нужно 1 раз прокрутить? К примеру, вдруг мне в проекте, как сейчас потребуется после включения адруино мигнуть диодом всего 1 раз.

Два основных варианта:

1. Остановить цикл loop() при помощи while(1);

2. Совершать полезные действия только по условию. Когда условие не выполнено, цикл loop() работает как пустой.

Ну и третий - как сделали Вы - в setup().

arDubino
Offline
Зарегистрирован: 12.01.2017

вы че все кипятите то ась?!! там все было написано аж еще в 16 сообщении