Ограничения Arduino и как их обойти?

Тема в разделе "Arduino & Shields", создана пользователем ardurino, 17 дек 2017.

  1. DetSimen

    DetSimen Guest

    Дак используй встроенную

    dtostrf(floatvar, StringLengthIncDecimalPoint, numVarsAfterDecimal, charbuf);

    charbuf там какрас типа char *

    Примерчег:
    Код (C++):
    static float f_val = 123.6794;
    static char outstr[15];
    void setup() {
      dtostrf(f_val,7, 3, outstr);
      Serial.begin(9600);
      Serial.println(outstr);
    }
     
    7 общая длина буфера, 3 - кол-во точек после запятой
     
  2. ardurino

    ardurino Нерд

    Вроде все переменные поддались, но одна не хочет.

    Код (C++):
     dtostrf(temperature, 1,outstr);
       t = outstr;
    Ошибку выдаёт

    invalid conversion from 'char*' to 'unsigned char' [-fpermissive]

    Из этой части кода:
    Код (C++):

    byte bufData[9];
    if ( OneWire::crc8(bufData, 8) == bufData[8] ) {  // проверка CRC
        // данные правильные
        temperature=  (float)((int)bufData[0] | (((int)bufData[1]) << 8)) * 0.0625 + 0.03125;

        // вывод измеренной температуры на индикаторы
                   
        // передача температуры на компьютер
       Serial.println(temperature);  
      }
       
     
  3. b707

    b707 Гуру

    Как описаны переменные t и outstr?
    Лучше приведите код целиком или хотябы ту часть где используете эту конструкцию
     
  4. ardurino

    ardurino Нерд

    Выделил в коде нужную часть. Данные с GPS хорошо переводит в Строку. А температуру не хочет.
    Если запустить этот скетч то будет эта самая ошибка.
    Код (C++):
    #include <TinyGPS++.h>
    #include <SoftwareSerial.h>
    #include <OneWire.h>
    #define POWER_MODE  0 // режим питания, 0 - внешнее, 1 - паразитное
    OneWire sensDs (4);  // датчик подключен к выводу 14

    static char outstr[15];
    byte bufData[9];
    float temperature;
    String ltd, lnd,t,s;

    static const int RXPin = 2, TXPin = 3; //GPS
    static const uint32_t GPSBaud = 9600;
    TinyGPSPlus gps;


    // The serial connection to the GPS device
    SoftwareSerial ss(RXPin, TXPin);

    void setup()
    {
     
    Serial.begin(9600);
    }

    void loop()
    {
    sensDs.reset();  // сброс шины
      sensDs.write(0xCC, POWER_MODE); // пропуск ROM
      sensDs.write(0x44, POWER_MODE); // инициализация измерения
      delay(900);  // пауза 0,9 сек
      sensDs.reset();  // сброс шины
      sensDs.write(0xCC, POWER_MODE); // пропуск ROM
      sensDs.write(0xBE, POWER_MODE); // команда чтения памяти датчика
      sensDs.read_bytes(bufData, 9);  // чтение памяти датчика, 9 байтов

      if ( OneWire::crc8(bufData, 8) == bufData[8] ) {  // проверка CRC
        // данные правильные
        temperature=  (float)((int)bufData[0] | (((int)bufData[1]) << 8)) * 0.0625 + 0.03125;
     
        // вывод измеренной температуры на индикаторы
                   
           
        // передача температуры на компьютер
       // Serial.println(temperature);  
      }
       Serial.print(F("Location: "));
      if (gps.location.isValid())
      {
     
      dtostrf(gps.location.lat(),4, 6,outstr);
      ltd = outstr;
      dtostrf(gps.location.lng(),4, 6,outstr);
      lnd = outstr;
    //  ltd = (double2string (gps.location.lat(), 6));
       //lnd = (double2string (gps.location.lng(), 6));
      //  s = "0";
       dtostrf(gps.speed.kmph(),4, 1,outstr);
       s = outstr;    
     
      //tempC = (sensors.getTempCByIndex(0));
    //  Serial.print(tempC);
        dtostrf(temperature, 9,outstr);
       t = outstr;
    //   t = (double2string (temperature, 1));
      //  s = (double2string (gps.speed.kmph(), 0));
       //  Serial.println(s);
        Serial.println(t);
          Serial.println(s);
         Serial.println(ltd);
         Serial.println(lnd);
     
    }
     
  5. ardurino

    ardurino Нерд

    А какой должна быть общая длина буфера ("7")? Почему 7, даже если 1, то ничего не меняется...
     
  6. b707

    b707 Гуру

    У вас во всех остальных вызовах dtostrf 4 параметра, в случае с температурой - три.
     
  7. ardurino

    ardurino Нерд

    Семён Семёныч....
    Спасибо!
     
  8. ardurino

    ardurino Нерд

    Господа, спасибо! Вроде теперь всё отсылается. Убрал из кода этого монстра по переводу double2stirng. И стало хватать Ардуины на обработку данных.