Уважаемые форумчане, помогите пожалуйста. Пишу программу на Lazarus. Хочу с компьютера управлять реле. Посмотрите пожалуйста в код Lazarus, может я чето неправильно ввел Код (Text): procedure TForm1.CheckBox1Click(Sender: TObject); begin case CheckBox1.State of cbChecked: SdpoSerial1.WriteData('rele1H'+'.'); cbUnchecked: SdpoSerial1.WriteData('rele1L'+'.'); end; end; Это одна из TCheckBox. Мне нужно, что-бы пока значение флажка было cbChecked(тоесть флажок активен), на реле подавался минус, т.е. сигнал LOW., а пока значение флажка cbUnchecked(тоесть флажка нет), на реле подавался высокий логический уровень, т.е. HIGH. Вот огрызок кода, который я настряпал в арде: Код (Text): while (Serial.available() > 0) { //если есть доступные данные char inChar = Serial.read(); //считываем байт brightness += inChar; //собираем информацию в строку delay(1); //Реле 1 вкл/выкл if (inChar == '.' && brightness == "rele1H.") { digitalWrite(relepin1, LOW); brightness = "";//обнуляем переменную } else { digitalWrite(relepin1, HIGH); brightness = "";//обнуляем переменную } Посмотрите пожалуйста, может гдето касанул.
analogWrite "выдаст" PWM сигнал, если пин поддерживает PWM, а Вам нужно изменять состояние пина. Для этого нужно использовать: Код (Text): digitalWrite(relepin1, LOW); Касаемо вопроса, что значит '3 реле'? Понимать, что используется реле в количестве трёх штук, или имелся ввиду третий пин реле? Если второе тогда нужно указать тип реле, а если первое, то вопрос не ясен.
Имеется блок из 4 реле от Arduino. Я использую 3 реле из 4. А зачем мне шим? Прошу заметить, что если к этим же пинам написать скетч управления кнопками или просто цыкл вкл/выкл - то все превосходно работает. Мне нужно узнать правильно ли я связал Lazarus и ардуину.? Про digital я давно изменил ради эксперемента. Еще раз повторю мне нужно узнать-правильно ли я связал ардуину и Lazarus. От куда вы вообще шим взяли?
Для начала исправим некоторые неточности: Программу пишете на Object Pascal, а используете среду программирования Lazarus. Можно ли связать среду программирования Lazarus с ардуиной -- не знаю (если Lazarus поддерживает плагины, то можно такой плагин создать). В данном случае Вы пытаетесь связать программу, которую Вы создаете, с Arduino. Теперь о Ваших постах: Вы не ясно выражаете свои мысли. Если хотите получить помощь, нужно описывать проблему полностью, а не отдельные детали. Касательно данной темы, в стартовом сообщении необходимо было указать тип платы Arduino, тип шилда (так понимаю это -- http://amperka.ru/product/arduino-relay-shield), каким образом инициализируется последовательный порт (Serial) в Arduino и в Вашей программе и т.п. О последних вопросах: Я не знаю зачем Вам ШИМ, и я его ни от куда не брал. В скетче Вы используете функцию 'analogWrite' (подробнее о ней можно узнать в справке: https://www.arduino.cc/en/Reference/AnalogWrite). Далее "включаю режим телепатии" -- у Вас Arduino Uno (Iskra Neo или т.п.); Вы хотите управлять 3-им реле из Relay Shield. Все ниже сказанное из этих предположений: по-умолчанию это реле (3-е) управляется через 5 пин, который поддерживает PWM, и используя функцию analogWrite, Вы генерируете сигнал ШИМ на 5 пине. Вам нужно использовать функцию digitalWrite. Далее надо разбираться с настройками последовательного (Serial) порта. Но на сегодня я уже использовал все карточки на "включение режима телепатии", и ,если хотите помощи, то Вам следует описать процесс инициализации порта в программе и в Arduino. PS: по поводу шилда -- на практике не использовал -- все сказанное на основе информации из описания.
Да забейте вы на этот PWM. Я уже обьяснил, что analogWrite - неудачный эксперемент. Шим, как я уже говороил, мне к тролю не нужен! Про Lazarus - Я в курсе что пишу на paskale, но использую программу Lazarus. Знающие люди поймут, а не знающие на мой ответ не смогут ответить внятно.... Без обид! Но AlexU, но если вы не знаете, что на Lazarus можно писать программу для ардуины, т.к. есть библиотека для Com-порта, то вы не можете быть компитентым в данном вопросе!
Во-первых, AlexU прав в своих придирках. Точный вопрос и уважение к сообществу — это хороший тон, его нужно придерживаться. Когда человек путается в терминологии, ему не хочется помогать, потому что не понятен уровень его знаний. Кроме того, выкладывать на суд общественности непричёсанный код — плохой тон. Это говорит о том, что Вы даже не пытались его вычитывать и дебажить (по крайней мере, так это выглядит со стороны). Во-вторых, по поводу программы. Вы просите отладить программу, которую ещё не запускали? Это как-то нагло, не кажется? Если же запускали, но не заработало, то хотя бы проблему опишите, что не заработало и как. Кроме того, в скетче логическая ошибка, он никогда не выключит реле, потому что первая ветвь не исполняется никогда. Самый правильный способ исправить это — отказаться от отправки по serial порту строки с именем реле и начать отправлять только один байт. Если реле будет всего одно, достаточно отправлять туда булевую переменную (в Pascal-е она как раз однобайтовая). Если реле несколько, можно ввести набор констант.
Я запускал эту программу 1001 раз. Но видать допустил ошибку. За совет спасибо, ноя исправил эту проблему таким оброзом: Код (Text): // Управление реле 1 if (inChar == '.' && brightness == "rele1h.") { analogWrite(relepin1, LOW); delay(250); brightness = "";//обнуляем переменную } else if (inChar == '.' && brightness == "rele1l.") { digitalWrite(relepin1, HIGH); delay(250); brightness = "";//обнуляем переменную } Придирок AlexU я так и не понял, т.к. они безоснованны и ведут не в ту степь, в которую ведет мой вопрос. Так что -Вам огромный поклон и Like)))))
Код в первом сообщении не может работать верно. Если у Вас оно работает, то код в Вашем скетче и код в первом сообщении не соответствуют друг другу. И про Serial не понял. Я не предлагал его убрать, я предлагал отправлять в него байты вместо строк. Но не для работоспособности, а для красоты кода и скорости работы.
Под первой ветвью я имел ввиду часть кода между if и else, которая должна исполниться, когда выражение в скобках примет значение True. И это значение никогда не станет true, потому что каждый раз Вы обнуляете переменную brightness. Разложить пошагово, или сами сообразите?
Да что вы говорите? Тогда почему это все работает превосходно? Код (Text): // Управление реле 1 if (inChar == '.' && brightness == "rele1h.") { analogWrite(relepin1, LOW); delay(250); brightness = "";//обнуляем переменную } else if (inChar == '.' && brightness == "rele1l.") { digitalWrite(relepin1, HIGH); delay(250); brightness = "";//обнуляем переменную }
Хотя, возможно, проблема в скобках. В коде в первом посте не хватает одной закрывающейся фигурной скобки. Я предположил, что это просто не полностью скопированный код, и скобка, закрывающая цикл с предусловием, должна быть в самом конце. Если же эта скобка будет на пятой строке (после delay(1)), то всё должно работать.
Все и так работает!))))) Валерий, без обид, но вы определиесь - в скобках проблема или в обнулении...
Весь код в самом начале. Изменил там я только то что после if , а то что до if осталось без изменений......
Блин, для тех, кто в подводной лодке, повторяюсь. Тот код, который я вижу в первом сообщении, работать не может, хотя бы потому, что в нём есть синтаксическая ошибка — не хватает одной закрывающейся фигурной скобки. И там явно не весь код, потому что код скетча ардуино обязан содержать две функции: setup() и loop(). Тот код, который Вы привели в последнем сообщении, тоже не рабочий, потому что в нём не инициализированы переменные inChar и brightness. Приводите весь код или хотя бы как-то комментируйте контекст.
А с чего вы взяли что inChar сдесь нужно инициализировать? brightness да согласен - это переменная Serial = "". А про inChar - не че его инициализировать. А зачем Вам остальная часть кода? Для какой цели. В этой части и так все понятно!
Прежде чем читать из переменной, в неё нужно что-то записать. До этого в ячейке памяти, на которую указывает переменная, может быть что угодно, в лучшем случае просто ноль. Когда Вы сравниваете переменную с чем-то, Вы читаете из неё. В коде из первого поста с inChar всё очевидно, она содержит то, что было получено с последовательного порта. С brightness же ничего не понятно, но можно наванговать, что она инициализируется где-нибудь раньше как пустая строка. Весь код нужен для того, чтобы Вам же помочь. Вот смотрю я на этот код и начинаю в уме прокручивать ход его исполнения. Код (Text): // Управление реле 1 if (inChar == '.' && brightness == "rele1h.") { analogWrite(relepin1, LOW); delay(250); brightness = "";//обнуляем переменную } else if (inChar == '.' && brightness == "rele1l.") { digitalWrite(relepin1, HIGH); delay(250); brightness = "";//обнуляем переменную } В первой строке сравнивается inChar и '.'. А чему равен inChar? Хз, из кода это не понятно, значит, дальнейшее исполнение программы не определено. Всё, помощь закончилась. Возвращаясь к вот этому коду (из первого поста). Код (Text): while (Serial.available() > 0) { //если есть доступные данные char inChar = Serial.read(); //считываем байт brightness += inChar; //собираем информацию в строку delay(1); //Реле 1 вкл/выкл if (inChar == '.' && brightness == "rele1H.") { digitalWrite(relepin1, LOW); brightness = "";//обнуляем переменную } else { digitalWrite(relepin1, HIGH); brightness = "";//обнуляем переменную } В нём нет этой несчастной скобки. Раз её нет, можно или забить на помощь и пройти мимо, или наванговать её и помочь неправильно. Поставьте эту несчастную скобку и всё встанет на свои места. Весь остальной контекст, кстати, тоже нужно угадывать, но он вцелом более предсказуем. Я понимаю, что Вы, судя по всему, не программист, но хотя бы минимальный порядок в голове и в постах нужно соблюдать. Иначе беда.