странные данные через ком

Protez1999
Offline
Зарегистрирован: 08.07.2012

Есть два ардуино подключенные через комп порт . Нужно передавать с 1 на 2 два параметра температуру и скорость.

Чтоб не заморачиваться с массивами(пака не разобрался в них) передаю первый параметр как 10-24 второй как 25-30. Получается у меня в ком порт идут два числа. чередуясь. Пока проверяю на потенциномерах. Иногда все работает нормально независимо друг от друга и аногда при изменении данных на 1 из потенциномеров меняются и на втором.  Из-за чего это может быть?? И еще сталкнулся с проблемой при добавлении в команду Seril.print значения ln на принимающем устройстве появляется еще два числа , идет чередования мое число, 1 левое, 2 левое  и опять по кругу с моего . 

maksim
Offline
Зарегистрирован: 12.02.2012

Что бы хоть как-то и кто вам мог помоч, нужно выкладывать код принимающем и передающей дуины и желательно не куски кода, а весь код.

Protez1999 пишет:

И еще сталкнулся с проблемой при добавлении в команду Seril.print значения ln на принимающем устройстве появляется еще два числа , идет чередования мое число, 1 левое, 2 левое  и опять по кругу с моего . 

Это не проблема так как функция "Seril.println()" после отправки посылаемых данных еще в конце отсылает символ перехода на новую строку и символ сдвига коретки в начало строки.

Protez1999
Offline
Зарегистрирован: 08.07.2012
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);
}

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

это передатчик если в буквенном видде передаю цифро то белее менее нормально если непосредственно значения вал то вообще хрен пойми что 

Protez1999
Offline
Зарегистрирован: 08.07.2012

#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);
   
   
  }

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

это приемник. получается у меня на приемнике 1 потенциномер  10-25 второй 27-40. Иногда норм показывает иногда второй потенциномер меняет значение вмести с 1 и наоборот 

leshak
Offline
Зарегистрирован: 29.09.2011

 

Protez1999 пишет:

это приемник. получается у меня на приемнике 1 потенциномер 10-25 второй 27-40.

А на передатчике не получается.  Там у вас один 0-20, а второй 40-11. То есть в интервале 11-20 у вас они пересекаются значениями. Строка 17-ть первого скетча.

Protez1999
Offline
Зарегистрирован: 08.07.2012

спасибо не заметил счас проверю. просто вчера из-за торможения менял значения исправлю скину результат 

Protez1999
Offline
Зарегистрирован: 08.07.2012



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); 
}

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

код передатчика если в ком порт смотреть то шлет все как задано 

Protez1999
Offline
Зарегистрирован: 08.07.2012

#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 на втором

Protez1999
Offline
Зарегистрирован: 08.07.2012

еще ка вариант я брал I отнимал от него число чтоб на втором устройстве получился 0 а потом прибовлял данные потенциномера  

Protez1999
Offline
Зарегистрирован: 08.07.2012
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); 
}

с таким кодом передатчика работает. но через время начинает тупить как описано свыше  

leshak
Offline
Зарегистрирован: 29.09.2011

Как минимум строка 18-ть явно взята из какого-то примера без понимания "зачем она нужна и что она делает". Закоменченная 19-ть, раз данные передаются в бинарном виде, была-бы более уместная.

Да и "показывает 237 на первом и 239 на втором", вызвает сомнения. Не может, после строк 21,22, значения валов быть больше 15-ти.

Сделайте там Serial.print-ты валов, выяните что-же у вас в итоге получилось. Локализируйте в чем у вас проблема в "передаче-приему", в последующей конвертации или в "выводе на экран".

Update: упоминаемые строки относятся к скетчу в msg#10

leshak
Offline
Зарегистрирован: 29.09.2011

Protez1999 пишет:

еще ка вариант я брал I отнимал от него число чтоб на втором устройстве получился 0 а потом прибовлял данные потенциномера  

Ну вариаций нафантазировать можно много. Любая задача имеет много решений. Например маппить значения в интервал от 1-126. А, потом для второго умножать на -1. Тогда на "принимающей" будеть проще разобратся - больше нуля - значит данные первого, меньше нуля - данные второго.

Хотя ваш сам подход (бить на диапазоны) "немного коряв". Но, должен признать, показывает наличие "соображалки", способность (и желание) выкручиватся в рамках имеющихся знаний. Так что, с учебными целями, стоит "дожать его", а потом поищем более "красивые варианты".

Protez1999
Offline
Зарегистрирован: 08.07.2012

на сколько мне кажется она переводит в десятичную систему исчесления. проста раньше все принтами передавал не помню откуда 19 нарисовалась. Вроде валы очухались но всплыла другая проблема я не могу выводить вал 1 и вал 2 на экран приемника . на приемники уже 11-30 и 31-50и приравнены  к 0-15 но почемуто на экране 5110 данные скачут хотя в ком порте приемника все как надо.

про пример вы правы джереми переводил в десятичную

leshak
Offline
Зарегистрирован: 29.09.2011

 В дальнейшем, пожалуста, вставляйте коды передатчика и приемника в одно сообщения. А то вы их чередуете и трудно следить какой передатчик с каким приемником используете.

Что-бы ветка не превращалась в "простыню", можно, при вставке кода, на вкладке "Дополнительно" отмечать галочку "свернуть".

leshak
Offline
Зарегистрирован: 29.09.2011

Protez1999 пишет:

на сколько мне кажется она переводит в десятичную систему исчесления.

Неверно (хотя ход мысли правильный) . "Системы исчисления" это вообще "человеческая фишка". В байтах все хранится/передается просто "как значение", как "абстрактная число". Переводить в "системы исчисления" это уже когда человеку нужно "показть". Это не более чем "форма записи какого-то числа".

Теперь вернемся к тому что же делает это строка: когда вы в сериал мониторе, руками вводите цифру 0 или 1, то дуине отправлеется не "байт со значением 0 или 1", а "код символа 0 или 1" в кодировке ascii (то есть фактически "строка"). Коды символа 0 это 48. 1 - 49, 2- 50. Вот для того что-бы перевести такую "код в цифру" и используются подобные строки.

Если же в сериал изначально уже был отправлено "чистое значение", то обратно "переводить" его уже не нужно. Только "прочитать".

Protez1999 пишет:

проста раньше все принтами передавал не помню откуда 19 нарисовалась.

Ну откуда-бы не нарисовалась, а но именно "тупой read()" соотвествует "тупому write()" на передатчике.

Protez1999 пишет:

Вроде валы очухались но всплыла другая проблема я не могу выводить вал 1 и вал 2 на экран приемника .

Значит "дробите задачу", выкидывайте всю свою "принимающую логику". Тупо напишите в скетче val1=8; val2=12; И попытайте вывести на экран.

То о чем я и говорил вам в соседней ветке. Вначале осваиваем "простые кубики", а уж потом из них собираем что-тот более сложное. Не нужно было лезть в задачу "принимать данные по сериал и выводить на экран", если задачу "выводить на экран" еще не умеем решать.

Задачу "принимать", по вашим словам вы уже "решили", задачу "выводить" - еще нет. Решите, отдельно "выводить", а уж потом беритесь за  "принимать и выводить".

 

 

maksim
Offline
Зарегистрирован: 12.02.2012

Не знаю нормально ли у вас работает 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-ой байт
}

 

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

leshak пишет:

 В дальнейшем, пожалуста, вставляйте коды передатчика и приемника в одно сообщения. А то вы их чередуете и трудно следить какой передатчик с каким приемником используете.

Что-бы ветка не превращалась в "простыню", можно, при вставке кода, на вкладке "Дополнительно" отмечать галочку "свернуть".

Дело в том что так и делал сразу попробовал выводить часы и просто данные а счас перешол на ком порт но пока что то не выходит буду пробовать дальше

Protez1999
Offline
Зарегистрирован: 08.07.2012

СПАСИБО ПОМОГЛО!!!!!!! Единственноестрока 16. 1 и0 поменять местами строка это второе значение.

Нук и напоследок еще вопрос у меня счас на экране нокиа 5110 6 строк . Для того чтоб была например 4 или 3 ну или тока 2 больших знака что надо сделать ??? Поменять библиотеку???

Protez1999
Offline
Зарегистрирован: 08.07.2012
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 ну и паралельно учусь ардуине. Но пока самое сложное с чем я столкнулся это массивы никак немогу осилить их передачу по ком порту. Спасибо всем за помощь!!


 

maksim
Offline
Зарегистрирован: 12.02.2012

Может и эта библиотека может выводить большие символы... ну а если не может, то погуглите, думаю уже такие библиотеки есть.

maksim
Offline
Зарегистрирован: 12.02.2012

Вот так можно делать - это на будущее

Передатчик:

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
}

Ничего сложного.

maksim
Offline
Зарегистрирован: 12.02.2012
while( Serial.available() == 0); // Не самый верный подход !!! программа висит в пустом цикле и не сможет больше ничего выполнять...
byte data = Serial.read() - '0'; // зачем вычитать '0' (48) если вы отправляете байт, а не символ???
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'; // зачем вычитать '0' (48) если вы отправляете байт, а не символ???
lcd.setCursor(0, 1);
lcd.print(data);

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

 1 строка - что с ней можно сделать???

про 2 я уже понял и писал.

3 и 4 я перевожу то что получаю чтоб на экране ардуины видеть данные 1 и 2 потенциномеров 0-15

Я понял что счас оно немного не на том месте.

maksim
Offline
Зарегистрирован: 12.02.2012

По поводу 1 строки, смтрите выше в коде.

В 3 и 4 строке вы обЪвляете переменные int val и int val2 и никуда вы их не выводите... а что бы получать нужный вам диапазон нужно просто его отправлять таким, каким вам нужно.

И еще заметил только сейчас, в 6 строке зачем вы отправляете обратно значение, которое только что получили?

 

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

6 строку смотрю но ком порте компа я видел что они  не переводятся просто надо переставить 

maksim
Offline
Зарегистрирован: 12.02.2012

Protez1999 пишет:

.... я видел что они  не переводятся просто надо переставить 

кто не переводятся? кого переставить?

Protez1999
Offline
Зарегистрирован: 08.07.2012

значения вал сча не используются 

maksim
Offline
Зарегистрирован: 12.02.2012

Так а не проще их такими сразу отправлять?

val2 = map(val,0,1023,0,15);
val4 = map(val1,0,1023,10,115);

это строки из передающего кода. 

maksim
Offline
Зарегистрирован: 12.02.2012

Передающая:

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);
  }
}

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

там опечатка они обао 0-15 они должны быть независимы друг от друга . счас получается ервая 11-30 вторая 31-50 и потом в приемнике обе к 0-15 

maksim
Offline
Зарегистрирован: 12.02.2012

Эти два байта всегда будут независимы друг от друга, потом просто поменяете в передающем коде

Serial.write(map(val1,11,30,0,15));
Serial.write(map(val2,31,50,0,15));

и все.

Protez1999
Offline
Зарегистрирован: 08.07.2012

понял спасибо попробую. а смысл тогда передавать массивами если можно так?? просто мне говорили что мою задачю тока массивом можно решить 

Protez1999
Offline
Зарегистрирован: 08.07.2012

поменял коды как вы советовали убрал лишнее все нормально . не подскажите что можно сделать с 1 строкой в которой прога висит возможно из-за этого xbee тока в 1 сторону работает

while( Serial.available() == 0);

maksim
Offline
Зарегистрирован: 12.02.2012

Скорее всего из-за этого и не работат потому что пока в буфере 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-ой байт
  }
  
}

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

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);
 
   
   
  }
приемник
С передатчика на приемник все идет нормально а вот в обратную сторону никак, может кто нибудь подскажет в чем дело?? надо прерывать передачу чтоб принять?????

 

Protez1999
Offline
Зарегистрирован: 08.07.2012

у меня получается что данные идут каждые пол секунды в порт.ил это никак не влияяет???

Protez1999
Offline
Зарегистрирован: 08.07.2012

поменял 0 на 1 стали показывать вмест 11-30 115-290 но на мотенциномер нормально реагирует. а блин это теже 11-30(29) тока откудато в конце 5 нарисовалась. Так какаято левая хрень была поубирал. все работает

maksim
Offline
Зарегистрирован: 12.02.2012

Я вас не понимаю, выражайтесь яснее, что и где меняете.... что и где меняется.... 

Protez1999
Offline
Зарегистрирован: 08.07.2012

Просто у меня на экране вместо показаний потенциномера еще была цифра 5 (не 11 а 115 и так далее)после каждого показания но это косяк экрана был я все убрал. меня интересует как организовать двусторонню связь чтоб я мог с приемника отправлять на ередатчик не мешая работе связке передатчик приемник 

maksim
Offline
Зарегистрирован: 12.02.2012

Я думаю XBEE без проблем будет "одновременно" принимать и отправлять данные. Все дело в вашем коде. А сделать это можно по аналогии в принимающий код добавить часть кода передающего, а в передающий добавить часть принимающего.

Protez1999
Offline
Зарегистрирован: 08.07.2012

получается грубо говоря я принял 1 байт вывел в экран передал инфо по xbee потом прочитал второй байт и так далее и с той стороны тоже самое???