Объединение двух sketch файлов
- Войдите на сайт для отправки комментариев
Доброго времени суток, уважаемые!
Совсем недавно занялся ардуино, интересная штука, только почитываю и вникаю в тему.
Возник сразу вопрос - я так понимаю - один скетч файл должен содержать весь код всех подключенных устройств?
И в таком случае у меня есть 2 устройства, сейчас у меня ардуино прошит датчиком температуры, я тестировал как он работает и вот скетч
#include <OneWire.h> byte data[12]; byte addr[8]; float celsius; OneWire ds(A5); // on pin A5 void setup(void) { Serial.begin(9600); ds.search(addr); ds.reset(); ds.select(addr); } void loop(void) { byte i; ds.search(addr); ds.reset(); ds.select(addr); ds.write(0x44,1); delay(1000); ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad for ( i = 0; i < 9; i++) data[i] = ds.read(); // we need 9 bytes unsigned int raw = (data[1] << 8) | data[0]; byte cfg = (data[4] & 0x60); if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms celsius = (float)raw / 16.0; Serial.println(celsius); }
теперь вопрос - в одной из тем форума я находил как подключать Relay Modul 2 я нашел отдельно скетч, но опять же как мне объеденить 2 скетча в один, при том, что сейчас я отключил датчик температуры и подключил только релюху и очу ее потестить, но скетч при этом хочется сохранить для обоих устройст независимо от того подключены ли они оба. Нашел на форме скетч для реле и датчика движения, как объеденить 2 скетча для моих условий?
#define RELE_1 9 #define RELE_2 8 #define ON 0 #define OFF 1 int ledPin = 13; // Светодиод на 13 порту int inPin = 3; // ИК Датчик движения void setup() { pinMode (ledPin, OUTPUT); pinMode (inPin, INPUT); digitalWrite(RELE_1, OFF); digitalWrite(RELE_2, OFF); pinMode(RELE_1, OUTPUT); pinMode(RELE_2, OUTPUT); } void loop() { if (digitalRead(inPin) ==HIGH) { digitalWrite(ledPin, HIGH); digitalWrite (ledPin, LOW); digitalWrite(RELE_1, ON); digitalWrite(RELE_1, OFF); digitalWrite(RELE_2, ON); digitalWrite(RELE_2, OFF); } }
И еще вопрос - датчик температуры понятно что работает всегда с обновлением, но с реле же все иначе - мне надо послать либо 1 либо 0 на влючение и выключение и никаких delay не будет я так понял? или нет?
Объединение простое:
1. Подключаем библиотеки, объявляем пины, объявляем глобальные переменные.
2. "Setup" - инициализация устройств
3. "loop" - считывание данных, отработка таймингов и данных, принятие и исполнение решений.
3.1. Удобнее часть кода вынести в отдельные функции которые вызывать по мере надобности. В итоге в "loop" останентся опрос функций, отработка таймингов и принятие решений.
Как то так
Я пока что с оптимизацией не готов поработать, но вот что получилось, не уверен что правильно и будет работать
У меня еще такой вопрос - на c# пишу управление программно как раз релюхой и тогда каким образом передавать команду именно в скетч на включение и выключение??
Вот скетч и ниже как я понимаю то что я буду передавать но как пока не ясно
вот код c# но не пойму как передать команду
Ой.
У Вас просто поразительно-бессмысленная "каша" в скетче. Я не в обиду, все через это проходили, просто налицо явный недостаток знаний "азбуки", который вопиет быть восполненным. Бросьте на время датчики и реле, почитайте про переменные, функции, pinMode, digitalRead, digitalWrite и множество прочих базовых вещей. Вам же потом легче и понятней будет. Стен без фундамента не построить.
Хорошо, посоветуйте что-то действительно полезное для чтива по базовой части
Буду банален, да и сам часто там подглядываю : http://arduino.ru/Reference
Если честно, не очень понимаю, что вы хотите получить? Срабатывание реле по температуре или по команде извне? И пост №6 очень обратить внимание.
У меня есть ардуино, сначала я зацепил на него датчик температуры и написал на шарпе софтину которая тупо слушает порт и получает данные с выводом на формочку, теперь я иду дальше, это самый простой был пример для меня. Я отцепил датчик температуры и подключил реле и хочу так же програмно включать его или выключать, сделать на форме чекбокс и соответственно производить операции.
Но скетч у меня сейчас как раз под датчик температуры, мне же надо прошить теперь в дополнение для реле - объеденить 2 скетча, при том у меня когда датчик температуры отключен, то функция посылает сообщение, что датчик такой то отключен.
Я почитал и так понял
1 - задаем переменные, сам пин и переменную для хранения входного значения
2 - объявляем pinMode() с параметром INPUT потому как на вход будет подаваться сигнал из вне
3 - в Loop читаем digitalRead() для пина и записываем в переменную результат, далее в зависимости от результата digitalWrite()
Все так?
1. Сначала всегда конфигурируем режим пина (pinMode), затем команда пину (digitalWrite).
2. Если пин в режиме OUTPUT, то причем тут digitalRead ?
3. Ну и самое главное, каким образом "ЗНАЧЕНИЕ ИЗ ВНЕ" попадет на пин, подключенный к реле ? Причем он тут вообще ?
4. "ЗАДЕРЖКА МЕЖДУ ВКЛЮЧЕНИЕМ РЕЛЕ" - впервые про такое слышу, вряд ли это нужно.
1. Принимают LOW,HIGH, аналог 0, 1. Соответственно можно писать непосредственно valOneIn
2. Вместо int - byte. И его за глаза.
3. Строки 12,13 поменять местами с 14,15 (Возможно и так будут работать, но не логично)
4. В "loop" начинается непонятка. valOneIn - глобальная переменная она и так помнит последнее значение (строки 20,21 выкинули)
Конструкции digitalWrite(relPinOne, OFF) заменили на digitalWrite(relPinOne, valOneIn). А вот с какого перепугу она дальше изменится я не вижу.
5. Не лезьте вы пока в управление извне, потренируйтесь с самой ардуиной. Управляете реле по температуре, кнопкой, по времени и т.п.
О, опоздал пока набирал)))
2. Вместо int - byte. И его за глаза.
Для valOneIn и valTwoIn тип boolean тоже неплох, повышает читабельность кода.
А нахрена вообще константы с номерами пинов объявлять?
Накидал #define и все дела.
Дело в том что я пока не могу подключить одновременно 2 устройства...поэтому пытаюсь реализовать управление релюхой програмно.
-----------------
Конструкции digitalWrite(relPinOne, OFF) заменили на digitalWrite(relPinOne, valOneIn). А вот с какого перепугу она дальше изменится я не вижу.
------------------
Вот тут я пока и не понимаю как мне получить команду на сам ардуино в скетче.
В студии то я написал
я передаю в зависимости от чекбокса значение, но как его принимает ардуино не пойму.
Например так. Без проверок и прочего.
Я прочел вот тут
http://arduino.ru/Reference/Serial/Read
об этом же...что надо использовать Serial
Еще писали о том что надо использовать порты TX и RX но у меня все заработало с Digital. В чем разница?
Все доработал, все заработало, всем спасибо за инфу, дальше буду разруливать как вы сказали лучше на функции - если у меня отключен какой то из датчиков то функция, например, температуры не работает и отсылается сообщение..
вот код, с радостью ваши советы почитаю.
Кстати я пока еще не совсем понял почему digitalRead тут нельзя использовать, выходит это для явных операций внутри скетча только?
Я прочел вот тут
http://arduino.ru/Reference/Serial/Read
об этом же...что надо использовать Serial
Еще писали о том что надо использовать порты TX и RX но у меня все заработало с Digital. В чем разница?
Ты тогда определись уже.
Ты спрашиваешь про получение команды на ардуине извне. Я написал пример чтения из Serial.
Теперь ты пишешь про цифровые пины.
Я в терминологии видимо путаюсь - написав извне, я имею ввиду команды которые я посылаю со своей софтины на ком порт.
Для чтения этих команд используется Serial как написано в документации.
Но там же написано и про цифровые порты как раз, поэтому меня это запутало.
Строки 15-17 бесполезны. Строка 35 замораживает программу. DS18 требуется не менее 750мС на конвертацию при 12бит режиме, после конвертации результат хранится до отключения питания или новой команды. Соответственно можете подать команду и уйти в основной цикл, вернутся через секунду или больше и считать показания.
Строки 45-48 определяют какой режим (9-12бит) использовался и приводят в соответствие. Если используете 12бит можно исключить.
digitalRead использовать можно, просто вначале вы под это дело выделили глобальные переменные.
digitalWrite(relPinOne , !digitalRead(relPinOne)); - инверсия предыдущего состояния.
Строки 15-17 бесполезны.
Потому как те же самые действия задаются в основном цикле?
Строка 35 замораживает программу. DS18 требуется не менее 750мС на конвертацию при 12бит режиме, после конвертации результат хранится до отключения питания или новой команды. Соответственно можете подать команду и уйти в основной цикл, вернутся через секунду или больше и считать показания.
Вот тут вообще ничего не понятно.
digitalRead использовать можно, просто вначале вы под это дело выделили глобальные переменные.
digitalWrite(relPinOne , !digitalRead(relPinOne)); - инверсия предыдущего состояния.
еще пока тоже не понятно как работать с Read
И вопрос сразу, каким образом мне определить подключен ли какое то из устройств? Соответственно как вынести код температуры в функцию отдельную и вызывать в случае если он подключен, либо же вызивать так же командой из своей софтины?
1. Верно
2. http://arduino.ru/tutorials/BlinkWithoutDelay
3.
Соответственно создаете другие функции. Присваиваете требуемые задержки и проверяете их в основном цикле. Там же проверяете свои команды извне.
4. Наличие DS18 можно определить по адресу и CRC. Почитайте на форуме и даташит. Как надежно определить работу блока реле без доп.обвязки не представляю.
5. Команда digitalRead() читает состояние цифрового пина (если не горелый), но что вы хотите от нее получить в данном случае непонятно.
Понял, спасибо, буду дальше ковыряться!
могу ли я сделать так для определения подключения датчика температуры?
а вот этот код как раз в функцию типа
А вы сами то пробовали проверить? Мне лично кажется, что 29 строка ни к чему не приведет. А delay() хоть в основном цикле, хоть в функции тормозом быть не перестал.
KorPaEv, а зачем Вам напрямую с DS18B20 работать, есть же нормальная библиотека https://github.com/milesburton/Arduino-Temperature-Control-Library Посмотрите пример, https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Simple/Simple.pde , там все гораздо проще сделано.
KorPaEv, а зачем Вам напрямую с DS18B20 работать, есть же нормальная библиотека https://github.com/milesburton/Arduino-Temperature-Control-Library Посмотрите пример, https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Simple/Simple.pde , там все гораздо проще сделано.
Согласен, но там проблема с таймингами, они в библиотеке забиты. Да и 2кБ памяти тоже кушает. Человек похоже пытается написать код без компиляции, тогда это процесс долгий. Мне полдня хватило чтобы разобратся с Далласами напрямую. Последний раз на Синклере програмировал.
Согласен, но там проблема с таймингами, они в библиотеке забиты.
Отнюдь. В библиотеке есть функции setResolution() и setWaitForConversion(false).
Я не умаляю ее достоинств, для моих задач напрямую оказалось проще и гибче. А особых сложностей не заметил.
Совет мой был для топикстартера.
Топикстартер - явный новичек, зачем сразу нагружать его конструкциями типа int raw = (data[1] << 8) | data[0]; byte cfg = (data[4] & 0x60);, ему и так нелегко.
Пытаюсь откомпилить пример с гита, у меня датчик на A5 висит, поправил в примере на 5 порт у меня сыпятся ошибки
KorPaEv, а зачем Вам напрямую с DS18B20 работать, есть же нормальная библиотека https://github.com/milesburton/Arduino-Temperature-Control-Library Посмотрите пример, https://github.com/milesburton/Arduino-Temperature-Control-Library/blob/master/examples/Simple/Simple.pde , там все гораздо проще сделано.
Согласен, но там проблема с таймингами, они в библиотеке забиты. Да и 2кБ памяти тоже кушает. Человек похоже пытается написать код без компиляции, тогда это процесс долгий. Мне полдня хватило чтобы разобратся с Далласами напрямую. Последний раз на Синклере програмировал.
понимаете - это мой первый опыт с ардуино, до этого я вообще о нем слышал только в теории, поэтому я прочел все что вы мне посоветовали, но такие вещи как задержки или работа с адресами там не описаны на том уровне на котором хотелось бы для понимания, а задача стоит и требует решения, поэтому я лезу естественно на форумы чтобы люди не писали за меня а объяснили то, что я не понимаю...
Проверьте, что у вас в папке с библиотекой нет еще одной с таким же именем, не забудьте перезагрузить IDE после установки библиотеки. Код который вы привели вначале, это из стандартного примера OneWire, но почему то кастрированный, исчезли проверки CRC.
А самое лучшее - проверка своих домыслов в железе.
Проверьте, что у вас в папке с библиотекой нет еще одной с таким же именем, не забудьте перезагрузить IDE после установки библиотеки. Код который вы привели вначале, это из стандартного примера OneWire, но почему то кастрированный, исчезли проверки CRC.
А самое лучшее - проверка своих домыслов в железе.
Проверил, у меня в папке Arduino/libraries лежит только папка которую стянул с гита и назвал ее DallasTempetature
Внутри лежит один файл с библиотекой и cpp.
А самое лучшее - проверка своих домыслов в железе. - Это вы о чем?
Дерните оттуда же keywords и "examples" и попробуйте со стандартными примерами. Еще смущает аналоговый пин, где то проскакивала инфа, что надо цеплять на цифровые.
В железе - написали скетчик, залили, погоняли на предмет корректной работы, помоделировали разные ситуации, попытались понять причину ошибок.
Вот этой https://www.dropbox.com/s/xyxmjwb0hhyhn75/DallasTemperature.zip?dl=0 пользуюсь сам. Попробуйте.
Датчик на A5 я бы не стал цеплять, лучше на цифровой пин.
Проблема была, кстати, не в библиотеках Dallas, скачал последнюю версию OneWire - все откомпилилось и заработало.
Теперь я опять же возвращаюсь к своему вопросу - поправьте если я не так мыслю.
У нас в Setup() инициализация датчиков. Получается могу ли я именно в Setup проверить подключен ли какой то из датчиков и уже далее запустить
Ну тут от задачи зависит. Вдруг датчик у тебя на соплях прилеплен и отваливается то и дело.
Ну тут от задачи зависит. Вдруг датчик у тебя на соплях прилеплен и отваливается то и дело.
Тогда все же в цикле проверять. Так что все же передать, какой адрес в функцию isConnected для этого датчика?
Можно проще сделать. Там есть #define DEVICE_DISCONNECTED_C -127, то есть если чтение температуры вернуло -127 градусов, то DEVICE_DISCONNECTED.
Можно проще сделать. Там есть #define DEVICE_DISCONNECTED_C -127, то есть если чтение температуры вернуло -127 градусов, то DEVICE_DISCONNECTED.
вот так заработало
Протестил, датчик отключаешь, монитор порта пустой. Все работает хорошо.
Я уже наверное задолбал вас со своими вопросами, но сразу возник еще один по ходу.
Смотрите как лучше сделать?
Такая ситуация - у меня например при отключении датчика температуры и подключения реле на выход ком порта все равно будут фактически выводиться в цикле строки постоянно, но пустые
Выходит когда я подам команду на включение реле у меня в ответ вернется следующее
ON
""
""
""
""
""
""
я конечно могу считать первую строку ответа и вывести состояние реле на форму но все же видимо это неправильно.
Тогда пиши последнее значение, например, или "ERR"
Такая ситуация - у меня например при отключении датчика температуры и подключения реле на выход ком порта все равно будут фактически выводиться в цикле строки постоянно, но пустые
Ответ прост и очевиден - отлавливайте пустые строки if-ом и не выводите их.
Хорошо, попробую!