Вывод 2х значного числа в сериал порт

Arhilon
Offline
Зарегистрирован: 24.06.2016

Всем здрасте! Сразу к делу. необходимо выводит через serial.print число которое условно по нажатию кнопки увеличивается на 1, но выводить его надо в виде 01 !!!! бьюсь уже неделю, и всё ни как не получается.
Суть такова, что есть несколько датчиков, которые в сеть rs-485 выкидывают нужную мне информацию, а мастер её обрабатывает и ведёт подсчет, и каждые 5сек в сериал выводи информацию сколько сигналов было с датчика. и выглядит так что изначально отображается 00 (первый 0 это сигнал с 1 датчика, второй 0, это соответственно 2 датчик) при появлении сигнала, информация отображается что то типа 01 или 15, в зависимости от количиства сигналов, но мне необходимо чтоб они отображали значения в таком виде 0000, где первые два 0 это 1 датчик, и приёме с него сигнало в сериал должно выходить значение 0100, ну и соответственно если пришло 15 сигналов на 1 датчик и 7 сигналов на второй то должно выглядить как 1507, но всё что я не делала у меня получается 157

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhilon пишет:

бьюсь уже неделю, и всё ни как не получается.

Шишки и синяки (Ваш нынешний код с пояснениями "что не так") в студию!

Arhilon
Offline
Зарегистрирован: 24.06.2016
byte Player1 = 0;
byte Player2 = 0;
const uint8_t     PIN_direction_TX_RX = 10;
long previousMillis = 0;
long interval = 1000;      

void setup() {
  pinMode(PIN_direction_TX_RX,   OUTPUT);
  digitalWrite(PIN_direction_TX_RX, LOW);    
  Serial.begin(9600);
}
void loop() {

  if (Serial.available() > 0)
  {
    char c = Serial.read();

    if (c == 'b')
    {
      Player1++;
    }

    if (c == 'a')
    {
      Player2++;
    }

  }
  if (millis() - previousMillis > interval) {
    previousMillis = millis();
    Serial.print(Player1);
    Serial.println(Player2);
  }
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Давайте подумаем...

Вопрос #1: При каком значении переменной она начинает выводится в два знакоместа, а не в одно?

Arhilon
Offline
Зарегистрирован: 24.06.2016

не совсем понял что имеется в виду, но при значении свыше 9

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ну это просто праздник какой-то сегодня прямо :) 

void printNumber(int num)
{
  if(num < 10)
   Serial.print("0");
  Serial.print(num);
}

void setup()
{
  Serial.begin(9600);
  printNumber(5);
  Serial.println();
  printNumber(25);
}
void loop()
{
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Т.е., иными словами, если значение переменной не выше 9, то перед числом нужно вывести '0'. Так?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, а Вам ведь надо как я понял уже с 1 выводить в два знакоместа (Вы писали  "1 но выводить его надо в виде 01").

Так как Вы это путались сделать? Вы ж неделю бъётесь, так покажите свои попытки.

Arhilon
Offline
Зарегистрирован: 24.06.2016

ЕвгенийП пишет:

Ну, а Вам ведь надо как я понял уже с 1 выводить в два знакоместа (Вы писали  "1 но выводить его надо в виде 01").

Все верно надо выводить сразу 01. попыток было много, но всё делалось в одном скетче и менялось по ходу пьесы

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно. Ну. а раз мы не увидим ошибок, то и исправлять нечего. Вы же здесь не первый день, и знаете. что в этом разделе помогают поправить то, что автор сам делал. Делают за автора в другом разделе.

Arhilon
Offline
Зарегистрирован: 24.06.2016

Так мне не надо чтоб сделали за меня, мне надо чтоб подсказали как сделать чтоб отобразалось 01 и тд. Ну а если Вы принципиальны, то ошибка в том что отображается 1 а не 01

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вы умеете пользоваться printf?

Если умеете, то вот пример как её подключить. В этом примере она. кстати. печатает так, как Вам надо.

//	Эти три строки пишем в начале файла
#include <stdio.h>
static int serial_fputchar(const char ch, FILE *stream) { Serial.write(ch); return ch; }
static FILE *serial_stream = fdevopen(serial_fputchar, NULL);

void setup(void) { 
	stdout = serial_stream; // эта строка первая в setup
	//
	// А ТЕПЕРЬ ТУПО ПОЛЬЗУЕМСЯ printf
	//
	Serial.begin(115200);
	int a = 8;
	// Печатаем a в разных видах
	printf("a=%d, a=%02d, a=%04d, a=%05d, a=%06d\n", a, a, a, a, a);
}

void loop(void){}

 

Arhilon
Offline
Зарегистрирован: 24.06.2016

Спасибо огромное! этим printf никогда не пользовался, сейчас вроде выдаёт как надо, есть только пару уточняющих вопросов, есть ли перенос на новую строку что то типо serial.println??? или это надо прописать ещё одной строкой??? и последний вопрос, процессинг будет это воспринимать также как serial.print??

sadman41
Offline
Зарегистрирован: 19.10.2016

Это жесть. Выбрать самый громоздкий вариант из предложенных - нужно уметь.

Arhilon
Offline
Зарегистрирован: 24.06.2016

sadman41 пишет:

Это жесть. Выбрать самый громоздкий вариант из предложенных - нужно уметь.

 

если подскажите покороче, то цены вам не будет))) я вот сейчас пытаюсь всё это залить на нано и понимаю что мало остаётся)))

sadman41
Offline
Зарегистрирован: 19.10.2016

Т.е. сообщения #5 и #6 вы не читали?

Arhilon
Offline
Зарегистрирован: 24.06.2016

читал, но суть такова что процессинг начинает по другому воспринимать данный вид, 90% нормально выдаёт инфу, но иногда лажает и все  немного криво отображается, а потом при следующем обновлении инфы возвращается в норму, это как бы не критично,  и в добавок будет около 50 датчиков и под каждый прописывать данную конструкцию...)) понимаю что может быть как то можно это укоротить, но я не силён в программировании 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Arhilon пишет:

... и в добавок будет около 50 датчиков и под каждый прописывать данную конструкцию...)) понимаю что может быть как то можно это укоротить, но я не силён в программировании 

Чтобы работать с 50-ю датчиками Вам следует освоить такие инструменты как массивы и циклы. Тогда прописывать любую конструкцию нужно будет один раз в одном месте. Заодно и вероятность ошибки снизится в 50 раз.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Конечно ест.

printf("lala\nNovaya stroka");

А вообще гуглите, примеров по printf полно. Это одна из наиьолее часто используемых фунций в С