ARDUINO Помогите с кодом

26.10.2018
55
0
6
#1
Добрый вечер)
Чем выражение
C++:
float T =  sensors.getTempCByIndex(0);
которое компилится, отличается от
C++:
float T = sensor.temperature(0);
которое выдает ошибку
expression cannot be used as a function
При этом монитор порта исправно показывает, если переменные направить к нему.
Хочу вывести на часы WS2812B?, в первом случае вывод удался, но сенсор не меняет показания, пробую через другой датчик.
 
Последнее редактирование:
26.10.2018
55
0
6
#3
@Wan-Derer,
обращение к датчику, выводит 28.56
C++:
Serial.println((String)sensor.temperature);
как привести к виду, для вывода на часы
C++:
 String T = sensor.temperature(0);
 convert(T);
Результаты измерений доступны для чтения из переменных: temperature, pressure, altitude, после вызова функции read(). Все переменные имеют тип float.
// temperature - хранит значение текущей температуры в °С, pressure - хранит текущее значение атмосферного давления в мм. рт. ст., altitude - хранит высоту в метрах относительно начальной.
 
26.10.2018
55
0
6
#4
C++:
#include <iarduino_Pressure_BMP.h>   // Подключаем библиотеку для работы с датчиками BMP180 или BMP280
iarduino_Pressure_BMP sensor(0x76);        // Создаём объект sensor для работы с датчиком адрес которого на шине I2C установлен по умолчанию.
#include "FastLED.h"

#define NUM_LEDS 114 // 4*7*4 +2  Количество светодиодов
#define COLOR_ORDER BRG  // Порядок цвета для ленты
#define DATA_PIN 6  // Вывод для данных
#define BRI_PIN 3  // Вывод сенсора

CRGB leds[NUM_LEDS]; // Определение СД ленты
                    // 0,0,0,0
                    // 1,1,1,1
                    //  1 2 3 4 5 6 7 8 9 10111213141516171819202122232425262728
byte digits[12][28] = {{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},  // Digit 0
                       {0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   // Digit 1
                       {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0},   // Digit 2
                       {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1},   // Digit 3
                       {1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,1},   // Digit 4
                       {1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},   // Digit 5
                       {1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},   // Digit 6
                       {0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1},   // Digit 7
                       {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},   // Digit 8
                       {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},   // Digit 9 | Массив числе на 7 сегментах
                       {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},   // Digit *0
                       {0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0}};  // Digit C
// сигнальный провод подключен к 2 пину на Arduino
bool Dot = false;  //состояние точек
int last_digit = 0;
// int ledColor = 0x0000FF; // Используемый цвет (in hex)
long ledColor = CRGB::DarkOrchid; // Используемый цвет (in hex)
//long ledColor = CRGB::MediumVioletRed;
//Случайные цвета
long ColorTable[16] = {
  CRGB::Amethyst,
  CRGB::Aqua,
  CRGB::Blue,
  CRGB::Chartreuse,
  CRGB::DarkGreen,
  CRGB::DarkMagenta,
  CRGB::DarkOrange,
  CRGB::DeepPink,
  CRGB::Fuchsia,
  CRGB::Gold,
  CRGB::GreenYellow,
  CRGB::LightCoral,
  CRGB::Tomato,
  CRGB::Salmon,
  CRGB::Red,
  CRGB::Orchid
};                       
void setup(){
    Serial.begin(9600);
    delay(1000);
    sensor.begin();                  // Инициируем работу с датчиком (начальная высота по умолчанию = 0 метров)
 LEDS.addLeds<WS2812B, DATA_PIN, COLOR_ORDER>(leds, NUM_LEDS); // Выбор типа ленты
 LEDS.setBrightness(55); // Установка яркости
}

// Convert temp to array needet for display
void TempToArray(){
//  tmElements_t tm;
//  RTC.read(tm);

//  if (tm.Second != 27) {
//    TempShow = false;
//    return;
//  }
/*
 if  (time.seconds !=20||time.seconds !=50){
    TempShow = false;
    return;
    }
*/
/*
//  TempShow = true;
//  int t = RTC.temperature();
   int t = sensor.temperature;
//  int celsius = (t / 4.0) * 100;
   int celsius = t;
*/
    int celsius = sensor.temperature;
    
//  Serial.print("Temp is: ");Serial.println(celsius);
//  Serial.println(sensor.temperature);
  Serial.println(celsius);
 
  int cursor = 114; // last led number
    
    leds[57]=0x000000;
    leds[56]=0x000000;
      
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // get last digit in time
    if (i==1){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 86;
      
      for(int k=0; k<=27;k++){
        Serial.print(digits[11][k]);
        if (digits[11][k]== 1){leds[cursor]=ledColor;}
         else if (digits[11][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==2){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

      cursor =58;
      
      for(int k=0; k<=27;k++){
        Serial.print(digits[10][k]);
        if (digits[10][k]== 1){leds[cursor]=ledColor;}
         else if (digits[10][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==3){
      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =28;
      for(int k=0; k<=27;k++){
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==4){
      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0;
      for(int k=0; k<=27;k++){
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  };
};

void loop (){
TempToArray();
FastLED.show();

}
не могу понять, почему на лед идет температура в виде 0026, а не 26'С, при этом отображается 00'C, надо как-то убрать нули и будет норм)
вроде было в старых скетчах описание про сдвиг, гляну завтра)
 
26.10.2018
55
0
6
#5
все, отладил))
только заметил один момент, что считывание температуры происходит в момент подачи питания или перезагрузки.
что можно предпринять, чтобы температура менялась в реальном времени?)
 
26.10.2018
55
0
6
#6
C++:
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

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

void loop(){
// отправляем запрос на измерение температуры
  sensors.requestTemperatures();
// покажем температуру в мониторе Serial порта
  Serial.print("Temp C: ");
  Serial.println(sensors.getTempCByIndex(0));
}
Подскажите, как избавиться от отрицательного значения температуры?)
Подключил датчик на улице, монитор порта работает исправно, но значения температуры отрицательные.
На LED часы вывести с минусом не могу, получается абракадабра)
 
01.11.2018
37
7
8
#8
или вообще не показывать отрицательную температуру...
C++:
Serial.print("Temp C: ");
if(sensors.getTempCByIndex(0)>=0)
   Serial.println(sensors.getTempCByIndex(0));
 
Симпатии: Понравилось ASM
01.11.2018
37
7
8
#10
как вариант обойти абракадабру....
C++:
Serial.print("Temp C: ");
if(sensors.getTempCByIndex(0)<0)
    {
      // тут твой код зажжёт сегмегнты имитирующие минус
    
      // а эта строка выводит положительное число
      Serial.println(sensors.getTempCByIndex(0)*(-1));
    }
else
   Serial.println(sensors.getTempCByIndex(0));
 
Симпатии: Понравилось ASM
26.10.2018
55
0
6
#11
int celsius = (sensors.getTempCByIndex(0)*(-1));
отлично работает, теперь надо подумать, как сместить вправо, тогда придется убрать символ Цельсии, и можно будет реализовывать минус)
 
01.11.2018
37
7
8
#12
int celsius = (sensors.getTempCByIndex(0)*(-1));
отлично работает, теперь надо подумать, как сместить вправо, тогда придется убрать символ Цельсии, и можно будет реализовывать минус)
не забывай проверку делать, а то положительная температура станет отрицательной...
 
26.10.2018
55
0
6
#13
вообщем можно задублировать функцию, памяти немного должно занять)
пока поэксперементирую с минусом
 
01.11.2018
37
7
8
#15
молодец, выкладывай проект... чтоб другим не пришлось изобретать велосипед...)
 
26.10.2018
55
0
6
#16
еще не допилен, проверки и условий с плюсовой температурой еще нет)
а так проект есть в другой теме, сейчас видео залью, что получилось)
 
26.10.2018
55
0
6
#17
не забывай проверку делать, а то положительная температура станет отрицательной...
проверку сделал, теперь распознает температуру как отрицательную, так и положительную.
но есть один момент, при отсутствии связи с датчиком, идет показание - 127, соответственно на часах -27.возможно ли организовать проверку чтения датчика, в библиотеке на DS18B20 (OneWire) и (DallasTemperature) что-то ничего внятного не нашел, только к датчику BMP280 (iarduino_Pressure_BMP) как if(sensor.read(1))
по сути хочу организовать, если нет ответа от датчика, высветить ошибку (Error), или просто прочерки.
 
Последнее редактирование:
26.10.2018
55
0
6
#18
C++:
// Функция вывода температуры
void TempStreetToArray(){
    sensors.begin();
    sensors.requestTemperatures();
    if(sensors.getTempCByIndex(0)<0){
    int celsius = (sensors.getTempCByIndex(0)*(-1));
//  Serial.println(celsius);
 
  int cursor = 114; // last led number
    
    leds[57]=0x000000;
    leds[56]=0x000000;
      
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // get last digit in time
    
    if (i==3){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 86;
      
      for(int k=0; k<=27;k++){
        Serial.print(digits[10][k]);
        if (digits[10][k]== 1){leds[cursor]=ledColor;}
         else if (digits[10][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==1){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

      cursor =58;
      
      for(int k=0; k<=27;k++){
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==2){
      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =28;
      for(int k=0; k<=27;k++){
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==4){
      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0;
      for(int k=0; k<=27;k++){
        Serial.print(digits[12][k]);
        if (digits[12][k]== 1){leds[cursor]=ledColor;}
         else if (digits[12][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  };
}
else
{
    int celsius = (sensors.getTempCByIndex(0));
//  Serial.println(celsius);
 
  int cursor = 114; // last led number
    
    leds[57]=0x000000;
    leds[56]=0x000000;
      
  for(int i=1;i<=4;i++){
    int digit = celsius % 10; // get last digit in time
    
    if (i==3){
      Serial.print("Digit 4 is : ");Serial.print(digit);Serial.print(" ");

      cursor = 86;
      
      for(int k=0; k<=27;k++){
        Serial.print(digits[10][k]);
        if (digits[10][k]== 1){leds[cursor]=ledColor;}
         else if (digits[10][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
    }
    else if (i==1){
      Serial.print("Digit 3 is : ");Serial.print(digit);Serial.print(" ");

      cursor =58;
      
      for(int k=0; k<=27;k++){
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==2){
      Serial.print("Digit 2 is : ");Serial.print(digit);Serial.print(" ");
      cursor =28;
      for(int k=0; k<=27;k++){
        Serial.print(digits[digit][k]);
        if (digits[digit][k]== 1){leds[cursor]=ledColor;}
         else if (digits[digit][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    else if (i==4){
      Serial.print("Digit 1 is : ");Serial.print(digit);Serial.print(" ");
      cursor =0;
      for(int k=0; k<=27;k++){
        Serial.print(digits[13][k]);
        if (digits[13][k]== 1){leds[cursor]=ledColor;}
         else if (digits[13][k]==0){leds[cursor]=0x000000;};
         cursor ++;
        };
      Serial.println();
      }
    celsius /= 10;
  };
};
};
оптимизация хромает, но пока так проще)
 
26.10.2018
55
0
6
#20
Похожий код встречал, но что-то он мне не понравился, в примерах он вроде был…