MY-906

BepwyTa
Offline
Зарегистрирован: 04.04.2017

Всем привет! Возникла проблема с применением температуры, переданной датчиком для дальнейших действий (загорания светодиодов и включения реле). Какой нужно выставить оператор в скобках, чтобы он прочел именно нужное значение температуры и я мог его использовать в дальнейшем? Подскажите пожалуйста, хоть вопрос и глупый:(

BepwyTa
Offline
Зарегистрирован: 04.04.2017

https://yadi.sk/i/hLwWW1_J3Jxd8S

фото ошибки в нормальном разрешении

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Не надо нам фото. Скопируй и выложи ошибку текстом. А также скетч, вставленный по правилам.

b707
Offline
Зарегистрирован: 26.05.2017

BepwyTa

когда будешь выкладывать скетч, четко изложи что ты хочешь и в чем проблема, потому как фразы "я хочу, чтобы датчик прочел именно нужное значение температуры" - это смешно и повод для глума. Датчик, который читает только "нужные значения" - никому не нужен

BepwyTa
Offline
Зарегистрирован: 04.04.2017
#include <Wire.h>
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int ledKRASNII = 8;
int ledZELENII = 9;
void setup() {
  Serial.begin(9600);

  Serial.println("Adafruit MLX90614 test");  

  mlx.begin();  
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); 
  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");
  Serial.println();
  delay(5000);
  if (*C > 40)
 digitalWrite(ledKRASNII, HIGH);
else 
 digitalWrite(ledZELENII, HIGH);
}

Ошибка:

C:\Users\kvers\Documents\Arduino\mlxtest\mlxtest.ino: In function 'void loop()':

 
mlxtest:21: error: 'C' was not declared in this scope
 
   if (*C > 40)
 
        ^
 
Несколько библиотек найдено для "Wire.h"
 Используется: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\Wire
Не используется: C:\Users\kvers\Documents\Arduino\libraries\Wire
Не используется: C:\Program Files (x86)\Arduino\libraries\Wire
exit status 1
'C' was not declared in this scope
BepwyTa
Offline
Зарегистрирован: 04.04.2017

не знал, что именно так надо было, сори

 

b707
Offline
Зарегистрирован: 26.05.2017

Там же все написано - см описание ошибки: 'C' was not declared in this scope

Что такое С? переменная? обьект? - программа о нем ничего не знает

Перед использованием переменной в Си ее надо обьявить, например

int C; - если C имеет тип int

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Наша песня хороша начинай сначало. Есть библиотека Adafruit_MLX90614.h. Есть обучающий пример. https://github.com/adafruit/Adafruit-MLX90614-Library/blob/master/examples/mlxtest/mlxtest.ino

И сам демо скетч.

/*************************************************** 
  This is a library example for the MLX90614 Temp Sensor
  Designed specifically to work with the MLX90614 sensors in the
  adafruit shop
  ----> https://www.adafruit.com/products/1748
  ----> https://www.adafruit.com/products/1749
  These sensors use I2C to communicate, 2 pins are required to  
  interface
  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!
  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution
 ****************************************************/

#include <Wire.h>
#include <Adafruit_MLX90614.h>

Adafruit_MLX90614 mlx = Adafruit_MLX90614();

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

  Serial.println("Adafruit MLX90614 test");  

  mlx.begin();  
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); // <--- здесь считывание температуры
  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C"); // <--- а здесь вывод результата
  /* причем результат это mlx.readObjectTempC() ,  а это "*C" просто напечатать единицу измерения.
  */
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF()); 
  Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");

  Serial.println();
  delay(500);
}

 

b707
Offline
Зарегистрирован: 26.05.2017

qwone

О как! :) Оказывается, "*С" - это знак цельсия :) а я думал указатель...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот скетч правильный. ТС может вы сначала на кошках потренируетесь , а потом пойдете серьезые библиотеки изучать.

#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int TempC;// температура
//  светодиоды
const byte Green_pin = 9;
const byte Red_pin = 8;

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test");
  mlx.begin();
  //  светодиоды
  pinMode(Green_pin, OUTPUT);
  pinMode(Red_pin, OUTPUT);
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
  TempC = mlx.readObjectTempC();
  Serial.print("*C\tObject = "); Serial.print(TempC); Serial.println("*C");
  if (TempC > 40) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
  }
  else {
    digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    delay(500);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

BepwyTa

исправить вашу ошибку просто. Но тогда вы ничего не поймете. Вот вам наводящие вопросы:

1. Какой метод библиотеки Adafruit_MLX90614.h используется для снятия показаний с датчика?

2. Какое значение он возвращает и где оно в вашей программе?

Если слова "метод" и "возвращаемое значение" для вас ничего не значат - у вас есть 2 пути:

- закинуть это дело и пойти пить пиво

- засесть за учебники и интернет и выучить язык Си хотя бы в начальном обьеме

BepwyTa
Offline
Зарегистрирован: 04.04.2017

спасибо за продуктивный во всех смыслах ответ

BepwyTa
Offline
Зарегистрирован: 04.04.2017

Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC()); 

  Serial.print("*C\tObject = "); Serial.print(mlx.readObjectTempC()); Serial.println("*C");

  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempF()); 

  Serial.print("*F\tObject = "); Serial.print(mlx.readObjectTempF()); Serial.println("*F");

 

Здесь F тоже "указатель"?

BepwyTa
Offline
Зарегистрирован: 04.04.2017

нормально задаёшь вопрос - нет начинают понтоваться типа иди загугли, спасибо, помогли все

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Serial.println("*F"); Нет, надпись "градус по Фарингейту".

BepwyTa
Offline
Зарегистрирован: 04.04.2017

qwone пишет:

Вот скетч правильный. ТС может вы сначала на кошках потренируетесь , а потом пойдете серьезые библиотеки изучать.

#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int TempC;// температура
//  светодиоды
const byte Green_pin = 9;
const byte Red_pin = 8;

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test");
  mlx.begin();
  //  светодиоды
  pinMode(Green_pin, OUTPUT);
  pinMode(Red_pin, OUTPUT);
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
  TempC = mlx.readObjectTempC();
  Serial.print("*C\tObject = "); Serial.print(TempC); Serial.println("*C");
  if (TempC > 40) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
  }
  else {
    digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    delay(500);
  }
}

 

Большое спасибо, помог скетч! Я не понимал маленькую часть отсюда - где объявлялась переменная вот эта "рид объект ц...", а остальное всё ясно конечно было, благодарю еще раз!

BepwyTa
Offline
Зарегистрирован: 04.04.2017

qwone пишет:

Вот скетч правильный. ТС может вы сначала на кошках потренируетесь , а потом пойдете серьезые библиотеки изучать.

#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
int TempC;// температура
//  светодиоды
const byte Green_pin = 9;
const byte Red_pin = 8;

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test");
  mlx.begin();
  //  светодиоды
  pinMode(Green_pin, OUTPUT);
  pinMode(Red_pin, OUTPUT);
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
  TempC = mlx.readObjectTempC();
  Serial.print("*C\tObject = "); Serial.print(TempC); Serial.println("*C");
  if (TempC > 40) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
  }
  else {
    digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    delay(500);
  }
}

 

думал она уже в библиотеке здесь прописана и я чего-то не знаю, а тут как и везде ее нужно было просто объявить до сетапа

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Ну можно и так 

#include <Wire.h>
#include <Adafruit_MLX90614.h>
Adafruit_MLX90614 mlx = Adafruit_MLX90614();
// int TempC;// температура / можно и перенести вниз
//  светодиоды
const byte Green_pin = 9;
const byte Red_pin = 8;

void setup() {
  Serial.begin(9600);
  Serial.println("Adafruit MLX90614 test");
  mlx.begin();
  //  светодиоды
  pinMode(Green_pin, OUTPUT);
  pinMode(Red_pin, OUTPUT);
}

void loop() {
  Serial.print("Ambient = "); Serial.print(mlx.readAmbientTempC());
  int TempC = mlx.readObjectTempC();// <-----написать так 
  Serial.print("*C\tObject = "); Serial.print(TempC); Serial.println("*C");
  if (TempC > 40) {
    digitalWrite(Green_pin, 0);
    digitalWrite(Red_pin, 1);
  }
  else {
    digitalWrite(Green_pin, 1);
    digitalWrite(Red_pin, 0);
    delay(500);
  }
}