Привет.опишу немного то что я хочу сделать чтоб было понятно. Имеется 2 ардуинки НАНО и УНО. на Уно будет висеть tft с тачем. Нано будет увешен различными датчиками( темперетура, влажность и т.п) а также нарисую небольшое меню для управления электро устройствами (розетка, лампочка и т.п). возникли проблемы со связкой 2х ардуин. а именно с пониманием типов данных. допустим ставлю я себе задачу пока управлять лампочкой. есть у меня на дисплее кнопка(включить свет на первом светильнике) при нажатии на кнопку мне надо отправить по Serial слово "Light1On" вот тут и начинаются проблемы с передачей , по 1й цифре из примера ниже все передается, а вот слово как передать я не понимаю. пример из интернета Код (C++): int outputPin = 13; //здесь храним номер контакта int val; //здесь будет храниться принятый символ void setup() { Serial.begin(9600); //установка порта на скорость 9600 бит/сек pinMode(outputPin, OUTPUT); //устанавливаем 13 контакт в режим вывода } void loop() { if (Serial.available()) { //если есть принятый символ, val = Serial.read(); // то читаем его и сохраняем в val Serial.println(val); if (val == '1') { // если принят симовол 'H',... digitalWrite(outputPin, HIGH);// то включаем светодиод } if (val == '0') { // если принят симовол 'L', digitalWrite(outputPin, LOW); // то выключаем светодиод } } } где копать, что исправить?
Вам принципиальны символы?? Почему не отправлять 11 - включение лампы номер1 10- выключение 21- включение лампы 2 20 - выключение .... и т.д.
В данном примере работает диапазон чисел от 0 до 9, Код (C++): if (val == "11")//уже не работает. что то компилятору уже не нравится при компиляции. С символьными данными работать легче, и может быть кто растолкует чтоб было понятно как работать с последовательными символьными данными
Не спец в этом вопросе но точно знаю что символьные данные это string а вы запихиваете в int, а он числовой . И по поводу компиляции кавычки одинарные не пробовали как в примере ? Вам нужно почитать про Парсинг строк в ардуино, скорее всего и библиотека есть для этих целей.
ну во первых '1'==0x33=49 а "1" - это уже будет строка, или массив из двух элементов со значениями 49 и 0, если вы пишите что-то в " ", то компилятор автоматически добавляет терминатор строки 0. Соответсвенно "11" - это массив из трех unsigned char - {49,49,0}. Для сравнения строк вроде "11" нужно уже не ==, а функция strcmp(*string1,*string2). если у вас val Int, то компилятор не дает сравнивать int со строкой "11"
Действительно символьные данные нужно было совать в string, и ошибка пропадает. ух, голова моя боюсь не переварит это, хотя это только базовые основы. спасибо за объяснение о двойных кавычках. и про функцию такую не слышал. получается все что я отправляю на ардуину, она переводит в код согласно таблице ASCII ? нашел вот такой код. вроде работает как надо Код (C++): String bufer=""; char ledPin = 13; void setup(){ pinMode(ledPin, OUTPUT); Serial.begin(9600); Serial.println("arduino started"); } void loop(){ if (Serial.available() > 0) { char ByteRead=Serial.read(); //чтение данных с порта if (ByteRead==13) { //возврат каретки analyzer(); //передача данных на обработку bufer=""; } //освобождение буфера else { ///накопление данных в буфер if(ByteRead!=10)bufer=bufer+char(ByteRead); // символ "новая строка" \n, нам в буффере не нужен } } } void analyzer() { if (bufer.length()>1) { Serial.println("!!!!"); } //если буфер не пустой if (bufer=="test") { Serial.print("read: "); Serial.println(bufer); digitalWrite(ledPin, HIGH); } //если принято слово "test" if (bufer=="test1") { Serial.print("read: "); Serial.println(bufer); digitalWrite(ledPin,LOW); } //если принято слово "test1" }
Другая проблема, может подскажете? как с одной ардуинки передать текст во вторую, у второй залит скетч что выше, в мониторе порта с переносом строки все работает? думал все так просто, оказалось не так) на первой пишу ради эксперимента Код (C++): Serial.println("test"); вторая принимает, и в окне порта вижу циферки
а пп вызывается с контентом буфера не просто "test", а "test\r" - 5 элементов, включая '\r' - перенос строки, так специально обозначают упр. символ аsci 13, он же return, он же '\r'
String (с заглавной буквы!) это имя класса, которого нет в чистом С/С++. Для него переопределены операции сравнения, потому и == работает. https://www.arduino.cc/en/Tutorial/StringComparisonOperators Когда употребляют термин string (с маленькой буквы!), то имеют в виду обычные нультерминированые строки языка Си. https://www.arduino.cc/en/Reference/String
Как можно передать данные часов реального времени с одной ардуины по Serial во вторую ардуинку? что бы вторая смогла понять что пришли нужные данные и их нужно обработать. ? на первой стоит TFT и линии SDA SCL заняты им
И что Что заняты ??? Они параллельно работают прекрасно http://forum.amperka.ru/threads/Часы-с-функцией-включения-ночного-света.7215/ Вот посмотрите. То же часы и экран работают вместе, эта шина позволяет Почитайте внимательно про I2C ну и про остальные шины то же будет полезно ..
стоит мне подключить библиотеку wire как у меня дисплей идет в reset т.к на SDA в библиотеке дисплея где то задан этот пин как tft_reset, у меня не i2c дисплей. Спойлер: картинка
Всетаки думаю стоит капнуть библиотеку чем строить городки из двух ардуин ещё и сериал потом занимать , ну если уж совсем приспичило обратите внимание на библиотеки virtual wire и easy transfer virtual wire.
Спасибо, библиотеки для меня темный лес, там вообще все не понятно), основы то с трудом даются. я бы с радостью повесил все на одну ардуинку, только вот в планах несколько датчиков, а дисплей съедает почти все пины. остается воде 4 свободных пина. есть еще ардуинка МЕГА попробую на ней)