Помогите пожалуйста разобраться
- Войдите на сайт для отправки комментариев
Ср, 08/03/2017 - 01:01
Всем доброй ночи. Сегодня приобрел 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-й диод мигать не должен (а он мигает).
Заранее благодарен.
сначала правильно вставь отформатированный код
кто включает вообще то светодиод, такой команды нет.
Извиняюсь, что значит правильно вставить код? Первый раз у вас на форуме, невкурсе как вставлять. Т.е. я правильно понял, что нельзя мой замысел что это сделать невозможно? Я думал что условие смотрит есть ли на 1-м пине сигнал, раз его нет, то условие не выполняется. Так нельзя что ли?
Извиняюсь, что значит правильно вставить код? Первый раз у вас на форуме, невкурсе как вставлять.
На любом форуме принято сначала читать, а потом уж писать. Вот здесь написано как вставлять код - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
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. Что Вы хотели сказать строкой 13?
2. Отдельный вопрос - что в той же строке делает точка с запятой?
хотел сказать, что если переменная ledWrite находится в положении HIGH, т.е. диод горит, то переменная ledRed должна мигать. Точку с запятой убрал, ничего не изменилось.
Переменная не девка - она не может находиться в положении.
Переменная ledWrite в строке 1 получила значение 1. И больше нигде в программе она не изменяется. Значит она всегда будет равна 1 и никогда не станет равной ничему другому.
Как-то странно получается. Насколько я понял, переменные, в отличии от констант могут принимать разные значения. К примеру была 1, прибавили к ней еще 1 (число) стала 2 отняли 2 стала нулем и т.д. Тоже самое вроде как говорит команда
digitalWrite (ledRed, LOW/HIGH); Т.е. был на пине сигнал, нет на пине сигнала.Подскажите тогда пожалуйста какой командой мне организовать мою задумку?Попробуйте так
digitalWrite (ledRed, LOW/HIGH);это Lisp?
Попробуйте так
Спасибо милый человек. Все заработало. Как-то не додумался, что нужно с диода считать в каком он состоянии.
Lisp - это язык программирования? Тогда нет, вроде как Си. Хотя этот вопрос явно не ко мне, я 1-й день тут :)
смысл было говорить огород если он у вас всех выключен и нигде не включается.
ну даже если он и чудестным образом вдруг включится ваша ардуина это никогда не узнает ибо в лупе (цикле) у вас не проверяется никак.
Как-то странно получается. Насколько я понял, переменные, в отличии от констант могут принимать разные значения. К примеру была 1, прибавили к ней еще 1 (число) стала 2 отняли 2 стала нулем и т.д. Т
А Вы хоть что-нибудь из этого сделали? Приавили 1, отняли 2? Нет! Вы как присвоили 1 в первой строке, так больше её и не меняли. ну, и с чего она поменяется-то?
digitalWrite (ledRed, LOW/HIGH); Т.е. был на пине сигнал, нет на пине сигнала.Эта функция устанавливает состояние пина. Но никаких перемнных она не меняет.
Если Вам нужно прочитать состояние пина и сохранить его в переменной, то Вам нужны функция digitalRead
И кстати, Вы мой вопрос про ":" проигнорировали, а там тоже засада.
и более того вайт это вайт. а переменная у вас цифрвоая и вроде как номер ноги.
а проверяет что она должна быть при этом состоянием той же ноги.
01intledWhite=1; - говорю что белый диод подключил к 1 пину02intledRed=2; - красный диод ко 2-му пину0304voidsetup()0506{07pinMode (ledWhite, OUTPUT); - что 1 пин это выход08pinMode (ledRed, OUTPUT); - что 2-й пин это выход09digitalWrite (ledWhite, LOW); - хочу сказать что 1-й пин отключен10}11voidloop()12{13if(digitalRead(ledWhite) == HIGH); - написал условие, если 1-й пин включен (горит диод), то второй должен мигать.14{15digitalWrite (ledRed, HIGH);16delay (1000);17digitalWrite (ledRed, LOW);18delay (1000);19}20}Попробуйте так
Блин, он же именно так и скопировал! И поскольку у него пин первый - у него всё заработало!
Vosara, если это не случайная описка, а умышленно - это жестокая шутка, Вы не находите? Парень-то вроде адекватный, зачем его так.
Описка?
Вы много хотите от человека не знакомого с программированием вообще и первый раз видевший ардуино. У меня не стояла цель автоматизировать настолько, чтобы она еще сама бы проверяла, горит там диод или нет. Его состояние, я хотел указать ручками в строке digitalWrite (ledWrite, LOW/HIGH) и уже от значения в этой стоке, я хотел чтобы выполнялось действие.
А Вы хоть что-нибудь из этого сделали? Приавили 1, отняли 2? Нет! Вы как присвоили 1 в первой строке, так больше её и не меняли. ну, и с чего она поменяется-то?
Я думал, что раз диод не горит, значит сигнала на диод нет, раз сигнала на диод нет, значит ledWrite, LOW. Условие я написал, if (digitalWrite ledWrite == HIGH), т.е. вкл, то выполняется действие. Но выше я явно указал, что ledWrite, LOW, а он всеравно мигал.
Если Вам нужно прочитать состояние пина и сохранить его в переменной, то Вам нужны функция digitalReadСпс за разъяснение. Думал digitalRead нужно для считывания данных приходящих на пин. К примеру показаний датчика. А тут я думал, что раз сигнал на пин не подается, значит котроллер сам знает, что состояние пина выключено. Получается, что нет?
И кстати, Вы мой вопрос про ":" проигнорировали, а там тоже засада.
котроллер сам знает, что состояние пина выключено. Получается, что нет?
Ему пофиг. И Вашу переменную он менять точно не будет, даже если чего-то и знает.
Серёнька, исправте пожалуста ledWrite на ledWhite везде где он встречается в теле программы, а то глаз режет, думаю, не только людям, а когда-нибудь и компилятору тоже ))))
"int ledWrite=1; - говорю что белый диод подключил к 1 пину" - сами так себя запутаете. Ничего никуда Вы не подключили в этой строке. Вы просто переменной ledWhite присвоили значение еденица.
Это - тоже не совсем верно: if (ledWrite == HIGH) Вы забыли что ledWrite - это целочисленная переменная (integer) и она не может принимать состояние HIGH или LOW. Это может только пин на ардуине. Вот как Вам подсказали: if (digitalRead(ledWhite) == HIGH) так - правильно.
А вообще-то: "верной дорогой идёте, товарищи". Почитайте вот тут: Как для начала, так вполне хватит. Я так и делал год назад )))
Серёнька, исправте пожалуста ledWrite на ledWhite везде где он встречается в теле программы, а то глаз режет, думаю, не только людям, а когда-нибудь и компилятору тоже ))))
"int ledWrite=1; - говорю что белый диод подключил к 1 пину" - сами так себя запутаете. Ничего никуда Вы не подключили в этой строке. Вы просто переменной ledWhite присвоили значение еденица.
Это - тоже не совсем верно: if (ledWrite == HIGH) Вы забыли что ledWrite - это целочисленная переменная (integer) и она не может принимать состояние HIGH или LOW. Это может только пин на ардуине. Вот как Вам подсказали: if (digitalRead(ledWhite) == HIGH) так - правильно.
А вообще-то: "верной дорогой идёте, товарищи". Почитайте вот тут: Как для начала, так вполне хватит. Я так и делал год назад )))
Сори, опечатался. Конечно же ledWhite.
Спасибо, про то, что я переменной присвоил просто число, уже разобрался. В приведенном ниже примере, чтобы не путаться вообще убрал. К сожалению, в учебниках во всех (видимо с одного источника скопированы) говорится: int название переменной = 1; // номер контакта. Отсюда и я полагал, что это не цифра, а номер пина.
П.С. приведенный справочник, 2-й день активно юзаю. :)
Извиняюсь, что надоедаю, но немогли бы еще раз подсказать. Решил модернизировать свое творение и сделать следующее: 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() { }Как исправить, не подскажете?
Как бы это не страно звучит, но поменять программиста.
Нельзя так писать? Может подскажете какой командой, а я сам попытаюсь дальше..
Нельзя так писать? Может подскажете какой командой, а я сам попытаюсь дальше..
Ну тогда вам надо в эту сторону Полный скетч здесь 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); }serenka,
1. Вы крайне неудачно выбрали номера пинов. Пины с номерами 0 и 1 используются для связи с компьютером: заливка скетча, отладка через консоль и пр. Поэтому использовать эти пины в своих целях крайне нежелательно.
2. Судя пао Вашим сообщениям, Вы путаете два понятия: "номер пина" и "состояние пина". Номер пина (для Arduino Uno) может принимать значения от 0 до 19 - это номер того контакта, с коротым мы работаем. Состояние пина - это какое напряжение он выдает на выходе - 0 В или 5В. Любой из двадцати пинов может находиться в любом из двух состояний (не считая того, что каждый из пинов может быть настроен на вход, а не на выход).
3. Вы неправильно подходите к организации кода. Функция setup() служит для первоначальной настройки. В Вашем случае это pinMode(). Ничего другого в нее помещать не нужно. А вся работа помещается в loop() и эта loop() уже сама организует цикл.
4. По вашему коду: код работает в точности итак, как написан. Просто пройдитесь с карандашом последовательно по всем операторам на протяжении первых 10 проходов цикла, и Вы поймете, что именно делает Ваш цикл. И тогда у Вас самого появятся идеи, как его "исправить".
PS. Buzzer2010, конечно, отзывчивый, но неопытный, ему не всегда можно верить. В частности, в языке Си нет различия между целыми и логическими переменными, что, кстати, затрудняет отладку программ, т.к. компилятор не может выявить некоторые логические ошибки, легко детектируемые в языках, где такое различие присутствует.
Спасибо за разъяснения. Хотел уточнть. Если я помещу весь свой код в void loop(), то он будет же выполняться бесконечно. А мне нужно чтобы всего 1 раз. Т.е. промигал 20 раз и больше не мигает. 4. Написал на бумажке как Вы сказали. Теперь понятно почему так происходит. Получается на 5 мигании происходит: включение белого диода, пауза, выключение белого диода, пауза, включение красного диода, пауза, выключение. В теории понятно, а как на практике сделать, укажите пжл.
Ну так и делайте
1. ВключениеБелого (всегда)
2. if (<надо включать красный>) ВключениеКрасного
3. Пауза (одна на оба. В это время кому надо - светится)
4. ВыключениеБелого
5. ВыключениеКрасного (даже если не был включён)
6. Пауза (в это время никто не светится)
Разумеете вместо <надо включать красный> ставите нормальное условие, оно у Вас уже есть.
Ну так и делайте
1. ВключениеБелого (всегда)
2. if (<надо включать красный>) ВключениеКрасного
3. Пауза (одна на оба. В это время кому надо - светится)
4. ВыключениеБелого
5. ВыключениеКрасного (даже если не был включён)
6. Пауза (в это время никто не светится)
Разумеете вместо <надо включать красный> ставите нормальное условие, оно у Вас уже есть.
Спасибо. Переправил, все работает. Последний вопрос. Человек Выше написал, что в void setup() писать нельзя, все нужно в void loop(). Как ходить из ситуации когда нужно 1 раз прокрутить? К примеру, вдруг мне в проекте, как сейчас потребуется после включения адруино мигнуть диодом всего 1 раз.
Ну и мигайте себе в сетапе или где Вам удобно. Тут понятия "нельзя" относительное - можно всё, если с умом, если понимаешь что и зачем делаешь и т.п.
Последний вопрос. Человек Выше написал, что в void setup() писать нельзя, все нужно в void loop().
Не "нельзя", а "не предназначено". Никто не обязывает использовать что-то обязательно по назначению.
Тут, правда, складывается некий парадокс. Реальное устройство практически всегда должно работать до выключения питания, а не "одни раз". Зато в демонстрационных примерах "один раз" - достаточно обыденное явление. Поэтому зачастую такие примеры "учат неправильно". Хотя и в реальности цикл loop() может быть пустым, например, когда вся полезная работа делается в прерываниях.
В общем, есть общие рекомендации, а есть конкретные случаи, которые не всегда следуют рекомендациям.
Как ходить из ситуации когда нужно 1 раз прокрутить? К примеру, вдруг мне в проекте, как сейчас потребуется после включения адруино мигнуть диодом всего 1 раз.
Два основных варианта:
1. Остановить цикл loop() при помощи while(1);
2. Совершать полезные действия только по условию. Когда условие не выполнено, цикл loop() работает как пустой.
Ну и третий - как сделали Вы - в setup().
вы че все кипятите то ась?!! там все было написано аж еще в 16 сообщении