Совместить LN35 и фоторезистор

popUP
Offline
Зарегистрирован: 09.10.2014

Всем ЗДРАВСТВОВАТЬ!

Подскажите, кто понимает, вот с таким случаем: Подключил к Nano два датчика, LN35 и фоторезистор и столкнулся с несколькоми вопросами одновременно :)

1. Померил напряжение на pin +5в на Nano и там оказалось, что при подключении с USB компьютера  - 4,65в, при подключении от другого БП в тот же USB вход Nano - 4.85, при этом 3,3в на Nano в обоих случаях одинаково

2. Но основной вопрос в другом. При расчете температуры с датчика LN35 использую 

analogReference(INTERNAL); // привязка к 1,1 в
reading = analogRead(tempPin);   //// чтение показаний датчика LN35 с пин А0
tempC = reading / 9.31;    
Так точнее показания, почти совпадающие с датчиком DHT 11 на pin A2
НО, при этом  фоторезистор reading = analogRead(photoPin);  (pin А3)  дает что-то несусветное. 
Если убираю analogReference(INTERNAL); и использую формулу для температуры
reading = analogRead(tempPin);
tempC = ( val/1024.0)*5000/10; (менял 5000 на 4650 так как на плате 4,65в)
То показания температуры становятся странными, и очень сильно меняются значения в пределах от 20 до 70 градусов с LN35, зато photoPin  дает отличные и логичные результаты
 
Как привести значения photoPin в условиях analogReference(INTERNAL) к чему-то нормальному?
есть ли в этом случае что-то вроде формулы для показаний температуры? нигде не нашел использование фоторезистора с опорным напряжением , в т.ч. internal, а с математикой туго, и самому посчитать пока никак 
 
Заранее благодарен за ответ на второй вопрос, или ссылку, где можно почитать подробнее
Ну и за ответ на первый вопрос тоже приношу благодарности
 
 
 
popUP
Offline
Зарегистрирован: 09.10.2014

Собрал отдельно на другой плате.

отдельно датчики - просто прелесть 

Вместе ....

popUP
Offline
Зарегистрирован: 09.10.2014

Упростил все до минимума, и все равно не выходит. Ставлю 2 датчика рядом, и начинают прыгать показания LN35,  включаю analogReference(INTERNAL)  и показания LN35 ближе к правде, но все равно прыгают,  зато на фоторезисторе изменения только при хорошем освещении

Как сделать правильно?


#include <Wire.h> 
#include <SPI.h>  //Библиотека (Serial Peripheral Interface), или последовательный периферийный интерфейс
#include <Adafruit_GFX.h>  //Библиотека экрана
#include <Adafruit_SSD1306.h>  //Библиотека экрана

//Определение Экрана
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif


int tempPin  = A1;      // Датчик Температуры LN 35
int photoPin = A2;  // фоторезистор 

int Light; 
float tempC;        //для датчика температуры LN35
int reading;        //для датчика температуры LN35


void setup() {
  Serial.begin(9600); 
 pinMode(photoPin, INPUT);
 pinMode (tempPin, INPUT); 
 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3С (for the 128x64)
  display.display();
  delay(200);
  display.clearDisplay();

 analogReference(INTERNAL); //для расчета Т 

}

void loop() {

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.clearDisplay();

  Light = analogRead(photoPin);       // Чтение фоторезистора
  reading = analogRead(tempPin);      // чтение показаний датчика LN35 
 // tempC = (reading/1024.0)*5000/10;   // для расчета с опорным напряжением по дефолту (5в)
  tempC = reading/9.31;                  // для расчета с опорным напряжением INTERNAL (1.1в)

  display.print("ReadT:");
  display.print(reading);

  display.setCursor(0,22);
  display.print("Temp:"); 
  display.print(tempC);

  display.setCursor(0,47);
  display.print("Light:"); 
  display.print(Light);

  display.display();
  delay(200);
  display.clearDisplay();
}




 

О как, только что заметил, при засветке фоторезистора - начинает нормально читаться температура, перестает прыгать и значения реальные

Где чего добавить?

 

 
 
 
popUP
Offline
Зарегистрирован: 09.10.2014

Ушел к железячникам, раз программно не решается.
http://arduino.ru/forum/apparatnye-voprosy/vyvod-ref-na-nano

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Ну, с точки зрения железячников здесь обсуждать несего, т.к. Вы непривели схему. Вероятно, на схеме просто не хватает конденсаторов, в частности, по питанию и еще можно зашунтировать аналоговые датчики керамическим конденсатором порядка 0.1.

Что касается программы, то имеет смысл что-то делать только тогла, когда все аппариные вопросы решены. Судя по всему, это не так. Но вообще можно посоветовать читать датчик несколько раз, усреднять показания и сделать небольшую задержку между опросами датчиков.

popUP
Offline
Зарегистрирован: 09.10.2014

Спасибо, Andriano.

Схему не привел, она даже для меня простая и по разному представиться не может. я сделал фото в посте по ссылке

http://arduino.ru/forum/apparatnye-voprosy/vyvod-ref-na-nano

Основной вопрос по программированию  все же можно ли использовать analogReference(INTERNAL) и analogReference(DEFAULT) в одном скетче и как это правильно сделать, что  бы один датчик опрашивался с analogReference(INTERNAL) т.е. 1.1в а  другой  использовал analogReference(DEFAULT) 5в

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

popUP пишет:

Спасибо, Andriano.

Схему не привел, она даже для меня простая и по разному представиться не может. я сделал фото в посте по ссылке

А для меня - может. Конденсаторов на фото я так и не обнаружил, поэтому могу повторить свой совет. Точнее оба совета - как аппаратный, так и программный.

Цитата:

Основной вопрос по программированию  все же можно ли использовать analogReference(INTERNAL) и analogReference(DEFAULT) в одном скетче

Никогда так не пробовал, ответа на этот вопрос не знаю. Но не вижу причин, по которым это было бы невозможно.

uragan
Offline
Зарегистрирован: 23.02.2015

После переключения режима с 1,1 вольта, первый замер в топку. Или наоборот.

popUP
Offline
Зарегистрирован: 09.10.2014

Еще раз спасибо, Andriano.

Согласно статье http://easyelectronics.ru/podklyuchenie-mikrokontrollera-likbez.html где я более менее для нубов почитал что такое "шунтировать" я, по вашему совету, могу поставить по керамическому конденсатору 0,1 мкф между + и - каждого датчика, где это возможно (т.е. если он не на собственной плате) ?.  Или между GND и контактом который идет на  Pin  A0 и А1 ? Где именно, ближе к датчику или ко входу Nano?

Uraganу тоже спасибо за отклик. Может подскажете как тогда решить вопрос с использованием разных опорных напряжений или как пересчитать показания с Фоторезистора до адекватных? 

uragan
Offline
Зарегистрирован: 23.02.2015

Поменяли опорное, сделали холостой замер.

popUP
Offline
Зарегистрирован: 09.10.2014

Обьязательно попробую, но для меня это усложнение схемы.  Я соберу, как посоветуете, исключительно для личного понимания как и для чего это нужно, на будущее, где питание будет плавать и двигатели в схеме появятся и прочие помехи. Сейчас в наличии 2 штучки , купить смогу не раньше чем через месяц (найти на это время) так что только на испытания и хватит.

На сегодня решил частный случай так как описал во втором посте - одну ногу фоторезистора воткнул в выход REF, там сразу 1,1 в и изменения его показаний analogRead читает с analogReference(INTERNAL) и вроде все ок, точности хватает. 

Вот ответят во втором посте что это в корне не верно, так быть не может и не должно и завтра все сгорит нафиг,  буду меня в основной схеме, может и пойму наконец как это сделать :).

Но, Вам  - спасибо за участие 

popUP
Offline
Зарегистрирован: 09.10.2014

Uragan спасибо, но можно подробнее? Как сделать "холостой замер"

Вот скетч, пожалуйста, дайте направление что нужно поменять-добавить, чтобы организовать холостой замер и смену analogReference()

правильным образом

Заранее благодарен


#include <Wire.h> 
#include <SPI.h>  //Библиотека (Serial Peripheral Interface), или последовательный периферийный интерфейс
#include <Adafruit_GFX.h>  //Библиотека экрана
#include <Adafruit_SSD1306.h>  //Библиотека экрана

//Определение Экрана
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

int tempPin  = A1;      // Датчик Температуры LN 35
int photoPin = A7;  // фоторезистор подключен 

int Light; 
float tempC;        //для датчика температуры LN35
int reading;        //для датчика температуры LN35

void setup() {
  Serial.begin(9600); 
 pinMode(photoPin, INPUT);
 pinMode (tempPin, INPUT); 
 
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3С (for the 128x64)
  display.display();
  delay(200);
  display.clearDisplay();

}

void loop() {

  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.clearDisplay();
  
  analogReference(INTERNAL); //чтение показаний датчика Т
  reading = analogRead(tempPin);      // чтение показаний датчика LN35 
  //tempC = (reading/1024.0)*5000/10;   // для расчета с опорным напряжением по дефолту (5в)
  tempC = reading/9.31;                  // для расчета с опорным напряжением INTERNAL (1.1в)

  analogReference(DEFAULT);           //чтение фоторезистора
  Light = analogRead(photoPin);       // Чтение фоторезистора

  display.print("ReadT:");
  display.print(reading);

  display.setCursor(0,22);
  display.print("Temp:"); 
  display.print(tempC);

  display.setCursor(0,47);
  display.print("Light:"); 
  display.print(Light);

  display.display();
  delay(200);
  display.clearDisplay();
}




 

popUP
Offline
Зарегистрирован: 09.10.2014

Может кто-нибудь посмотрит что тут неправильно ? http://arduino.ru/forum/apparatnye-voprosy/vyvod-ref-na-nano