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

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
Добрый вечер)
Чем выражение
C++:
float T =  sensors.getTempCByIndex(0);
которое компилится, отличается от
C++:
float T = sensor.temperature(0);
которое выдает ошибку
expression cannot be used as a function
При этом монитор порта исправно показывает, если переменные направить к нему.
Хочу вывести на часы WS2812B?, в первом случае вывод удался, но сенсор не меняет показания, пробую через другой датчик.
 
Изменено:

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,002
406
Москва
wan-derer.ru
@ASM, А вбиблиотеке есть такой класс (или что там?) - temperature? Может GetTemperature или что-то в этом роде?
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
@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 - хранит высоту в метрах относительно начальной.
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
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, надо как-то убрать нули и будет норм)
вроде было в старых скетчах описание про сдвиг, гляну завтра)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
все, отладил))
только заметил один момент, что считывание температуры происходит в момент подачи питания или перезагрузки.
что можно предпринять, чтобы температура менялась в реальном времени?)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
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 часы вывести с минусом не могу, получается абракадабра)
 

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
C++:
Serial.print("Temp C: ");
if(sensors.getTempCByIndex(0)<0)
   Serial.println(sensors.getTempCByIndex(0)*(-1));
else 
   Serial.println(sensors.getTempCByIndex(0));
 
  • Лойс +1
Реакции: ASM

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
или вообще не показывать отрицательную температуру...
C++:
Serial.print("Temp C: ");
if(sensors.getTempCByIndex(0)>=0)
   Serial.println(sensors.getTempCByIndex(0));
 
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
ок, попробую применить в своем коде)
спасибо)
 

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
как вариант обойти абракадабру....
C++:
Serial.print("Temp C: ");
if(sensors.getTempCByIndex(0)<0)
    {
      // тут твой код зажжёт сегмегнты имитирующие минус
    
      // а эта строка выводит положительное число
      Serial.println(sensors.getTempCByIndex(0)*(-1));
    }
else
   Serial.println(sensors.getTempCByIndex(0));
 
  • Лойс +1
Реакции: ASM

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
int celsius = (sensors.getTempCByIndex(0)*(-1));
отлично работает, теперь надо подумать, как сместить вправо, тогда придется убрать символ Цельсии, и можно будет реализовывать минус)
 

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
int celsius = (sensors.getTempCByIndex(0)*(-1));
отлично работает, теперь надо подумать, как сместить вправо, тогда придется убрать символ Цельсии, и можно будет реализовывать минус)
не забывай проверку делать, а то положительная температура станет отрицательной...
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
вообщем можно задублировать функцию, памяти немного должно занять)
пока поэксперементирую с минусом
 

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
молодец, выкладывай проект... чтоб другим не пришлось изобретать велосипед...)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
еще не допилен, проверки и условий с плюсовой температурой еще нет)
а так проект есть в другой теме, сейчас видео залью, что получилось)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
не забывай проверку делать, а то положительная температура станет отрицательной...
проверку сделал, теперь распознает температуру как отрицательную, так и положительную.
но есть один момент, при отсутствии связи с датчиком, идет показание - 127, соответственно на часах -27.возможно ли организовать проверку чтения датчика, в библиотеке на DS18B20 (OneWire) и (DallasTemperature) что-то ничего внятного не нашел, только к датчику BMP280 (iarduino_Pressure_BMP) как if(sensor.read(1))
по сути хочу организовать, если нет ответа от датчика, высветить ошибку (Error), или просто прочерки.
 
Изменено:

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
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;
  };
};
};
оптимизация хромает, но пока так проще)
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
Похожий код встречал, но что-то он мне не понравился, в примерах он вроде был…
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
Вообщем, начал с шаблона
C++:
//Device 0 Address: 289D2E4592160243
//Device 1 Address: 289D2E4592160243

// подключим необходимые библиотеки
#include <OneWire.h>
#include <Wire.h>
#include <DallasTemperature.h>

// сигнальный провод подключен к 2 пину на Arduino
#define ONE_WIRE_BUS 2

// настроим библиотеку 1-Wire для связи с датчиком
OneWire oneWire(ONE_WIRE_BUS);
// создадим объект для работы с библиотекой DallasTemperature
DallasTemperature sensors(&oneWire);

void setup() {
  // инициализируем работу Serial порта
  Serial.begin(9600);
  sensors.begin();
  //не работают почему-то эти пины
  pinMode(A6, OUTPUT);  //контакт GND уличного термометра
  pinMode(A7, OUTPUT);  //контакт VCC уличного термометра
  digitalWrite(A6, LOW); //подача земли на уличный термометр
  digitalWrite(A7, HIGH);//подача питания на уличный термометр
}

void loop() {
  // отправляем запрос на измерение температуры
  sensors.requestTemperatures();
  if (oneWire.search(ONE_WIRE_BUS)) {
    // покажем температуру в мониторе Serial порта
    Serial.print("Temp C: ");
    if (sensors.getTempCByIndex(0) < 0)
    {
      Serial.println(sensors.getTempCByIndex(0) * (-1));
    }
    else {
      Serial.println(sensors.getTempCByIndex(0));
    }
  }
  else
  {
    Serial.println("Error");
    delay (5000);
  }

}
монитор порта выдает
и еще заметка, не работают пины питания и земли A6 и A7
 

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
попробуй так... если не читал по ссылке, почитай,
там подробно расписан процесс опроса датчика... на всё надо не менее 750мкс

C++:
void loop() {


  if (oneWire.search(ONE_WIRE_BUS)) {
 // отправляем запрос на измерение температуры 
    sensors.requestTemperatures();   
     delay(1000);
    // покажем температуру в мониторе Serial порта
    Serial.print("Temp C: ");
    if (sensors.getTempCByIndex(0) < 0)
    {
      Serial.println(sensors.getTempCByIndex(0) * (-1));
    }
    else {
      Serial.println(sensors.getTempCByIndex(0));
    }
  }
  else
  {
    Serial.println("Error");
    delay (5000);
  }

}
 

Nick_SPb

★✩✩✩✩✩✩
1 Ноя 2018
55
12
с этим проблем нет, у меня выделено 5 секунд, за это время, судя по миганию диода на ардуино, запросы происходят часто
так они у тебя выделены если датчик не найден, после вывода сообщения об ошибке ...
else
{
Serial.println("Error");
delay (5000);

}
 

ASM

★★★★✩✩✩
26 Окт 2018
1,485
292
так они у тебя выделены если датчик не найден, после вывода сообщения об ошибке ...
так тут это не важно, считывание же происходит во время обращения функции к датчику, а на показ температуры отведено 5 сек, за это время происходит несколько опросов, а если по ошибке, то в мониторе забивается все сообщениями об ошибках за эти 5 сек, поэтому и поставил, для примера 5сек