Преобразование типа вычитает единицу?

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
C++:
if (Serial.available() > 0) {
      char in_data = Serial.read();
        if(in_data == '1'){
          num = 0;
          for(pin = 10;pin>1;pin--){
            if(digitalRead(pin)==1)
            num = num + pow(2,10-pin);  // num - float  глобальная         
          }
          Serial.print("your Number is: ");
          Serial.println(round(num));// так работает как надо
          // Serial.println((int)num); так не правильно не понимаю почему и просто (num) тоже не правильно
        }
  }
Пины со 2 по 10 используются для задания двоичного числа, где 10 младший бит, 2 старший. (подтягивая их либо к земле либо к плюсу проводочком)
первый раз я использовал int num. и программа выдавала на двоичный код "100" неверное число 3, а должно 4. я вообще ничего не понял и вывел через сриал принт это число. выдало 4.0 то есть все ок., но при переходе с типа float в тип int я терял единицу???
 

Thug Robot

✩✩✩✩✩✩✩
8 Сен 2018
7
2
Serial.println(num) а не Serial.println((num)), и покажи пожалуйста код полностью.
 

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
Serial.println(num) а не Serial.println((num)), и покажи пожалуйста код полностью.
C++:
uint8_t pin;
float num;
void setup() {
  Serial.begin(9600);
  for(pin = 2;pin<=10;pin++)
    pinMode(pin,INPUT); 

}

void loop() {
  if (Serial.available() > 0) {
      char in_data = Serial.read();
        if(in_data == '1'){
          num = 0;
          for(pin = 10;pin>1;pin--){
            if(digitalRead(pin)==1)
            num = num + pow(2,10-pin);           
          }
          Serial.print("your Number is: "); Serial.println(round(num));
        }
  }
}
Serial.println(num) - так и делал, и переменную num представлял как int
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@PaulCocain, Попробуй продебажить, все значения num внутри цикла, при этом выставь точность и/или бинарный формат, и проверь правильны ли все значения.
  • Serial.print(78, BIN) gives "1001110"
  • Serial.println(1.23456, 4) gives "1.2346"
см. https://www.arduino.cc/en/Serial/Print

Могу предположить только, что у тебя на самом деле num хранит не 4.0, а что-то вроде 3.999999, И потому (int)num - вытаскивает целую часть числа, отбрасывая дробную.
 

Thug Robot

✩✩✩✩✩✩✩
8 Сен 2018
7
2
Твоя GND линия идет к земле напрямую или же через 10 кОм резистор?
Я позже проверю твой код на своем Arduino.
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@PaulCocain,
эм.. Я все еще думаю, что это из-за неправильного преобразования типов.
1. Serial.print(num, BIN), а не DEC, заодно debug тоже выведи в двоичном..
2. Правильный у тебя debug? Видимо, нет. Попробуй pow(2.0, 10.0 - pin); т.к. ф-ция pow работает с float числами, а не с int. Плюс к этому http://forum.arduino.cc/index.php?topic=2392.0
 

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
@feniragon, зачем мне выводить в двоичной когда мне надо в десятичной ? если дебаг делать float считает все нормально, то есть выводит 4.0
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
@PaulCocain, еще раз прочти что я написал.
1. В bin ты увидишь реальные значения. Во float все норм потому что округляет.
2. Попробуй изменить числа в ф-ции pow
 
Изменено:

PaulCocain

✩✩✩✩✩✩✩
17 Авг 2018
20
0
Финальный вариант кода, который работает как надо!
C++:
/*Tony Stark BIT - to DEC*/
uint8_t pin;
int num;
void setup() {
  Serial.begin(9600);
  for(pin = 2;pin<=10;pin++)
    pinMode(pin,INPUT); 
}
void loop() {
  if (Serial.available() > 0) {
      char in_data = Serial.read();
        if(in_data == '1'){
          num = 0;
          for(pin = 2;pin<=10;pin++){
            if(digitalRead(pin)==1)             
              num += powInt(2,(10-pin));                 
          }
          Serial.print("your int Number is: ");         
          Serial.println(num);
        }
  }
}
int powInt(int base,int n){
  int p = 1;
  for (int i = 1; i <= n; ++i)
    p = p * base;
  return p;
}
Снимок2.JPG
 

feniragon

✩✩✩✩✩✩✩
31 Июл 2018
87
5
мда.. люди такие люди.. теперь понятно почему помогающих мало