странные данные через ком
- Войдите на сайт для отправки комментариев
Пт, 20/07/2012 - 10:02
Есть два ардуино подключенные через комп порт . Нужно передавать с 1 на 2 два параметра температуру и скорость.
Чтоб не заморачиваться с массивами(пака не разобрался в них) передаю первый параметр как 10-24 второй как 25-30. Получается у меня в ком порт идут два числа. чередуясь. Пока проверяю на потенциномерах. Иногда все работает нормально независимо друг от друга и аногда при изменении данных на 1 из потенциномеров меняются и на втором. Из-за чего это может быть?? И еще сталкнулся с проблемой при добавлении в команду Seril.print значения ln на принимающем устройстве появляется еще два числа , идет чередования мое число, 1 левое, 2 левое и опять по кругу с моего .
Что бы хоть как-то и кто вам мог помоч, нужно выкладывать код принимающем и передающей дуины и желательно не куски кода, а весь код.
И еще сталкнулся с проблемой при добавлении в команду Seril.print значения ln на принимающем устройстве появляется еще два числа , идет чередования мое число, 1 левое, 2 левое и опять по кругу с моего .
Это не проблема так как функция "Seril.println()" после отправки посылаемых данных еще в конце отсылает символ перехода на новую строку и символ сдвига коретки в начало строки.
int i = 0; int d = 0; int krytPin = 0; int krytPin1 = 1; void setup() { //Start Serial Serial.begin(9600); //analogReference(DEFAULT); } void loop(){ int val = analogRead(krytPin); int val1 = analogRead(krytPin1); i = map(val,0,1023,0,20); d = map(val1,0,1023,40,11); Serial.write(i); delay(500); Serial.write(d); delay(500); }это передатчик если в буквенном видде передаю цифро то белее менее нормально если непосредственно значения вал то вообще хрен пойми что
#include <PCD8544.h> int led = 13; int ledPin =8; static PCD8544 lcd; void setup() { Serial.begin(9600); pinMode(led,OUTPUT); pinMode(ledPin, OUTPUT); // sets the digital pin as output digitalWrite(ledPin, HIGH); lcd.begin(84, 48); } void loop() { while( Serial.available() == 0); byte data = Serial.read() - '0'; // byte data1= Serial.read(); //if(data>210) {digitalWrite(13,1);} int val = map(data,10,25,0,15); int val2 = map(data,27,40,0,15); // Serial.println(data); Serial.println(data); lcd.setCursor(0, 0); lcd.print(data-200); lcd.print(" km/h "); // lcd.setCursor(0, 1); // lcd.print(val2); }это приемник. получается у меня на приемнике 1 потенциномер 10-25 второй 27-40. Иногда норм показывает иногда второй потенциномер меняет значение вмести с 1 и наоборот
это приемник. получается у меня на приемнике 1 потенциномер 10-25 второй 27-40.
А на передатчике не получается. Там у вас один 0-20, а второй 40-11. То есть в интервале 11-20 у вас они пересекаются значениями. Строка 17-ть первого скетча.
спасибо не заметил счас проверю. просто вчера из-за торможения менял значения исправлю скину результат
int i = 0; int d = 0; int krytPin = 0; int krytPin1 = 2; int val2 = 0; int val4 = 0; void setup() { //Start Serial Serial.begin(9600); //analogReference(DEFAULT); } void loop(){ int val = analogRead(krytPin); int val1 = analogRead(krytPin1); val2 = map(val,0,1023,11,30); val4 = map(val1,0,1023,31,50); //Serial.write(i); //delay(500); //Serial.write(d); delay(500); Serial.write(val2); Serial.write(val4); }код передатчика если в ком порт смотреть то шлет все как задано
#include <PCD8544.h> int led = 13; int ledPin =8; static PCD8544 lcd; void setup() { Serial.begin(9600); pinMode(led,OUTPUT); pinMode(ledPin, OUTPUT); // sets the digital pin as output digitalWrite(ledPin, HIGH); lcd.begin(84, 48); } void loop() { while( Serial.available() == 0); byte data = Serial.read() - '0'; // byte data1= Serial.read(); //if(data>210) {digitalWrite(13,1);} int val = map(data,11,30,0,15); int val2 = map(data,31,50,0,15); // Serial.println(data); Serial.println(data); lcd.setCursor(0, 0); lcd.print(val); lcd.print(" 1-2 "); lcd.print(val2);приемник если 2 потенциномера до конца выкручены показывает 237 на первом и 239 на втором . В обратную сторону 1 на первом и 219 на втором
еще ка вариант я брал I отнимал от него число чтоб на втором устройстве получился 0 а потом прибовлял данные потенциномера
int i = 0; //int d = 0; int krytPin = 0; int krytPin1 = 2; int val2 = 0; int val4 = 0; void setup() { //Start Serial Serial.begin(9600); //analogReference(DEFAULT); } void loop(){ int val = analogRead(krytPin); int val1 = analogRead(krytPin1); val2 = map(val,0,1023,11,30); val4 = map(val1,0,1023,31,50); //Serial.write(i); //delay(500); //Serial.write(d); delay(500); Serial.write(i+48+val2); Serial.write(i+48+val4); //Serial.write(val4); }с таким кодом передатчика работает. но через время начинает тупить как описано свыше
Как минимум строка 18-ть явно взята из какого-то примера без понимания "зачем она нужна и что она делает". Закоменченная 19-ть, раз данные передаются в бинарном виде, была-бы более уместная.
Да и "показывает 237 на первом и 239 на втором", вызвает сомнения. Не может, после строк 21,22, значения валов быть больше 15-ти.
Сделайте там Serial.print-ты валов, выяните что-же у вас в итоге получилось. Локализируйте в чем у вас проблема в "передаче-приему", в последующей конвертации или в "выводе на экран".
Update: упоминаемые строки относятся к скетчу в msg#10
еще ка вариант я брал I отнимал от него число чтоб на втором устройстве получился 0 а потом прибовлял данные потенциномера
Ну вариаций нафантазировать можно много. Любая задача имеет много решений. Например маппить значения в интервал от 1-126. А, потом для второго умножать на -1. Тогда на "принимающей" будеть проще разобратся - больше нуля - значит данные первого, меньше нуля - данные второго.
Хотя ваш сам подход (бить на диапазоны) "немного коряв". Но, должен признать, показывает наличие "соображалки", способность (и желание) выкручиватся в рамках имеющихся знаний. Так что, с учебными целями, стоит "дожать его", а потом поищем более "красивые варианты".
на сколько мне кажется она переводит в десятичную систему исчесления. проста раньше все принтами передавал не помню откуда 19 нарисовалась. Вроде валы очухались но всплыла другая проблема я не могу выводить вал 1 и вал 2 на экран приемника . на приемники уже 11-30 и 31-50и приравнены к 0-15 но почемуто на экране 5110 данные скачут хотя в ком порте приемника все как надо.
про пример вы правы джереми переводил в десятичную
В дальнейшем, пожалуста, вставляйте коды передатчика и приемника в одно сообщения. А то вы их чередуете и трудно следить какой передатчик с каким приемником используете.
Что-бы ветка не превращалась в "простыню", можно, при вставке кода, на вкладке "Дополнительно" отмечать галочку "свернуть".
на сколько мне кажется она переводит в десятичную систему исчесления.
Неверно (хотя ход мысли правильный) . "Системы исчисления" это вообще "человеческая фишка". В байтах все хранится/передается просто "как значение", как "абстрактная число". Переводить в "системы исчисления" это уже когда человеку нужно "показть". Это не более чем "форма записи какого-то числа".
Теперь вернемся к тому что же делает это строка: когда вы в сериал мониторе, руками вводите цифру 0 или 1, то дуине отправлеется не "байт со значением 0 или 1", а "код символа 0 или 1" в кодировке ascii (то есть фактически "строка"). Коды символа 0 это 48. 1 - 49, 2- 50. Вот для того что-бы перевести такую "код в цифру" и используются подобные строки.
Если же в сериал изначально уже был отправлено "чистое значение", то обратно "переводить" его уже не нужно. Только "прочитать".
проста раньше все принтами передавал не помню откуда 19 нарисовалась.
Ну откуда-бы не нарисовалась, а но именно "тупой read()" соотвествует "тупому write()" на передатчике.
Вроде валы очухались но всплыла другая проблема я не могу выводить вал 1 и вал 2 на экран приемника .
Значит "дробите задачу", выкидывайте всю свою "принимающую логику". Тупо напишите в скетче val1=8; val2=12; И попытайте вывести на экран.
То о чем я и говорил вам в соседней ветке. Вначале осваиваем "простые кубики", а уж потом из них собираем что-тот более сложное. Не нужно было лезть в задачу "принимать данные по сериал и выводить на экран", если задачу "выводить на экран" еще не умеем решать.
Задачу "принимать", по вашим словам вы уже "решили", задачу "выводить" - еще нет. Решите, отдельно "выводить", а уж потом беритесь за "принимать и выводить".
Не знаю нормально ли у вас работает lcd.setCursor, но попробуйте так:
#include <PCD8544.h> static PCD8544 lcd; void setup(){ Serial.begin(9600); lcd.begin(84, 48); } void loop(){ while(Serial.available()){ // Цикл пока что то есть в буфере delay(2); // Задержка для стабильности byte data = Serial.read(); // Читаем 1-ый байт lcd.setCursor(0, 0); // Сдвигаем курсор в начало 1-ой строки lcd.print(data); // Выводим на дисплей 1-ый байт data = Serial.read(); // Читаем 2-ой байт lcd.setCursor(1, 0); // Сдвигаем курсор в начало 2-ой строки lcd.print(data); // Выводим на дисплей 2-ой байт }В дальнейшем, пожалуста, вставляйте коды передатчика и приемника в одно сообщения. А то вы их чередуете и трудно следить какой передатчик с каким приемником используете.
Что-бы ветка не превращалась в "простыню", можно, при вставке кода, на вкладке "Дополнительно" отмечать галочку "свернуть".
Дело в том что так и делал сразу попробовал выводить часы и просто данные а счас перешол на ком порт но пока что то не выходит буду пробовать дальше
СПАСИБО ПОМОГЛО!!!!!!! Единственноестрока 16. 1 и0 поменять местами строка это второе значение.
Нук и напоследок еще вопрос у меня счас на экране нокиа 5110 6 строк . Для того чтоб была например 4 или 3 ну или тока 2 больших знака что надо сделать ??? Поменять библиотеку???
int i = 0; //int d = 0; int krytPin = 0; int krytPin1 = 2; int val2 = 0; int val4 = 0; void setup() { //Start Serial Serial.begin(9600); //analogReference(DEFAULT); } void loop(){ int val = analogRead(krytPin); int val1 = analogRead(krytPin1); val2 = map(val,0,1023,11,30); val4 = map(val1,0,1023,31,50); //Serial.write(i); //delay(500); //Serial.write(d); delay(500); Serial.write(i+48+val2); Serial.write(i+48+val4); //Serial.write(val4); } передатчик сверху #include <PCD8544.h> int led = 13; int ledPin =8; static PCD8544 lcd; void setup() { Serial.begin(9600); pinMode(led,OUTPUT); pinMode(ledPin, OUTPUT); // sets the digital pin as output digitalWrite(ledPin, HIGH); lcd.begin(84, 48); } void loop() { while( Serial.available() == 0); byte data = Serial.read() - '0'; // byte data1= Serial.read(); //if(data>210) {digitalWrite(13,1);} int val = map(data,11,30,0,15); int val2 = map(data,31,50,10,115); // Serial.println(data); Serial.println(data); lcd.setCursor(0, 0); lcd.print(data); data = Serial.read()- '0'; lcd.setCursor(0,1 ); lcd.print(data); // lcd.setCursor(0, 1); // lcd.print(val2); } приемник сверху я понял что в строке в которой читается ком порт можно убрать перевод на другое исчесление а в передатчике мои 48 но пока код такой. Может комуто понадобится как мне. А насчет изучения у меня цель не изучить платформу а сделать свои проект. Я увлекаюсь моделями на радиоуправлении и мне захотелось сделать пульт с телеметрией и дополнительными каналами к родной аппе . Готов уже процентов на 70 ну и паралельно учусь ардуине. Но пока самое сложное с чем я столкнулся это массивы никак немогу осилить их передачу по ком порту. Спасибо всем за помощь!!Может и эта библиотека может выводить большие символы... ну а если не может, то погуглите, думаю уже такие библиотеки есть.
Вот так можно делать - это на будущее
Передатчик:
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(13, LOW); // set the LED off delay(1000); // wait for a second }Приемник:
void setup() { pinMode(13, OUTPUT); } void loop() { digitalWrite(13, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(13, LOW); // set the LED off delay(1000); // wait for a second }Ничего сложного.
1 строка - что с ней можно сделать???
про 2 я уже понял и писал.
3 и 4 я перевожу то что получаю чтоб на экране ардуины видеть данные 1 и 2 потенциномеров 0-15
Я понял что счас оно немного не на том месте.
По поводу 1 строки, смтрите выше в коде.
В 3 и 4 строке вы обЪвляете переменные int val и int val2 и никуда вы их не выводите... а что бы получать нужный вам диапазон нужно просто его отправлять таким, каким вам нужно.
И еще заметил только сейчас, в 6 строке зачем вы отправляете обратно значение, которое только что получили?
6 строку смотрю но ком порте компа я видел что они не переводятся просто надо переставить
.... я видел что они не переводятся просто надо переставить
кто не переводятся? кого переставить?
значения вал сча не используются
Так а не проще их такими сразу отправлять?
это строки из передающего кода.
Передающая:
int krytPin = 0; int krytPin1 = 2; void setup(){ Serial.begin(9600); } void loop(){ Serial.write(map(analogRead(krytPin),0,1023,0,15)); Serial.write(map(analogRead(krytPin1),0,1023,0,15)); delay(500); }Принимающая:
#include <PCD8544.h> static PCD8544 lcd; void setup(){ Serial.begin(9600); lcd.begin(84, 48); } void loop(){ while(Serial.available()){ byte data = Serial.read(); lcd.setCursor(0, 0); lcd.print(data); data = Serial.read(); lcd.setCursor(0, 1); lcd.print(data); } }там опечатка они обао 0-15 они должны быть независимы друг от друга . счас получается ервая 11-30 вторая 31-50 и потом в приемнике обе к 0-15
Эти два байта всегда будут независимы друг от друга, потом просто поменяете в передающем коде
и все.
понял спасибо попробую. а смысл тогда передавать массивами если можно так?? просто мне говорили что мою задачю тока массивом можно решить
поменял коды как вы советовали убрал лишнее все нормально . не подскажите что можно сделать с 1 строкой в которой прога висит возможно из-за этого xbee тока в 1 сторону работает
while( Serial.available() == 0);
Скорее всего из-за этого и не работат потому что пока в буфере UART пусто программа крутится в пустом цикле и ничего не делает. Вы идете как бы от обтатного, то есть пока Serial.available() == 0 - цикл. Я вам предлагаю сделать наоборот пока Serial.available() == 1 - цикл, в котором происходит чтение. Вы же видите как в моих примерах это реализовано.
Ваш способ:
void loop() { while(Serial.available() == 0){ } byte data = Serial.read(); }Мой способ:
void loop() { while(Serial.available() == 1){ byte data = Serial.read(); } }В среде дуины эти записи эквивалентны:
Serial.available() == 0 эквивалентно !Serial.available() и Serial.available() == 1 эквивалентно Serial.available()Выше я вам уже код писал (код с комментариями), единственное я там одну скобку забыл поставить }
вот еще раз:
void loop() { #include <PCD8544.h> static PCD8544 lcd; void setup(){ Serial.begin(9600); lcd.begin(84, 48); } void loop(){ while(Serial.available() == 1){ // Цикл пока что то есть в буфере byte data = Serial.read(); // Читаем 1-ый байт lcd.setCursor(0, 0);// Сдвигаем курсор в начало 1-ой строки lcd.print(data); // Выводим на дисплей 1-ый байт data = Serial.read(); // Читаем 2-ой байт lcd.setCursor(0, 1);// Сдвигаем курсор в начало 2-ой строки lcd.print(data); // Выводим на дисплей 2-ой байт } }int krytPin = 0; int krytPin1 = 2; int val2 = 0; int val4 = 0; void setup() { Serial.begin(9600); } void loop(){ int val = analogRead(krytPin); int val1 = analogRead(krytPin1); val2 = map(val,0,1023,11,30); val4 = map(val1,0,1023,11,30); delay(500); Serial.write(val2); Serial.write(val4); } передатчик // с часами #include <PCD8544.h> unsigned long time; int led = 13; int ledPin =8; static PCD8544 lcd; void setup() { Serial.begin(9600); pinMode(led,OUTPUT); pinMode(ledPin, OUTPUT); // sets the digital pin as output digitalWrite(ledPin, HIGH); lcd.begin(84, 48); } void loop() { ////////////////// часы time = millis(); int sek = time/1000; int minyt = (time/1000)/60; int cas = (minyt/60); int minyt2 = minyt; if(cas>0) minyt2 =(minyt-60*cas); if((time/1000)>60) sek =(sek-60*minyt); /////////////////// часы lcd.setCursor(0, 0); lcd.print(cas);lcd.print("h "); lcd.print(minyt2);lcd.print("m "); lcd.print(sek);lcd.print("s"); lcd.print(" vol "); while( Serial.available() == 0); byte data = Serial.read(); Serial.println(data); lcd.setCursor(0, 1); lcd.print(data); data = Serial.read(); Serial.println(data); lcd.setCursor(21,1); lcd.print(data); } приемник С передатчика на приемник все идет нормально а вот в обратную сторону никак, может кто нибудь подскажет в чем дело?? надо прерывать передачу чтоб принять?????у меня получается что данные идут каждые пол секунды в порт.ил это никак не влияяет???
поменял 0 на 1 стали показывать вмест 11-30 115-290 но на мотенциномер нормально реагирует. а блин это теже 11-30(29) тока откудато в конце 5 нарисовалась. Так какаято левая хрень была поубирал. все работает
Я вас не понимаю, выражайтесь яснее, что и где меняете.... что и где меняется....
Просто у меня на экране вместо показаний потенциномера еще была цифра 5 (не 11 а 115 и так далее)после каждого показания но это косяк экрана был я все убрал. меня интересует как организовать двусторонню связь чтоб я мог с приемника отправлять на ередатчик не мешая работе связке передатчик приемник
Я думаю XBEE без проблем будет "одновременно" принимать и отправлять данные. Все дело в вашем коде. А сделать это можно по аналогии в принимающий код добавить часть кода передающего, а в передающий добавить часть принимающего.
получается грубо говоря я принял 1 байт вывел в экран передал инфо по xbee потом прочитал второй байт и так далее и с той стороны тоже самое???