Перейти к содержанию
Клуб помидороводов - tomat-pomidor.com

  • записей
    10
  • комментарий
    1
  • просмотров
    1465

О блоге

Мальчишечьи забавы , но для хозяйства полезней что футбол по телевизору:cheesy:

Записи в этом блоге

feniсs

Как оказалось очень актуальный вопрос кто с микропроцессорными делами связан

Я вот до последней поры и не заморачивался этим вопросом , на метровом куске кабеля датчик влажности раза три датчик влажности вывешивал , проблем со сбоями не было

А вот сейчас собрался переделывать метеостанцию  , планирую несколько датчиков влажности и освещенности достаточно далеко отвести , вот и стал вопрос не будет ли линия i2c сбоить

Полез в инет читать , так кроме того что разработчик интерфейса гарантирует стабильную работу на длинах до 2х метров внушающей информации больше нет

Находятся балаболы кто кричит что и метра интерфейс не вытянет , другие заявляют что у кого-то и 20м и 100м без "спецсредств" линия тянет , но таких все норовят в разряд сказочников поставить , как всегда треп есть треп , так что сам не пощупаешь - не узнаешь

----------------------------------------

И так отмотал 10м 4х жильного сигнального кабеля (не витая пара , и не телефонка , и не экран) :

960349940_.thumb.JPG.1b5f80c2d6d0eae71566f3d590255149.JPG такой вот

Далее беру свой незаменимый регистратор данных , вешаю через этот кабель на него GXHT30

В сумме на шине i2c у меня 4 нагрузки висит , три внутрикорпусных (часы , карта и дисплей) ну и плюс на выносном 10м кабеле датчик влажности

Для начала кабель развесил по всей длине вдоль самых злачных мест : компа , сетевых проводов , у драйверов светодиодного освещения

Короче в самых смердящих ЭМ наводками местах , и начал запитывать логгер от разных источников

Начал с импульсного блочка питания самой дешевой схемотехники , прочитал флешку с результатами измерений - лишь 32% замера влажности , температура нормально прошли , все остальное с сбоем

После запитался с usb порта компьютера , тут вообще мрак , лишь 11% показаний прошли , что надо сказать очень удивило , но скорее всего тут причина полного провала кроется что кабель проброшен в прямой близости от источника питания , что повысило уровень помех

Третьим источником энергии стал классический источник питания на обычном 50гц трансформаторе , и тут сразу картина сменилась , 76% показаний прошли , но это все равно для нормальной работы мало

Ну и четвертый тест - это автономный источник питания в самом регистраторе , 18650 элемент и модуль MT3608 (который кстати работает на частоте 1,2мгц) - и вот тут я дождался своих желанных 100% , причем без всякого округления , из 142 замеров не было ни одного сбоя , вот что значит нет емкостной завязки с сетью

Но это все же жесткие испытания были , на практике я напротив буду тянуть кабель на возможно большем расстоянии от источников помех , так что повтор тестов уже с кабелем сложенным в кольца рядом с регистратором

И тут все пошло как по маслу , автономка - 100% , 50гр БП - 100% , USBкомпа - 100% , и лишь дешевый импульсник поднасрал выдав лишь 67% гут :

957431311_2C.thumb.JPG.1ab32c0ca88e62c01d3f020887fac950.JPG

Ну и какие выводы тут можно сделать ?

10м длина кабеля  вполне хорошо пропускает i2c , основной причиной сбоев являются электромагнитный наводки а не емкость кабеля как многие вещают , по крайней мере для длины 10м эти не является проблемой , так что очень возможно что прокатит использование и экранированной сигналки , хотя бы в зоне повышенной смердливости , на улице можно и на обычный кабель перейти

На длинных линиях я давно отказался от импульсников DS1820 давно этому научили , автономное питание это не для сутками работающих схем , так что остается классика

1.thumb.JPG.532eb8c2ded0a0d0a8a9fb6b019f128b.JPG шутка конечно , на порядок мельче хватит для наших дел

feniсs

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

Основная его начинка спрятана в корпусе , а все требуемые в данном случае датчики подсоединяются к внешним разъемам , в теории десятка полтора одновременно датчиков могу подсоединить , но чаще 2-3-4 одновременно требуются

278896011_.thumb.JPG.605ee87bba003705daaa87565991cfec.JPG ну вот к примеру одна из обработок данных логгера в экселе

Это в одну из майских ночей сравнивал температуру на улице и в парнике

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

1.JPG.a2b34a019f2de6540d77ef4876d6eb93.JPG я такой обычно использую на DS3231 и AT24C32

И само собою кошелек , куда складывать информацию будем , то бишь модуль карты памяти :

2.thumb.JPG.876ce2728e4863c4d714d8c9fc3a86b3.JPG  под microSD-карту

Перед началом работ часы снаряжаем элементом 2032 , затем в модуль часов загружаем текущую дату , время , тут пример вам в помощь :

3.thumb.JPG.c2525c987b124ae3bacae8f7e3e46861.JPG

Потом ищем любую свободную microSD-карту минимального объема  , формально модуль до 2гб видит , но у меня и 8ка прекрасно работает , возможно всего на эти 2гб , но нам и несколько мб не исписать вовек

Карту перед работой форматируем  в системе FAT , не важно каком

Ну а дальше простейшая сборка , только чтобы убедится что все фурычит :

1135245163_.thumb.JPG.17cb0df438f84820896f2fc092202f3e.JPG

Живьем это будет так выглядеть :

899861959_.thumb.JPG.d7f91b0904e5f52932a0728e8a71afb8.JPG

Ну и заливаем программу (скетч) :

#include <Time.h> 

#include <Wire.h> 

#include <DS1307RTC.h>// библиотека и под DS3231

#include <SPI.h>// библиотека под SPI протокол

#include <SD.h>// библиотека работы с картой

String s;

File myFile;

void setup()  {

  setSyncProvider(RTC.get);   // функция для того чтобы получить время от RTC

   //pinMode(10, OUTPUT);//якобы надо заявить что SS работает как выход , фигня  , и так все дышит   

  SD.begin(4) ;//Проверяем готовность SD модуля

  // Проверяем, существует ли на карте файл data.csv, если существует, то удаляем его.

  if(SD.exists("data.csv")) {

    //SD.remove("data.csv");//не стал удалять файл , на случай сбоя питания продолжит писать в прежний

  }

}

void loop()

{

  if (timeStatus() == timeSet) {

    digitalClockDisplay();

  }

}

void digitalClockDisplay(){

  // Открываем файл data.csv для записи

  myFile = SD.open("data.csv", FILE_WRITE);//а говорили что WRITE удаляет прежний файл , брехня

  // Если удалось открыть файл для записи, то записываем данные

  if (myFile) {

String ss = String(day())+"-"+String(month())+"-"+String(year());//календарь

myFile.print(ss);

 myFile.print(";");

String s = String(hour())+":"+String(minute())+":"+String(second());//часы

myFile.print(s); 

  myFile.println(";");

   myFile.close();// закрываем файл

  }

   delay (1000);

}

Постарался все лишние сопли для упрощения из кода убрать

Тут разве что стоит обратить внимание на эту строку :

 

//SD.remove("data.csv");

Она переведена у меня в разряд комментариев , если ее активировать , то регистратор при каждой подаче питания будет удалять прежний файл и начинать писать за ново

В принципе у меня так это и работает сейчас в действующем изделии , но при этом всегда есть риск что вы запустили логгер на ночь или вообще на несколько суток , а в какой-то момент будет отключение сети и в этом случае все предыдущие данные пропадут при повторной подачи питания

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

Я у себя сейчас внеся изменения в код на рабочем девайсе вынужден был на флешке такой пустой файл-напоминалку создать :

936077868_.JPG.ac1ef87e2fa39ee7ef5083cc3084421d.JPG:04laugh:

Ладно , пришло время испытать что мы там собрали  , загружаем программу , даем некоторое время сборке поработать , потом на некоторое время обесточиваем схему , а после подключаем вновь , даем чуток поработать и уже окончательно отключаем чтобы извлечь флешку и запустить ее на компе :

864876773_.thumb.JPG.d649832afe45acb8bd9959db511110d4.JPG ну вот что и требовалось получить

Регистратор пишет до момента снятия питания , идет вынужденный простой , а после без удаления старой записи вновь продолжают поступать данные

Но пока собственно у нас никаких данных в карту не пишется окромя даты , времени

Ну теперь для примера добавим какой ни то датчик в схему , к примеру модуль температуры и влажности GXHT30

Ну раз появились датчики , то придется и дисплей вешать для контроля , чтоб знать что пишется в память , так же пустое табло вам напомнит о том что карту памяти вы забыли вернуть в модуль , пока сборка не увидит карты памяти к опросу датчиков она не перейдет

Получается такая сборка :

960367195_.thumb.JPG.fe6205608d78292f7d14d074d3daeed5.JPG

В код программы вносим изменения :

#include <Time.h> 

#include <Wire.h> 

#include <DS1307RTC.h>

#include <SPI.h>

#include <SD.h>

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,20,4);

#include "Adafruit_SHT31.h"// библиотека под эту серию датчиков влажности

Adafruit_SHT31 sht31 = Adafruit_SHT31();

String s;

File myFile;

void setup()  {

  lcd.init();// Инициализация lcd дисплея

  lcd.backlight();// Включение подсветки дисплея

  sht31.begin(0x44);//инициализация датчика GXHT30 44 адресу

  setSyncProvider(RTC.get);   // функция для того чтобы получить время от RTC

   //pinMode(10, OUTPUT);//якобы надо заявить что SS работает как выход , фигня  , и так все дышит   

  SD.begin(4) ;//Проверяем готовность SD модуля

  // Проверяем, существует ли на карте файл data.csv, если существует, то удаляем его.

  if(SD.exists("data.csv")) {

    //SD.remove("data.csv");//не стал удалять файл , на случай сбоя питания продолжит писать в прежний

  }

}

void loop()

{

  if (timeStatus() == timeSet) {

    digitalClockDisplay();

  }

}

void digitalClockDisplay(){

  // Открываем файл data.csv для записи

  myFile = SD.open("data.csv", FILE_WRITE);//а говорили что WRITE удаляет прежний файл , брехня

  // Если удалось открыть файл для записи, то записываем данные

  if (myFile) {

  String ss = String(day())+"-"+String(month())+"-"+String(year());//календарь

  myFile.print(ss);

  myFile.print(";");

  String s = String(hour())+":"+String(minute())+":"+String(second());//часы

  myFile.print(s); 

  myFile.print(";");

  float h = sht31.readHumidity();

  float t = sht31.readTemperature(); 

     lcd.setCursor(0, 0);

     lcd.print("Humidity");

     lcd.setCursor(12, 0);

     lcd.print("        "); //протир 8 знакомест перед выводом значения

     lcd.setCursor(12, 0);         

     lcd.print(h); //вывод значения датчика

     lcd.print("%");

     lcd.setCursor(0, 1);

     lcd.print("Temperature");

     lcd.setCursor(12, 1);

     lcd.print("        "); //протир 8 знакомест перед выводом значения

     lcd.setCursor(12, 1);         

     lcd.print(t); //вывод значения датчика

     lcd.print("c");

  myFile.print(h); 

  myFile.print(";");

  myFile.println(t); 

  myFile.close();// закрываем файл

   }

   delay (2000);//период опроса 2сек.

   }

 Ну все , код исправили , загрузились , тестируем :

37910417_2004.thumb.JPG.04c0946f1e1f3a1b8070204df4ddb471.JPG ну что датчик нормально встал , дает цыфири

Конечно же когда датчиков много подключено , уже лишних надписей не выведешь на экран , значение бы со всех датчиков уместить:cheesy:

Так же в какой-то момент делаем паузу в питании , хотя этот момент что проверять , до этого уже тестили

172697866_.thumb.JPG.a7bb87bb69131843a09d4299687c0319.JPG ну и вот теперь мы получили привязанные ко времени данные влажности и температуру

Пауза на момент обесточивания присутствует

По такому же принципу можно любые требуемые датчики подключить , на сколько фантазии хватит

Опрос самих датчиков сам по себе занимает некое время что стоит учитывать при выставлении задержки delay в последней строке скетча

Но если опрос делать раз в минуту скажем , то уже секунда другая потерянная на опрос всех датчиков будет и не особо заметна

Ну как-то так выходит :hat:

 

 

 

 

feniсs

Казалось бы основа основ в измерениях , а особо не разбежишься в выборе

Ну само-собою DS18B20 , однозначно он доминирует , для защищенных от воздействия влаги местах как правило ставят исполнение ТО92 , ну или SO8 , для улицы , земли или воды ТО92 упакованный в металлическую гильзу , якобы герметический вариант , но на практике и они воду часто начинают пропускать , страхуясь еще пару раз обтягиваю гильзу термоусадкой

Обещанная точность у DS18B20 0,5° , при этом дискретность 1/16°

Наш народ прям не ровно дышит к паразитному питанию (подключению по двум проводам) - никогда не занимался таким крохоборством , экономии на копейку , а падает и длина надежного соединения , хотя тут еще большое дело влияет качество питания всей схемы , для длинных линий вообще лучше отказаться от импульсных блоков питания , у себя только через это смог бесперебойно снимать показания от паука с 15м лапами 

К тому же в последнее время от китайцев идут нормальные чипы , во всем нормальные , только режим двухпроводки они не поддерживают , и таких идет наверно с 90% микросхем, лично мне оно фиолетово , тоскливей было лет 5-7 назад когда пошла от них упрощенка что поддерживала только режим 9 бит

Есть еще микрушка в SO8 корпусе LM75А , первый же минус что на вольные хлеба ее не выставишь , надумаешься как герметизировать , второе это обмен данными через I2C , т.е. далеко от проца не уведешь (хотя это вопрос для меня пока открыт , на днях сам проверять буду , поскольку для меня это актуально с другими датчиками , пока только знаю что 1метр это не проблема и без всякой витой пары , обычной сигнальной многожилкой)

Удивило что по LM75А очень посредственную точность заявляют +/-2° , но тем не менее решил было ее опробовать , да ничего не вышло , один единственный модуль лежал и как выяснилось бракованный , по установленному адресу чип распознается , а данные одни и те же выдает не зависимо от температуры , ну значит и не судьба

Из того что на слуху остаются аналоговые датчики температуры LM335 и LM35 , 335 кристалл выдает температуру в кельвинах из расчета 10мв/1° , а 35 кристалл вещает в градусах цельсия , но только положительные значения , с той же характеристикой 10мв/1°

Первая неприятность - последние несколько лет у китайцев идет сплошной перемеркер , впаривают обычные биполярные транзисторы в ТО92 корпусе , им всей работы лазером новую маркировку нанести LM335 или LM35 , в принципе 335 у меня еще щепотка с хороших времен сохранилась , и есть еще даже отечественные К1019ЕМ1 , да только толку , аналоговое напряжение далеко проблемно тянуть

А основная проблема дискретность измерения аналоговой величины на ардуино , если брать за опорное 3,3в , то 1единица у 10р-АЦП будет ~3,3мв или 0,33° в данных LM335 , для очистки совести все же погонял 335у с ардуиной

1133371978_LM33502.thumb.jpg.cbe772ea099351456d8e5a4728fdbd0f.jpg с плоттера такой график получил , зубья до 1° при опросе 0,2сек , можно конечно брать к примеру среднеарифметическое за 10 измерений скажем и будет относительно сносно , но ради чего столько мытарств

При том еще что в тесте датчик стоял у проца рядом , а отведи его на несколько метров ... , там вообще ужас будет

Короче так и остается одна DS18B20

Вариант первый :

Подключение DS18B20 без запроса адреса прописки , на один цифровой вход такое делать чревато , стоит одному датчику не отозваться при опросе и весь ряд сместится на одну позицию , так что для меня главный принцип , если нет адресации , то 1 вход - 1 датчик

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

У меня например такая система в бане стоит , там три термометра , бак с водой , температура у пола и у головы , в моечное отделение только через стекло дисплей торчит , было уже раз что в баке термометр потек , быстро поменял его и все , снимать процессорный блок , вынимать ардуинку и тащить ее домой на перепошивку не пришлось

Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

DS18B20 3шт.

R 4,7ком 3шт.

Схема подключения :

1586251197_318202004(2).thumb.JPG.8d518441ba5615540ebd413587a4c042.JPG

1825213469_318202004.thumb.JPG.cad1925c8e647a17f9e92b9df5e8a60b.JPG макет в сборе , очень так единодушно датчики показания выдают , правда все три были из одной партии

Программа (скетч) :

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,20,4);

#include <OneWire.h>                          // Библиотека для работы с шиной  1-Wire

#include <DallasTemperature.h>                // Библиотека для работы с датчиками

OneWire T1(4);                                // Задаем пин для датчика 1 на шину 1-Wire с именем Т1

OneWire T2(5);                                // Задаем пин для датчика 2 на шину 1-Wire с именем Т2

OneWire T3(6);                                // Задаем пин для датчика 3 на шину 1-Wire с именем Т3

DallasTemperature sensors1(&T1);              // Датчик 1 на шине Т1

DallasTemperature sensors2(&T2);              // Датчик 2 на шине Т2

DallasTemperature sensors3(&T3);              // Датчик 3 на шине Т3

void setup() {

  lcd.init();// Инициализация lcd дисплея

  lcd.backlight();// Включение подсветки дисплея

  sensors1.begin();                           // Инициализируем датчик 1 

  sensors2.begin();                           // Инициализируем датчик 2

  sensors3.begin();                           // Инициализируем датчик 3

  }

void loop() {

     sensors1.requestTemperatures();           // Запрашиваем регистрацию температуры на датчике 1

     sensors2.requestTemperatures();           // Запрашиваем регистрацию температуры на датчике 2

     sensors3.requestTemperatures();           // Запрашиваем регистрацию температуры на датчике 3

     float temp1 = sensors1.getTempCByIndex(0);  // Снимаем показания с датчика 1

     float temp2 = sensors2.getTempCByIndex(0);  // Снимаем показания с датчика 2

     float temp3 = sensors3.getTempCByIndex(0);  // Снимаем показания с датчика 3

 lcd.setCursor(0, 0);

 lcd.print("TEPMOMETP 1");

 lcd.setCursor(12, 0);

 lcd.print("        "); //протир 8 знакомест перед выводом значения

 lcd.setCursor(12, 0);         

 lcd.print(temp1); //вывод значения датчика

 lcd.print("c");

 lcd.setCursor(0, 1);

 lcd.print("TEPMOMETP 2");

 lcd.setCursor(12, 1);

 lcd.print("        "); //протир 8 знакомест перед выводом значения

 lcd.setCursor(12, 1);         

 lcd.print(temp2); //вывод значения датчика

 lcd.print("c");

 lcd.setCursor(0, 2);

 lcd.print("TEPMOMETP 3");

 lcd.setCursor(12, 2);

 lcd.print("        "); //протир 8 знакомест перед выводом значения

 lcd.setCursor(12, 2);         

 lcd.print(temp3); //вывод значения датчика

 lcd.print("c");    

     delay(1000);                              // Делаем замеры раз в секунду                           

  } 

Вариант второй :

Теперь подключим те же три датчика , но предварительно проверим у них паспорта с пропиской , теперь их можно вешать на один общий вход

Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

DS18B20 3шт.

R 4,7ком 1шт.

Схема подключения :

1363625928_318202004.thumb.JPG.8b667b935ac89b737c6e6e9fe0908aa1.JPG

Программа (скетч) :

#include <Wire.h> 

#include <OneWire.h>

#include <DallasTemperature.h>

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);

OneWire oneWire(5);//все датчики на D5

DallasTemperature ds(&oneWire);

DeviceAddress sensor1 = {0x28, 0x27, 0x1D, 0x43, 0xD4, 0xE1, 0x3C, 0xFE };//адреса конкретных датчиков

DeviceAddress sensor2 = {0x28, 0xA8, 0x3F, 0x43, 0xD4, 0xE1, 0x3C, 0x4B };

DeviceAddress sensor3 = {0x28, 0x60, 0x43, 0x43, 0xD4, 0xE1, 0x3C, 0x39};

void setup()  {

ds.begin();

lcd.init();

  }

void loop()

{

ds.requestTemperatures(); // считываем температуру с датчиков 

lcd.setCursor(0,0);

lcd.print("TEPMOMETP 1");

lcd.setCursor(12,0);

lcd.print("        ");//8 знакомест затир

lcd.setCursor(12,0);

lcd.print(ds.getTempC(sensor1));//вывод температуры 1 датчика

lcd.print("c");

lcd.setCursor(0,1);

lcd.print("TEPMOMETP 2");

lcd.setCursor(12,1);

lcd.print("        ");

lcd.setCursor(12,1);

lcd.print(ds.getTempC(sensor2));

lcd.print("c");

lcd.setCursor(0,2);

lcd.print("TEPMOMETP 3");

lcd.setCursor(12,2);

lcd.print("        ");

lcd.setCursor(12,2);

lcd.print(ds.getTempC(sensor3));

lcd.print("c");

delay (1000);

  }

 В среде разработке Arduino IDE есть в примерах программка для считывания адреса у 1820х

804794308_.thumb.jpg.65d2d66f2ee2d343023044b7f0c0e47c.jpg как в паспортном столе за шоколадку выведаете адреса работников вносим их в скетч

Ну и напоследок мне все же захотелось хоть какую-то компанию DS18B20 найти , пошел по подселенцам , нашел парочку :

в модуле давления BMP180 и в датчике влажности GXHT30

Вариант третий :

Он чисто соревновательный , или будем считать что работников выгнали нормы ГТО сдавать:cheesy:

 Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

DS18B20 1шт.

R 4,7ком 1шт.

BMP180

GXHT30

Схема подключения :

526975034_3182018030.thumb.JPG.e0bc8baed1483a046854438e82cda5f7.JPG

Пара скриншотов с выходными данными :

1099337871_1.thumb.JPG.a3c24b49de067667c8966d357773dcfe.JPG

1509994055_2.thumb.JPG.113cf574db1b5c1f116988cff6e6ed4f.JPG

Опять же очень близко ложатся данные

Программа (скетч) :

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,20,4);

#include <OneWire.h>                         

#include <DallasTemperature.h>               

OneWire T1(5);                               

DallasTemperature sensors1(&T1);  

#include <BMP085.h>//библиотека для работы модуля BMP180

BMP085 dps = BMP085();

long Temperature = 0, Pressure = 0,Altitude = 0;

#include "Adafruit_SHT31.h"// библиотека под эту серию датчиков влажности

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {

  Wire.begin();

dps.init(); 

  lcd.init();// Инициализация lcd дисплея

  lcd.backlight();// Включение подсветки дисплея

  sensors1.begin();                           // Инициализируем датчик 1 

sht31.begin(0x44);//инициализация датчика GXHT30 44 адресу

  }

void loop() {

     sensors1.requestTemperatures();           // Запрашиваем регистрацию температуры на датчике 1

    float temp1 = sensors1.getTempCByIndex(0);  // Снимаем показания с датчика 1

     lcd.setCursor(0, 0);

     lcd.print("DS18B20  T1");

     lcd.setCursor(12, 0);

     lcd.print("        "); //протир 8 знакомест перед выводом значения

     lcd.setCursor(12, 0);         

     lcd.print(temp1); //вывод значения датчика

     lcd.print("c");

 

     dps.getTemperature(&Temperature);

  float t=Temperature;

     lcd.setCursor(0, 1);

     lcd.print("BMP180   T2");

     lcd.setCursor(12, 1);

     lcd.print("        "); //протир 8 знакомест перед выводом значения

     lcd.setCursor(12, 1);         

     lcd.print(t/10); //вывод значения датчика

     lcd.print("c");

 

  float T3 = sht31.readTemperature();

     lcd.setCursor(0, 2);

     lcd.print("GXHT30   T3");

     lcd.setCursor(12, 2);

     lcd.print("        "); //протир 8 знакомест перед выводом значения

     lcd.setCursor(12, 2);        

     lcd.print(T3);    

     lcd.print("c");   

     delay(1000);                                                      

  } 

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

   

feniсs

Актуальная , на слуху сейчас тема , соответственно и разных датчиков хватат

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

Два аналоговых - GUVA-S12SD  и  ML8511

Да один цифровой - VEML6070

Сразу на начальном этапе отмел аналоговый ML8511

Без облучения чем либо на его выходе 0,9-0,95в , дал засветку УФ , напряжение поднялось ближе к полутора вольтам , все бы это можно было еще пережить , на когда датчик прореагировал и на синий свет , и на белый , пусть и послабее чем на УФ , но на мат сорвался в голос когда УФ-датчик и красный цвет увидел , после такого дисквалифицировал его пожизненно

А вот другой аналоговый GUVA-S12SD - молодец , впрочем я это уже и раньше знал , летом часто с нам в сад выбегал в поисках УФ активности

Так и не подловил ни одной УФ аномалии , все жестко повязано на видимую солнечную освещенность , УФ компонента жестко привязана к ней

Самое интересное что датчик до безобразия прост - уф-фотодиод и оу для раскачки сигнала

Осталось сказать о цифровике VEML6070 , мозгов понавертели в нем ого-го , а по делу тоже туфта , так же путает свою шерсть с государственной , так же все вплоть до красного цвета видит любвиобильный мой:sad:

Но все же оспавил его для сравнения с GUVA-S12SD , чтоб не устраивать безальтернативных выборов:04laugh:

И так

Вариант первый :

Комплектация :

Arduino nano

HD44780 1602 + модуль посл.интерфейса

VEML6070

GUVA-S12SD

Схема подключения :

887251000_1602607012.thumb.JPG.82e2cf61461600309c73417a8aada9ec.JPG

Программа (скетч) :

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,16,2);

 #include <Wire.h>

#include "Adafruit_VEML6070.h"

Adafruit_VEML6070 uv = Adafruit_VEML6070();

int AUF;

void setup() {

analogReference(EXTERNAL);        // включаем внешний источник опорного напряжения

uv.begin(VEML6070_1_T); //варианты времени интеграции :  _HALF_T       _1_T        _2_T      _4_T( 62мс , 125мс , 250мс , 500мс)

}

void loop() {

lcd.init();// Инициализация lcd дисплея

  lcd.backlight();// Включение подсветки дисплея

  AUF = analogRead(A0);        // получаем значение с аналогового входа A0

  lcd.setCursor(0, 1);           

  lcd.print("VA-S12SD");

  lcd.setCursor(10, 1);           

 lcd.print("    ");// 4 знака затир

 lcd.setCursor(10,1);           

 lcd.print(AUF);

 lcd.setCursor(0, 0);           

lcd.print("VEML6070");

 lcd.setCursor(10, 0);           

lcd.print("      ");// 6 знаков затир

 lcd.setCursor(10, 0);           

 lcd.print(uv.readUV());

     delay(300);

}

1392194280_2365.thumb.JPG.b9594bdcbb4ccbfbadaf282cf97f7fe3.JPG УФ светодиод 365нм оба датчика видят , один меряет в попугаях , другой в мартышках , но не суть , есть некие условные единицы , на практике важно больше/меньше , что было вчера , что сегодня

1771251043_2.thumb.JPG.3317357b201fcddd51d742328f2d8b0c.JPG синий цвет , GUVA-S12SD по нулям , а VEML6070 продолжает хавать и синий

386993332_2.thumb.JPG.521bf87d6eab125cc6bd95482b48a301.JPG белый холодный светодиод  , VEML6070 заметно умерил пыль , но все равно считает его

651239271_2620.thumb.JPG.dcf3bd34341945536e59f63722999ab1.JPG ну и наконец красный , а VEML6070 так и не уймется , что у вас ? веревочка ?, давайте и веревочку

Вот и куда такой тащить на улицу , он весь солнечный спектр в одну кошелку сметет:cheesy:

Разве что дома для каких экспериментов использовать , когда знаешь что работаешь только с УФ составляющей

Посему я все же оставил ему право на жизнь , только индикатор взял попроще , тут 4х знаков хватит за глаза

Вариант второй :

Комплектация :

Arduino nano

TM1637

VEML6070

Схема подключения :

269689651_16376070.thumb.JPG.ba050f92391901121f52f133b057c1e6.JPG

1704672996_60701637.thumb.JPG.bfe4d828b6af31427e4cd05db0ebbdf4.JPG тестдрайв

Программа(скетч) :

#include <TM1637.h>// библиотека для подключение модуля  семисегментного инд. TM1637

TM1637 tm1637(3,2);

#include <Wire.h>

#include "Adafruit_VEML6070.h"

Adafruit_VEML6070 uv = Adafruit_VEML6070();

void setup() {

tm1637.init();// инициализация библиотеки «TM1637.h»

tm1637.set(4);//установка яркости , указанная константа равна 4 , диапазон установки 0-7

 uv.begin(VEML6070_1_T); //варианты времени интеграции :  _HALF_T       _1_T        _2_T      _4_T

//( 62мс , 125мс , 250мс , 500мс)

}

void loop() {

int UF=uv.readUV();

tm1637.display(UF);

     delay(500);

 

}

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

Ну и коль пошла такая пьянка , то грех обижать добра молодца GUVA-S12SD

Вариант третий :

Комплектация :

Arduino nano

TM1637

GUVA-S12SD

Схема подключения :

1247989648_163712.thumb.JPG.5eb8e354f57e710e7bdc8e0f0f3e02f7.JPG

1240174481_1637.thumb.JPG.1304bcf133f3c4c1b830162788eb6d24.JPG тестдрайв

Программа(скетч) :

#include <TM1637.h>// библиотека для подключение модуля  семисегментного инд. TM1637

TM1637 tm1637(3,2);

#include <Wire.h>

void setup() {

analogReference(EXTERNAL);        // включаем внешний источник опорного напряжения

tm1637.init();// инициализация библиотеки «TM1637.h»

tm1637.set(4);//установка яркости , указанная константа равна 4 , диапазон установки 0-7

}

void loop() {

int AUF = analogRead(A0);        // получаем значение с аналогового входа A0

tm1637.display(AUF );

     delay(500);

}

Все три варианта рабочие , да только на солнце не больно индикаторы разглядишь , особенно светодиодные , и даже синий цвет не спасет

А для аналогового датчика и вообще ардуинка нафиг не нужна , запитал его 3,6-5в да подключил к нему 100мка в качестве вольтметра ограничив ток резистором

1046313189_.thumb.JPG.c2ffa05aaf8f1c62e71715b2d5919d22.JPG я он  с такой порнографией летом пробегал :04laugh:, ну и заводской люксометр еще брал чтобы привязывать УФ уровень к освещенности

Напругу кроны енкой 5в ограничил , головку под одновольтовый вольтметр заточил , выше 1в показаний и не было

 

feniсs

RGB датчик цвета на TCS3472


Arduino

Есть несколько модулей распознавания цвета , изначально их предназначение определять цвет предмета вблизи датчика

Датчик подсвечивает белыми светодиодами исследуемый объект , а отраженный от него свет уже обрабатывает фотоматрица , которая состоит из красного, зеленого, синего и прозрачного фотодиода

Вся матрица закрыты ИК-фильтром, которая минимизирует влияние ИК-излучения на показания

Лет 8 назад игрался с подобной игрушкой , но на другом модуле (TCS3200) , но сейчас он уже антикваром можно сказать стал и цена на него неадекватно выросла , так что для новых игр возьмем датчик посвежее - TCS3472

Чтоб игрушка оказалась повеселей добавил в нее еще люксметр , в принципе и с 3472 матрицы можно затребовать данные об освещенности , но там эта функция как-то в кривых попугаях дает ответ:sad:

Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

TCS3472

BH1750

Схема подключения :

TCS3472.thumb.JPG.f28307b5db9edbe7afa665be182207ab.JPG

Светодиоды с модуля TCS3472 выкидываются , нас не цвет детских кубиков интересует , интересно в упрощенном виде , через пропорции RGB , определять спектр источника света

Программа (скетч) :

#include <Wire.h>

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,20,4);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

#include "Adafruit_TCS34725.h"//библиотека датчика цвета

// Инициализация модуля с установками времени интеграции и усиления

Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_4X);//усиление 1,4,16,60 время 24,50,101,154

#include <BH1750FVI.h>//библиотека датчика освещенности

BH1750FVI Oko;

void setup()

{

lcd.init();// Инициализация lcd дисплея

lcd.backlight();// Включение подсветки дисплея 

tcs.begin();

Oko.begin();

Oko.SetAddress(Device_Address_L);

Oko.SetMode(Continuous_L_resolution_Mode);

}

void loop()

{

    uint16_t r, g, b, c, colorTemp, lux;//можно оставить только первых три параметра

    // Получение данных о цвете с модуля

    tcs.getRawData(&r, &g, &b, &c);// "с" уровень белого- банально сумма RGB

    //colorTemp = tcs.calculateColorTemperature(r, g, b);// Расчет температуры цвета-полная туфтень

    //lux = tcs.calculateLux(r, g, b);//уровень освещенности - не освещенность как таковая , а пропорциональная величина в зависимость от усиления и экспозиции

float s=r+g+b;

float rr=(r/s);//доля красного

float gg=(g/s);//доля зеленого

float bb=(b/s);//доля синего

uint16_t X = Oko.GetLightIntensity();//опрос датчика BH1750

     lcd.setCursor(0, 0);

     lcd.print("Kanal-R");

     lcd.setCursor(8, 0);           

     lcd.print("   "); //3 знакоместа затир

     lcd.setCursor(8, 0);           

     lcd.print(rr*100,0);lcd.print("%");

     lcd.setCursor(14, 0);           

     lcd.print("     "); //5 знакомест затир

     lcd.setCursor(14, 0);           

     lcd.print(r);

    

     lcd.setCursor(0, 1);

     lcd.print("Kanal-G");

     lcd.setCursor(8, 1);           

     lcd.print("   "); //3 знакоместа затир

     lcd.setCursor(8, 1);

     lcd.print(gg*100,0);lcd.print("%");

     lcd.setCursor(14, 1);           

     lcd.print("     "); //5 знакомест затир

     lcd.setCursor(14, 1);           

     lcd.print(g);

    

     lcd.setCursor(0, 2);

     lcd.print("Kanal-B");

     lcd.setCursor(8, 2);           

     lcd.print("   "); //3 знакоместа затир

     lcd.setCursor(8, 2); 

     lcd.print(bb*100,0);lcd.print("%");

     lcd.setCursor(14, 2);           

     lcd.print("     "); //5 знакомест затир

     lcd.setCursor(14, 2);           

     lcd.print(b);

 

 

 

     lcd.setCursor(0, 3);

     lcd.print("Light");

     lcd.setCursor(8, 3);           

     lcd.print("        "); //8 знакомест затир

     lcd.setCursor(8, 3);           

     lcd.print(X);lcd.print("Lux"); 

   

    delay(1000);

}

Датчик много чего нам вещает , но я беру в расчет лишь уровень сигнала по цветам R G B , в наличии в матрице "белого" фотодиода я что-то усомнился , значение С у них практически равно R+G+B , ну не будет на практике такого , за освещенность , вернее ее уровень они среднеарифметическое R G B выдают

А с тепловой температурой - это вообще цирк с конями , нам такого не надоть

Погонял датчик в разных режимах , по времени интегрирования выставляются значения 24 , 50 , 101 , 154 мсек. , заявлялся еще режим 700мсек. , но компилятор его отвергает , возможно он просто в библиотеке не прописан

По усилению допустимые параметры 1 , 4 , 16 , 60 - все проходят

Цифры , что выдает датчик по цветовым каналам не совсем попугайные сумма R+G+B в самом деле пропорциональна реальной освещенности , но только при источниках света близкого к белому

Для самого тупого режима (24мс 1х) примерная освещенность =(R+G+B)*3,4 , а для самого чувствительного (154мс 60х) осв.=(R+G+B)*0,009

Но это ориентировочные цифры , возможно где в документации они прописаны точно

1148743194_-3472.thumb.JPG.403191eb7374ba5a5dfb897c1b6e0676.JPG

Вот сборка на макете под холодным освещением в комнате , синий , зеленый по 40% , красному лишь 20% остается

608596465_4372.thumb.JPG.bae63d559718376c3aca886cfd75a1d9.JPG а это уже под теплым светодиодом при выключенном общем свете , здесь картина сменилась , на красный приходится 50% , синему лишь 20% осталось

2054034676_4372.thumb.JPG.7dd022f7f02e01f35baa701b64b7da3e.JPG а вот полноспектральный диод , зеленый канал подавлен , всего 13% , красный , синий примерно поровну
По моноцветам уберу картинки под спойлер :

Спойлер

 

1273338771_4372365.thumb.JPG.912be68b4a669832be5358d2eeaa5c6a.JPG УФ 365нм , в основном пробивается в синий канал

1090039792_4372.thumb.JPG.8068c5e8eeffe6791e9efd40560ad74f.JPG фиолетовый , оба датчика более чем на порядок встрепенулись относительно УФ

505285334_4372.thumb.JPG.a4ca0a87ee46cedccfd6953805692ed1.JPG Синий , синий канал прям взбесился , зеленому хорошо перепадает , а красный практически закрыт

Да и люксметр его не жалует

978624764_4372.thumb.JPG.0533ca86a9dd8e4f8e7220105017f9e3.JPG зеленый , всем сестрам по серьгам (окромя красной падчерицы ) , особенно люксметр захлебывается от счастья

449095250_4372.thumb.JPG.5a0cbf2ce87004095ea421fb32484669.JPG  желтый , люксметр чуток подостыл , красный балдеет , зато синий начинает сосать лапу

906527030_4372620.thumb.JPG.7624388194a8f3a9df60058160f5bdff.JPG красный 620-630нм , красный все на себя взял , другим крохи

998403484_4372660.thumb.JPG.b77692db52e693be311663806c05b10e.JPG красный 660нм , вроде по смыслу еще сильней должен отсечь зеленый , синий , но тут обратная тенденция просматривается , похоже из-за близости излучения к ИК , там у фотодатчиков какой-то психоз случается (физику процесса не знаю), не зря они его основательно от ИК фильрами защищают

220223312_4372730.thumb.JPG.79662a0fe0d1b981c4b5fc703607e57e.JPG и ближний ИК 730нм , люксметр почти заткнулся , а зеленый , синий потекли

11.thumb.JPG.39192bb5bb84eb89411a9d8516abc8d2.JPG чуть ближе поднес диод к 4372 матрице , и защита пала , все три канала взбесились , на люксметр можно не смотреть , на него свет не попадает

 

 

feniсs

Обратил внимание на датчик освещенности VEML7700 из-за обещанного более высокого предела измерений , заявляется около 120кЛюкс

Пару лет назад немного поигрался с ним   и забросил , помню что в одних вариантах включения он на 40кЛюкс затыкался , на других доходил до 65кЛюкс и дальше ни ногой , сейчас вот повторно решил с ним поработать

Вариант первый :

Даю на откуп все мозгам датчика , он в этом режиме на автомате сам определяет для себя и время интегрирования , и усиление , я только итог :01mail:

Комплектация :

Arduino nano

HD44780 1602 + модуль посл.интерфейса

VEML7700

Схема подключения :

1.thumb.JPG.5541a44772b59064dca86d0db7a8db46.JPG

Сборка на макете :

4.thumb.JPG.40cfdc34d56a3dbe3e3b24a6fcf2fea3.JPG

Ну и программа(скетч) :

#include <Wire.h>//библиотека под I2C

#include <LiquidCrystal_I2C.h>//библиотека под LCD

#include "Adafruit_VEML7700.h"//библиотека датчика освещенности

Adafruit_VEML7700 veml = Adafruit_VEML7700();

LiquidCrystal_I2C lcd(0x27,16,2);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

byte X8[8]   = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"

byte X15[8]  = {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00001,}; // Буква "Щ"

byte X16[8]  = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"

void setup() {

lcd.init();// Инициализация lcd дисплея

 lcd.backlight();// Включение подсветки дисплея

veml.begin();

}

void loop()

{

   lcd.createChar(1,X8); //1 синтезированный знак (Л)

 lcd.createChar(2,X15); //2 синтезированный знак (Щ)

 lcd.createChar(3,X16); //3 синтезированный знак (Ь)

 lcd.setCursor(2, 0);

 lcd.print("OCBE\2EHHOCT\3"); //ОСВЕЩЕННОСТЬ

lcd.setCursor(4, 1);

lcd.print("          ");//затир перед выводом новых значений

lcd.setCursor(4, 1);

lcd.print(veml.readLux(),0);//вывод показаний на экран

lcd.print("\1k");//Лк

    delay(1000);

}

Прежде чем перейти к другой сборке приведу тут выдержку из статьи с буржуйского сайта , под спойлер убрал длинно больно , но уж больно подробное досье на этого парня:good2:

 

Спойлер

 

Датчики внешней освещенности VEML7700 и VEML6030

Сенсорная платформа veml7700 позволяет использовать датчики внешней освещенности Vishay VEML7700 и VEML6030 совместно с ESPHome. Связь с устройством осуществляется по протоколу I2C, который должен присутствовать в вашей конфигурации. VEML7700 и VEML6030 в основном одинаковы, но в разных комплектациях. VEML7700 использует фиксированный адрес 0x10, в то время как меньший по размеру VEML6030 может быть настроен на использование либо 0x10, либо 0x48.

Датчик VEML в пользовательском интерфейсе Home Assistant.

Датчик представляет собой высокоточный цифровой датчик освещенности с разрешением 16 бит и динамическим диапазоном от 0 до 120 000 люкс. Широкий диапазон измерений обеспечивается четырьмя настраиваемыми уровнями усиления и шестью различными вариантами времени интегрирования. Более высокие значения усиления обычно используются в условиях низкой освещенности.

Датчик оснащен двумя фотодиодами с различными спектральными характеристиками, представленными двумя каналами: ALS-каналом и БЕЛЫМ каналом. ALS, или канал рассеянного света, очень точно повторяет так называемую кривую человеческого глаза. БЕЛЫЙ канал охватывает гораздо более широкую длину волны/спектр, улавливая довольно много излучения в ближнем инфракрасном диапазоне.

5.thumb.JPG.b392392419c0d5bb584d91bef2b616fd.JPG

Спектральная характеристика каналов ALS и WHITE

Рекомендуется использовать режим автоматического измерения этого компонента; в этом режиме соответствующий коэффициент усиления и время интегрирования автоматически выбираются компонентом после проведения нескольких измерений. Для этого используется процедура, рекомендованная производителем.

Если вы хотите управлять этими параметрами вручную, пожалуйста, обратите внимание, что:

 в большинстве случаев следует использовать уровни усиления 1/8 и 1/4.

 Уровни усиления 1 и 2 предназначены только для использования в условиях низкой освещенности < 100 люкс. При очень высокой освещенности он показывает высокую нелинейность.

 В диапазоне от 0 до 1000 люкс измерения датчика строго линейны для коэффициента усиления 1/4 и 1/8, после 1000 люкс он показывает нелинейность.

Для получения более точных показаний при ярком освещении используется формула компенсации яркости. Однако при очень ярком прямом солнечном свете она дает довольно высокую погрешность (вместо 100-120 килолюкс она может давать более 150-200 К).

Режим автоматического измерения

В режиме автоматического измерения компонент запускается с коэффициентом усиления 1/8 и 100 мс (по умолчанию).

 Если освещенность превышает 46 лк (100 отсчетов), это постепенно сокращает время интеграции для получения хороших показаний (лучше всего в диапазоне от 100 до 10 000 отсчетов).

 В случае низкой освещенности (менее 46 лк) он пытается постепенно увеличить коэффициент усиления и только затем увеличивает время интегрирования.

Пожалуйста, обратите внимание, что в условиях низкой освещенности процесс измерения может занять несколько секунд из-за длительной экспозиции и перенастройки датчика.

Начальные значения можно изменить, установив параметры gain и integration_time. Сначала, по возможности, корректируется значение усиления.

Компенсация яркости

Компенсация яркости выполняется в соответствии с рекомендациями производителя, однако ее можно отключить, установив значение lux_compensation: false в конфигурации вашего устройства.

количество люксов × разрешение (время, коэффициент усиления)

luxcomp

6,0135e × 10-13 × lux4 - 9,3924e × 10-9 × lux3

+8,1488e × 10-5 × люкс2 + 1,0023 × люкс

Где:

подсчитывает

показания датчиков, подсчитывает

разрешение

- разрешение датчика при заданном времени интегрирования и коэффициенте усиления, лк/

количество рассчитанных люксов освещенности, лк

освещенности - компенсацией luxcomp, лк

6.thumb.JPG.230fca34006b1c51ed37114815e915a4.JPG

Доступные данные

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

 ambient_light: Значение освещенности для канала ALS, представляющего человеческий глаз, лк

 full_spectrum: Значение освещенности для БЕЛОГО канала с широким спектром, лк

 infrared: Расчетное значение освещенности (БЕЛЫЙ минус ALS), представляющее ближний инфракрасный спектр, лк

 ambient_light_counts: Необработанные 16-битные данные из канала ALS, учитываются

 full_spectrum_counts: Необработанные 16-битные данные из БЕЛОГО канала, учитываются

 actual_gain: Фактическое значение усиления, используемое для сообщаемых значений, множитель

 actual_integration_time: Фактическое время интегрирования, используемое для сообщаемых значений, мс

Переменные конфигурации:

 auto_mode (необязательно, логическое значение): Автоматический выбор времени усиления и интеграции. Значение по умолчанию равно True.

 integration_time (необязательно, время): Время, в течение которого датчик находится в открытом состоянии. Допустимые значения: 25 мс, 50 мс, 100 мс (по умолчанию), 200 мс, 400 мс, 800 мс. В автоматическом режиме устанавливается начальное значение.

 коэффициент усиления (необязательно, строка): коэффициент усиления, который устройство будет использовать для внутреннего АЦП. Допустимые значения - 1/8 (по умолчанию), 1/4, 1x, 2x. Более высокие значения лучше использовать в условиях низкой освещенности. В автоматическом режиме устанавливается начальное значение усиления.

 lux_compensation (необязательно, логическое значение): Используется формула компенсации яркости, указанная производителем. Значение по умолчанию равно True.

 glass_attenuation_factor (необязательно): Коэффициент затухания стекла, если оно находится за стеклянной или пластиковой панелью. Значение по умолчанию 1.0 означает коэффициент пропускания 100%. 2 означает коэффициент пропускания 50% и т.д.

 update_interval (необязательно, время): интервал для проверки датчиков. По умолчанию используется значение 60 секунд.

 Все остальные опции для устройств I2C описаны в разделе I2C

Датчики

Вы можете настроить все или любое подмножество датчиков, описанных ранее. О каждом сконфигурированном датчике сообщается отдельно в каждом update_interval. Поддерживаются все параметры из Sensor.

Однако, если вам не нужны какие-либо другие параметры, вы можете просто использовать сокращения, подобные этому: ambient_light: Окружающий свет.

 ambient_light (необязательно): Освещенность для видимого света (канал ALS), lx.

 full_spectrum (опционально): Освещенность датчика полного спектра (БЕЛЫЙ канал), лк.

 инфракрасный (опционально): Расчетная освещенность для ближнего ИК-диапазона (БЕЛЫЙ минус ALS), лк.

 ambient_light_counts (необязательно): Учитываются показания для видимого света (канал ALS).

 full_spectrum_counts (необязательно): Учитываются показания датчика полного спектра (БЕЛЫЙ канал).

actual_gain (необязательно): значение усиления, используемое для сообщаемых значений. Особенно полезно, если выбран “auto_mode”.

actual_integration_time (необязательно): время интеграции, используемое для сообщаемых значений, мс. Особенно полезно, когда выбран “auto_mode”.

https://esphome.io/components/sensor/veml7700.html

 

Мда , разобрался раз через раз , но главное :

Датчик оснащен двумя фотодиодами с различными спектральными характеристиками, представленными двумя каналами: ALS-каналом и БЕЛЫМ каналом. ALS, или канал рассеянного света, очень точно повторяет так называемую кривую человеческого глаза. БЕЛЫЙ канал охватывает гораздо более широкую длину волны/спектр, улавливая довольно много излучения в ближнем инфракрасном диапазоне.

Рекомендуется использовать режим автоматического измерения этого компонента; в этом режиме соответствующий коэффициент усиления и время интегрирования автоматически выбираются компонентом после проведения нескольких измерений. Для этого используется процедура, рекомендованная производителем.

Если вы хотите управлять этими параметрами вручную, пожалуйста, обратите внимание, что:

 в большинстве случаев следует использовать уровни усиления 1/8 и 1/4.

 Уровни усиления 1 и 2 предназначены только для использования в условиях низкой освещенности < 100 люкс. При очень высокой освещенности он показывает высокую нелинейность.

 В диапазоне от 0 до 1000 люкс измерения датчика строго линейны для коэффициента усиления 1/4 и 1/8, после 1000 люкс он показывает нелинейность.

Для получения более точных показаний при ярком освещении используется формула компенсации яркости. Однако при очень ярком прямом солнечном свете она дает довольно высокую погрешность (вместо 100-120 килолюкс она может давать более 150-200 К).

Вариант второй :

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

ALS, (канал рассеянного света, очень точно повторяет так называемую кривую человеческого глаза)

БЕЛЫЙ канал (охватывает гораздо более широкую длину волны/спектр, улавливая довольно много излучения в ближнем инфракрасном диапазоне.)

Комплектация :

Arduino nano

HD44780 2004 + модуль посл.интерфейса

VEML7700

Схема подключения :

2.thumb.JPG.d7a78073fa0824011ddfd366c3ed8853.JPG

Сборка на макете :

3.thumb.JPG.cf1780ff4d885d7714fb808962ec1103.JPG

Программа(скетч) :

#include <Wire.h>//библиотека под I2C

#include <LiquidCrystal_I2C.h>//библиотека под LCD

#include "Adafruit_VEML7700.h"//библиотека датчика освещенности

Adafruit_VEML7700 veml = Adafruit_VEML7700();

LiquidCrystal_I2C lcd(0x27,20,4);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

void setup() {

lcd.init();// Инициализация lcd дисплея

 lcd.backlight();// Включение подсветки дисплея

  veml.begin();

  // Можно установить коэффициент усиления и время интеграции, отличные от значения по умолчанию

  veml.setGain(VEML7700_GAIN_1_8);// _1     _2      _1_4     _1_8  усиление

  veml.setIntegrationTime(VEML7700_IT_25MS);//25,50,100,200,400,800   время интегрирования

}

void loop() {

lcd.setCursor(0, 0);

 lcd.print("ALS");

lcd.setCursor(0, 1);

 lcd.print("White");

lcd.setCursor(0, 2);

 lcd.print("Lux");

lcd.setCursor(6, 0);

lcd.print("     ");

lcd.setCursor(6, 0);

lcd.print(veml.readALS());

lcd.setCursor(6, 1);

lcd.print("     ");

lcd.setCursor(6, 1);

lcd.print(veml.readWhite());

lcd.setCursor(6, 2);

lcd.print("         ");

lcd.setCursor(6, 2);

lcd.print(veml.readLux());

  delay(1000);

}

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

А напоследок я решил поиграться разноцветными светодиодиками , поглядеть как на них реагируют оба канала , и что после обработки выплюнет люксметр :

1644714132_7700-390-400.thumb.JPG.16d0fe915c576bc7da3e887ad21dfbfd.JPG УФ диод 390-400нм , а производитель говорил что "белый" канал лишь в сторону ИК расширен:cheesy:

1343878423_7700-.thumb.JPG.2713e25ae2351807d87a85f6234e3f95.JPG синий диод ALS канал его больше выделяет

1133109097_7700-.thumb.JPG.f204dfd9cc5e60a803e09912747e5607.JPG зеленый диод ALS канал так же его лучше принимает

1584348676_7700-.thumb.JPG.3885b45a35246b74f3d5f4ca8283536f.JPG красный , его уже больше "белый" канал любит

784874087_7700-.thumb.JPG.ba04bc65bb709f277e820e64235fd3c1.JPG ИК диод 850нм , "белый" канал прям тащится от него , но в расчет освещенности мало что попадает

Как же мудрено они считают:1203:

 

 

feniсs

Вариант первый :

Вывод данных с одного датчика освещенности на жидкокристаллический индикатор

К сожалению данный тип датчиков имеет верхний предел в 54,612клюкс , что как минимум в два раза ниже потолка освещенности в яркий солнечный день

Приходится хитрить , помещать датчик в корпус из материала с ограниченной прозрачностью и вводить поправочный коэффициент в расчетах

Комплектация :

Arduino nano

HD44780 1602 + модуль посл.интерфейса

BH1750

Схема подключения :

8.thumb.JPG.b4594416d4a4106b885020d515927811.JPG

Так выглядит в работе :

1.thumb.JPG.4e53f3a23375c92c4227c18bce0b69dc.JPG

Программа (скетч) :

#include <Wire.h>//библиотека под I2C

#include <BH1750FVI.h>//библиотека датчика освещенности

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,16,2);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

BH1750FVI Oko;

byte X8[8]   = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"

byte X15[8]  = {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00001,}; // Буква "Щ"

byte X16[8]  = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"

byte X18[8]  = {B10010,B10101,B10101,B11101,B10101,B10101,B10010,B00000,}; // Буква "Ю"

void setup() {

 lcd.init();// Инициализация lcd дисплея

 lcd.backlight();// Включение подсветки дисплея

 Oko.begin();

 Oko.SetAddress(Device_Address_L);

 Oko.SetMode(Continuous_L_resolution_Mode);

}

void loop() {

 lcd.createChar(1,X8); //1 синтезированный знак (Л)

 lcd.createChar(2,X15); //2 синтезированный знак (Щ)

 lcd.createChar(3,X16); //3 синтезированный знак (Ь)

 lcd.createChar(4,X18); //4 синтезированный знак (Ю)

 uint16_t X = Oko.GetLightIntensity();//опрос датчика

 lcd.setCursor(2, 0);

 lcd.print("OCBE\2EHHOCT\3"); //ОСВЕЩЕННОСТЬ

 lcd.setCursor(3, 1);

 lcd.print("\1\4KC"); //ЛЮКС

 lcd.setCursor(9, 1);

 lcd.print("     "); //протир 5 знакомест перед выводом значения

 lcd.setCursor(9, 1);         

 lcd.print(X); //вывод значения датчика

  delay(500);//0,5сек. Период обращения к датчику

}

Вариант второй :

Довольно таки часто возникает необходимость использовать не текущие данные освещенности , а усредненные

При домашних измерениях могут мешать пульсации от ламп , при контроле за освещенностью на улице солнце иной раз так в прятки начнет играть что не определишься притенять или нет те или иные посадки или рассаду

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

Для этого варианта и комплектация , и сборка та же , только прошивка будет другая

Комплектация :

Arduino nano

HD44780 1602 + модуль посл.интерфейса

BH1750

Схема подключения :

8.thumb.JPG.b4594416d4a4106b885020d515927811.JPG

Так выглядит в работе :

3.thumb.JPG.6744eba3b7c4e46e711275bfce555089.JPG первый цикл среднее значение не высвечивается , пока массив данных на набьется полностью показаниями , чтобы не вводить нас в заблуждение заниженными цифрами

4.thumb.JPG.48e1b523fdc55e7ffdaf801c77504965.JPG после уже постоянно будут высвечиваться оба параметра , и текущие , и усредненные

Программа (скетч) :

#include <Wire.h>//библиотека под I2C

#include <BH1750FVI.h>//библиотека датчика освещенности

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,16,2);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

BH1750FVI Oko;

const int Razmer = 500;//размерность массива

unsigned int massiv[Razmer];  // массив для хранения текущих значений

int Nomer = 0;          // индекс последнего значения

float Summa = 0;              // сумма значений

unsigned int Seredina = 0;            // скользящее среднее

int FL = 0;//флаг на вывон на индикацию среднего значения

byte X3[8]   = {B01111,B00101,B00101,B01001,B10001,B11111,B10001,B00000,}; // Буква "Д"

byte X8[8]   = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"

byte X10[8]   = {B10001,B10001,B10001,B01010,B00100,B01000,B10000,B00000,}; // Буква "У"

byte X15[8]= {B10101,B10101,B10101,B10101,B10101,B10101,B11111,B00001,}; // Буква "Щ"

void setup() {

   Serial.begin(9600);// серийный порт поставил для вывода на плоттер , так удобней выбрать подходящий размер массива

 lcd.init();// Инициализация lcd дисплея

 lcd.backlight();// Включение подсветки дисплея

 Oko.begin();

 Oko.SetAddress(Device_Address_L);

 Oko.SetMode(Continuous_L_resolution_Mode);

    for (int a = 0; a < Razmer; a++) {//зануляем массив

    massiv[a] = 0;

  }

}

void loop() {

   lcd.createChar(1,X3);

   lcd.createChar(2,X8);

   lcd.createChar(3,X10);

   lcd.createChar(4,X15);

   lcd.setCursor(0, 0);

   lcd.print("TEK\3\4EE \2k");//ТЕКУЩЕЕ Лк

   lcd.setCursor(0, 1);

   lcd.print("CPE\1HEE \2k");//СРЕДНЕЕ Лк 

  Summa = Summa - massiv[Nomer];// вычитанем последнее значение из суммы

  massiv[Nomer] = Oko.GetLightIntensity(); // считываем значение           

  lcd.setCursor(11, 0);

  lcd.print("     "); //протир 5 знакомест перед выводом текущего значения

  lcd.setCursor(11, 0);         

  lcd.print(massiv[Nomer]); //вывод текущего значения на экран

    Serial.print(massiv[Nomer]);//дублирование в порт

    Serial.print(" ");//пробел он и есть пробел

  Summa = Summa + massiv[Nomer];// добавляем значение к сумме

  Nomer = Nomer + 1;// переставляем индекс на следующую позицию

  if (Nomer >= Razmer) {// проверяем если мы выскочили индексом за пределы массива

    Nomer = 0;// если да, то индекс на ноль

  }

  Seredina = Summa / Razmer;// считаем среднее:

  Serial.println(Seredina);//среднее значение в порт

  Serial.print(" ");

  if (Nomer == Razmer-1) {

   FL=1 ;//выставляем флаг при первом полном заполнении массива

   }

 if (FL==1) {

  lcd.setCursor(11, 1);

  lcd.print("     "); //протир 5 знакомест перед выводом значения

  lcd.setCursor(11, 1);         

  lcd.print(Seredina); //теперь среднее значение реально и его можно выводить на экран

  }

  delay(7200);  // задержка перед следующим измерением 7,2сек цикл 1час при размерности массива 500

}

 В программе есть два значимых параметра , размерность массива и период обращения к датчику

Произведение этих параметров и есть время за которое вычисляется среднее значение освещенности

С теми значениями что у меня выставлены в скетче это 1 час , большее время брать не имеет смысл , даже его наверно будет лишку

Я сейчас о использовании люксметра на улице , скорее всего 10-15 минут будет практичнее

Размерность массива у меня тут выставлена 500 , много большие значения ставить не прокатит , памяти ардуинки не хватит

6.thumb.JPG.40772536aa825bcbe4679f782a3b938e.JPG но усреднение по 500_м замерам более чем достаточно

Вот картинка теста с плоттера , синие это текущие , красное усредненное , достаточно вполне определиться какая погода преимущественно , солнечно или пасмурно

Так что если надо уменьшить время усреднения размерность массива лучше не трогать , а изменить период обращения к датчику

Для 1 часа этот период у меня выставлен 7,2сек , для 10мин. ставим 1,2сек , для 20мин. 2,4сек и т.д.

А вот для домашних нужд я ставил размерность массива 20-25 и время очередности датчика в пределах 0,1сек

5.thumb.JPG.a1caf506d5487419e37c43272a0aa60c.JPG тут подобная картинка на плоттере выскакивает , на ровном плато где я руками не махал , видно что показания не стабильны пилой али синусоидой дрожат (следствие работы ламп) по этому участку среднее значение (красная линия) прямеханька по середине прет

А острые броски текущих плавно повторяет без зубов , только чуть притормаживая

Конечно это тоже все просто приборчик посмотрелка , на практике , чтоб от него больше пользы было , надо выводить с него команды на исполнительное устройство , будь то зуммер , шторки закрывания рассады или система орошения какая к примеру

Перешагнуло среднее значение некий выставленный порог - выдается команда на исполнительный механизм , самое простое это конечно зуммер , а исполнительный механизм это я:04laugh:

Вариант третий :

Повторяет первый вариант , только с той разницей что тут подключено два датчика освещенности , меняя уровень на пятой ноге (все же есть от пятой ноги польза:cheesy:) можно подключить эти датчики по разным адресам

 Комплектация :

Arduino nano

HD44780 1602 + модуль посл.интерфейса

BH1750 - два модуля

Схема включения :

9.thumb.JPG.f52a1a23e1b0b875b24ac9ce6427ee13.JPG

Так выглядит в работе :

2.thumb.JPG.59ec402f31cbe55de1bf61b31399659f.JPG

Программа (скетч) :

#include <Wire.h>//библиотека под I2C

#include <BH1750FVI.h>//библиотека датчика освещенности

#include <LiquidCrystal_I2C.h>//библиотека под LCD

LiquidCrystal_I2C lcd(0x27,16,2);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

BH1750FVI Oko1;

BH1750FVI Oko2;

byte X8[8]   = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"

byte X13[8]  = {B10001,B10001,B10001,B01111,B00001,B00001,B00001,B00000,}; // Буква "Ч"

void setup() {

 lcd.init();// Инициализация lcd дисплея

 lcd.backlight();// Включение подсветки дисплея

Oko1.begin();

Oko1.SetAddress(Device_Address_H);

Oko1.SetMode(Continuous_H_resolution_Mode);

 Oko2.begin();

 Oko2.SetAddress(Device_Address_L);

 Oko2.SetMode(Continuous_L_resolution_Mode);

}

void loop() {

 lcd.createChar(1,X8); //1 синтезированный знак (Л)

 lcd.createChar(2,X13); //2 синтезированный знак (Ч)

 

 uint16_t X1 = Oko1.GetLightIntensity();//опрос первого датчика

 uint16_t X2 = Oko2.GetLightIntensity();

 lcd.setCursor(0, 0);

 lcd.print("TO\2KA 1 \1k"); //ТОЧКА 1 Лк

 lcd.setCursor(11, 0);

 lcd.print("     "); //протир 5 знакомест перед выводом значения

 lcd.setCursor(11, 0);         

lcd.print(X1); //вывод значения первого датчика

lcd.setCursor(0, 1);

lcd.print("TO\2KA 2 \1k");

lcd.setCursor(11, 1);

 lcd.print("     ");

 lcd.setCursor(11, 1);     

  lcd.print(X2);

  delay(500);

}

На этом пока все , следраз помучаю датчик освещенности VEML7700 , получше разберемся что он может
 

feniсs

Влажность воздуха что при выращивании рассады , что летом в теплице , да и нам самим , в нашей среде обитания однозначно значимый параметр

Как правило ничего мы кардинально поменять не имеем возможности , так хоть быть в курсе ситуации уже если не хлеб , то сухарики:cheesy:

За последние 10-15 лет , как китайцы начали нас баловать своими творениями , много каких изделий от них перепробовал , но единственный датчик что устроил меня от и до это GXHT30 , в этой серии есть и другие варианты , но самый распространенный и весьма не дорогой именно он

Вариант первый :

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

Этот датчик выдает значение и влажности , и температуры с дискретностью до сотых долей  , такая скрупулезность не всегда и нужна , но всегда можно программно ограничить вывод данных до десятых долей , а то и до целых чисел

Комплектация :

Arduino nano

HD44780 1602 + модуль посл.интерфейса

GXHT30

Схема подключения :

1.thumb.JPG.81d3f0987925c0faf860672f1bc5c66b.JPG

Программа (скетч) :

#include <LiquidCrystal_I2C.h>//библиотека под LCD

#include <Wire.h>//библиотека под шину I2C

#include "Adafruit_SHT31.h"// библиотека под эту серию датчиков влажности

LiquidCrystal_I2C lcd(0x27,16,2);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

Adafruit_SHT31 sht31 = Adafruit_SHT31();

void setup() {

  lcd.init();// Инициализация lcd дисплея

  lcd.backlight();// Включение подсветки дисплея

  sht31.begin(0x44);//инициализация датчика GXHT30 44 адресу

  }

void loop() {

  float h = sht31.readHumidity();

  float t = sht31.readTemperature();   

     lcd.setCursor(2, 0);           

     lcd.print(h);

     lcd.setCursor(7, 0);           

     lcd.print("%"); 

     lcd.setCursor(7, 1);        

     lcd.print(t,1);//0 или 1 после запятой выводит на экран целое значение или с десятыми долями 

     lcd.setCursor(11, 1);       

     lcd.print("C");   

  delay(1000);//период опроса 1сек.

}

Это я показал ленивый вариант программы , в работе это будет выглядеть так :

2.thumb.JPG.768fad3fa4a136202c274e7a19bf5a1e.JPG специально показал что можно выводить данные и с одним , и с двумя знаками после запятой

Но как видим место на экране еще завались , ничего полезного нам больше вывести нечего , так что можно забить пустое место шлаком , создать так сказать красоту:cheesy:

В сборке ничего не меняем , только перепишем программу :

#include <LiquidCrystal_I2C.h>//библиотека под LCD

#include <Wire.h>//библиотека под шину I2C

#include "Adafruit_SHT31.h"// библиотека под эту серию датчиков влажности

LiquidCrystal_I2C lcd(0x27,16,2);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

Adafruit_SHT31 sht31 = Adafruit_SHT31();

byte X4[8]  = {B10101,B10101,B10101,B11111,B10101,B10101,B10101,B00000,}; // Буква "Ж"

byte X8[8]   = {B00011,B00111,B00101,B00101,B01101,B01001,B11001,B00000,}; // Буква "Л"

byte X9[8]   = {B11111,B10001,B10001,B10001,B10001,B10001,B10001,B00000,}; // Буква "П"

byte X10[8]   = {B10001,B10001,B10001,B01010,B00100,B01000,B10000,B00000,}; // Буква "У"

byte X16[8]  = {B10000,B10000,B10000,B11110,B10001,B10001,B11110,B00000,}; // Буква "Ь"

void setup() {

  lcd.init();// Инициализация lcd дисплея

  lcd.backlight();// Включение подсветки дисплея

  sht31.begin(0x44);//инициализация датчика GXHT30 44 адресу

  }

void loop() {

     lcd.createChar(1,X4);

   lcd.createChar(2,X8);

   lcd.createChar(3,X9);

   lcd.createChar(4,X10);

   lcd.createChar(5,X16);

  float h = sht31.readHumidity();

  float t = sht31.readTemperature();

     lcd.setCursor(0, 0);

     lcd.print("B\2A\1HOCT\5");   

     lcd.setCursor(12, 0);           

     lcd.print(h,0);//0 или 1 после запятой выводит на экран целое значение или с десятыми долями  

     lcd.setCursor(14, 0);           

     lcd.print("%"); 

     lcd.setCursor(0, 1);       

     lcd.print("TEM\3EPAT\4PA");  

     lcd.setCursor(12, 1);        

     lcd.print(t,0);//0 или 1 после запятой выводит на экран целое значение или с десятыми долями 

     lcd.setCursor(14, 1);       

     lcd.print("C");   

  delay(1000);//период опроса 1сек.

}

Ну вот теперь совсем другой вид:hat: , хотя информации ни на грош больше не стало :

3.thumb.JPG.67ba68c5131ebd2bb2724050c9abad12.JPG

Ну и , опять же для примера , убрал дробные части значений

Да заодно показал в коде как можно вывести на экран русские буквы , а то табло умеет только на латинице материться

Вариант второй :

Вывод на LCD дисплей данных с двух таких датчиков , к сожалению только с двух , чип что в датчике влажности стоит умеет лишь по двум адресам по шине I2C на связь выходить(44 и 45) , адрес переключается подачей разного уровня на вторую ногу чипа , но злые китайцы почти никогда не разводят эту ногу на плате , тупо сажают ее на массу

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

Комплектация :

Arduino nano

HD44780 1602 + модуль посл.интерфейса

GXHT30 - 2 штуки , но один из них с доступом к заветной второй ноге чипа

Схема подключения :

4.thumb.JPG.8b58ab86cba55d7c0ced13e96b4e91bd.JPG

Программа (скетч) :

#include <LiquidCrystal_I2C.h>//библиотека под LCD

#include <Wire.h>//библиотека под шину I2C

#include "Adafruit_SHT31.h"// библиотека под эту серию датчиков влажности

LiquidCrystal_I2C lcd(0x27,16,2);//прописываем свой LCD дисплей по адресу 27 или 3F и его знакоместам

Adafruit_SHT31 W1 = Adafruit_SHT31();

Adafruit_SHT31 W2 = Adafruit_SHT31();

void setup() {

  lcd.init();// Инициализация lcd дисплея

  lcd.backlight();// Включение подсветки дисплея

  W1.begin(0x44);//инициализация датчика GXHT30 44 адресу

  W2.begin(0x45);//инициализация датчика GXHT30 45 адресу

  }

void loop() {

  float h1 = W1.readHumidity();//первый датчик , запрос влажности

  float t1 = W1.readTemperature();//первый датчик , запрос температуры   

     lcd.setCursor(1, 0);            

     lcd.print(h1);

     lcd.setCursor(6, 0);           

     lcd.print("%"); 

     lcd.setCursor(1, 1);        

     lcd.print(t1);

     lcd.setCursor(6, 1);       

     lcd.print("C");   

  float h2 = W2.readHumidity();//второй датчик , запрос влажности

  float t2 = W2.readTemperature();//второй датчик , запрос температуры

     lcd.setCursor(9, 0);           

     lcd.print(h2);

     lcd.setCursor(14, 0);           

     lcd.print("%"); 

     lcd.setCursor(9, 1);        

     lcd.print(t2);

     lcd.setCursor(14, 1);       

     lcd.print("C");   

  delay(1000);//период опроса 1сек.

}

В работе это выглядит так :

5.thumb.JPG.f5fd637b5bb484c6a1dc3e823a590198.JPG тут уже нет место для надписей на заборе , только все по существу:01mail:

Кстати приятно порадовала что разбежка с показаниях крайне не существенна

Вариант третий :

Вывод значений влажности воздуха на четырехразрядный светодиодный индикатор

Подчас ведь не надо ничего лишнего , только одно сначение и все

Комплектация :

Arduino nano

TM1637

GXHT30

Схема подключения :

6.thumb.JPG.a4bc219899e74dc711be4ac1821b3ce5.JPG

Не совсем тот модуль TM1637 на схеме изображен , должен быть вариант на котором нет двоеточия , а только одни запятые стоят , дело в том что в модулях с двоеточием запятые стоят бутафорские , они не участвуют в работе

Можно и такой модуль конечно ставить , но разделительного знака у нас не будет

Нужный индикатор выглядит так :

7.thumb.JPG.c89d64bc4bf90504bf4d124ffdb08240.JPG на нем нет посередине двоеточия как в часовом варианте

Ну и скетч под светодиодный вариант :

#include <TM1637.h>// библиотека для подключение модуля  семисегментного инд. TM1637

#include "Adafruit_SHT31.h"// библиотека под эту серию датчиков влажности

#include <Wire.h>//библиотека для работы интерфейсом I2C

Adafruit_SHT31 sht31 = Adafruit_SHT31();

TM1637 tm1637(3,2);

void setup() {

Wire.begin(); 

tm1637.init();// инициализация библиотеки «TM1637.h»

tm1637.init(D4056A);//установка на работу второго дисплея с дробными числами

tm1637.set(4);//установка яркости , указанная константа равна 4 , диапазон установки 0-7

sht31.begin(0x44);//инициализация датчика GXHT30 44 адресу

  }

void loop() {

float h = sht31.readHumidity();

tm1637.display(h);

delay(500);//период опроса 0.5сек.

}

 

feniсs

Барометр , 4 варианта


BMP180 TM1637

Вариант первый :

Вывод показаний атмосферного давления на светодиодный индикатор в мм рт. ст.

Комплектация :

Arduino nano

TM1637

BMP180

Схема подключения :

1.thumb.JPG.b3c459b542deb8c4b772e2ae4204915b.JPG

Программа (скетч) :

#include <TM1637.h>// библиотека для подключение модуля  семисегментного инд. TM1637

#include <Wire.h>//библиотека для работы интерфейсом I2C

#include <BMP085.h>//библиотека для работы модуля BMP180

TM1637 tm1637(3,2);

BMP085 dps = BMP085();

long  Pressure = 0;

void setup(){

tm1637.init();// инициализация библиотеки «TM1637.h»

tm1637.set(4);//установка яркости , указанная константа равна 4 , диапазон установки 0-7

 Wire.begin();

dps.init(); 

}

void loop(){

 dps.getPressure(&Pressure);

int q=Pressure/133.3;//перевод кПа в мм. рт. столба

 tm1637.display(q);

 delay(1000);//задержка в 1 сек. Между опросами датчика

}

Пояснений к скетчу тут никаких не требуется , все ужато до минимума , раз в секунду производится опрос датчика и данные выводятся на экран

2.thumb.JPG.8dcd9897d4f6f3aeca633d927cc4b80c.JPG рабочая сборка на макетке

Вариант второй :

Упоминал во введении что для многих датчиков довеском вешают еще внутренний датчик температуры , иногда не грех этим воспользоваться

Будем поочередно выводить на экран то давление , то температуру

Сразу скажу на практике такой вариант мягко говоря не ах , быстро достанет вас своим морганием

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

Комплектация :

Arduino nano

TM1637

BMP180

Схема подключения остается та же :

1.thumb.JPG.b3c459b542deb8c4b772e2ae4204915b.JPG

Меняется только программный код :

#include <TM1637.h>// библиотека для подключение модуля  семисегментного инд. TM1637

#include <Wire.h>//библиотека для работы интерфейсом I2C

#include <BMP085.h>//библиотека для работы модуля BMP180

TM1637 tm1637(3,2);

BMP085 dps = BMP085();

long Temperature = 0, Pressure = 0,Altitude = 0;

void setup(){

  tm1637.init();// инициализация библиотеки «TM1637.h»

tm1637.set(4);// установка яркости , указанная константа равна 4,диапазон установки 0-7

  Wire.begin();

dps.init(); 

}

void loop(){

  dps.getPressure(&Pressure);

  dps.getTemperature(&Temperature);

int q=Pressure/133.3; //перевод кПа в мм. рт. столба

  tm1637.display(q);

  delay(1000);//1сек. , время индикации показаний давления

 int t=Temperature;

  tm1637.display((t+5)/10);//вывод температуры с округлением до целого числа

  delay(1000);//1сек. , время индикации показаний температуры

}

После загрузки программы с интервалом 1сек. на табло будет отображаться то давление , то температура (окр.до целого значения) :

5.thumb.JPG.57de73a77bd49694c23164a7d637fb50.JPG 6.thumb.JPG.0e231059fdde0abd88fd74a7118fb4f0.JPG

Вариант третий :

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

Ну значит программно введем режим день/ночь , цена вопроса - еще две копеечных детальки , резистор и фоторезистор

Комплектация :

Arduino nano

TM1637

BMP180

фоторезистор  GL5506 или другой из этой серии

резистор 0,25вт , номинал берем близкий к сопротивлению фоторезистора при освещенности

Схема подключения с небольшими изменениями :

4.thumb.JPG.d1a0070b13b71d5da736af8af0aab8c0.JPG добавлен последовательная цепочка резистор+фоторезистор , с ее средней точки снимается сигнал на аналоговый вход А0

Как подбирал номинал постоянного резистора , замерил сопротивление фоторезистора при включенном свете , было около 1ком , потом замерил сопротивление фоторезистора почти в темноте вышло 100ком , взял номинал резистора в 10ком , попал в точку , константу в программе mq менять не пришлось , по умолчанию в скетче стоит значение 500 (середка в диапазоне работы ацп , 0-1023)

Программа (скетч) :

#include <TM1637.h>// библиотека для подключение модуля  семисегментного инд. TM1637

#include <Wire.h>//библиотека для работы интерфейсом I2C

#include <BMP085.h>//библиотека для работы модуля BMP180

float mq;

TM1637 tm1637(3,2);

BMP085 dps = BMP085();

long Pressure = 0;

void setup(){

 tm1637.init();// инициализация библиотеки «TM1637.h»

tm1637.set(4);// установка яркости , указанная константа равна 4 , диапазон установки 0-7 

Wire.begin();

dps.init(); 

}

void loop(){

 mq = analogRead(A0);//считывание показаний с аналогового входа А0

    if (mq < 500)//порог на котором происходит переключение день/ночь , диапазон 200-800

   {

   tm1637.set(6);//установка комфортной яркости для дня , диапазон 0-7

    }

 else

 {

  tm1637.set(0);//установка комфортной яркости для ночи , диапазон 0-7

  }

  dps.getPressure(&Pressure);

int q=Pressure/133.3; //перевод кПа в мм. рт. столба

  tm1637.display(q);

  delay(500); //0,5сек. Периодичность опроса датчика давления

}

видео изменения яркости TM1637 от освещенности

В реале у меня подобный барометр стоит дома с красным индикатором

3.thumb.JPG.1456821e18253482aa129a001b1e1c12.JPG фоторезистор выведен на лицевую сторону корпуса

Вариант четвертый

Выводит давление и температуру на два разных дисплея TM1637

Схема интересна как образец подключение двух или более модулей TM1637 на одну ардуинку

Кроме того на одном из дисплеев показано как активировать на нем работу с запятыми

Комплектация :

Arduino nano

TM1637 - два штук:grin:

BMP180

Схема подключения :

2.thumb.JPG.3b9397c60e547146daa8c6dfb29d16fa.JPG

Кстати внимательно подключайте модули TM1637 , питание на них разводится по разному , на модулях где предусмотрена распайка в обе стороны с краю обычно плюс идет , а модули с распайкой в одну сторону обычно с краю минус ставят , хотя и это не закон , китайская специфика понимаешь ли:04laugh:

1.thumb.JPG.4bb2a90fb5736e9288b0e6cc02337010.JPG образец отображения информации для данного варианта

Программа (скетч) :

#include <TM1637.h>// библиотека для подключение модуля  семисегментного инд. TM1637

#include <Wire.h>//библиотека для работы интерфейсом I2C

#include <BMP085.h>//библиотека для работы модуля BMP180

TM1637 tmA(3,2);//первый дисплей для индикации давления

TM1637 tmB(5,4);//второй дисплей (с декадными точками) для индикации температуры

BMP085 dps = BMP085();

long Temperature = 0, Pressure = 0,Altitude = 0;

void setup(){

  tmA.init();// дисплей 1 , инициализация библиотеки «TM1637.h»

tmA.set(1);// установка яркости для первого дисплея , диапазон установки 0-7

 tmB.init();// дисплей 2 , инициализация библиотеки «TM1637.h»

tmB.set(2);// установка яркости для второго дисплея ,диапазон установки 0-7

  Wire.begin();

dps.init(); 

tmB.init(D4056A);//установка на работу второго дисплея с дробными числами

}

void loop(){

  dps.getPressure(&Pressure);

  dps.getTemperature(&Temperature);

int q=Pressure/133.3;// перевод кПа в мм. рт. столба

 float t=Temperature;

  tmA.display(q);//первый дисплей отображает атм.давление

  tmB.display(t/10);//второй дисплей отображает температуру с дробной частью

  delay(1000);

}

 

feniсs

Введение


?

ЗИМА , время когда огородные дела завершены , сегодня даже первый снег выпал , да и до рассадных хлопот еще ого-го , я обычно в это время стараюсь в другое свое хобби удариться , в электронику , не стало бы она моим единственным увлечением если еще немного здоровье сдаст

Завожу честно говорю не интересный совсем для вас дорогие форумчанки блог , мальчишечий

Хотя для сада в нем будут полезности , даже более , буду затрагивать только те конструкции что садоводу пригодиться могут

Да и не поверю что ни у кого из вас нет ни внуков , ни сыновей , ни зятей , али мужей в конце концов кто разбирается или способен разобраться в такой увлекательной для ума игрушке как Arduino

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

Вот поэтому и собираюсь здесь со временем разместить подборку 100% рабочих программ и схем по нашей с вами садово-огородной специфике

Почему все же здесь , да пожалуй потому что я здесь основательно корнями осел , скажу честно , хотел изначально на дзене эту тему вести , но после историей с платной подпиской на комментарии и смайлики сотрудничать с ними желания нет , да и не велся я никогда на ихнюю монетизацию , игнорировал их призывы штампуй больше , денег дадим:04laugh:

Ну а пока первой запись , назовем ее

ВВЕДЕНИЕ

Предпочитаемая мной комплектация для «проектов»(ну что так пафосно называют) садовой направленности

Ну прежде всего процессорный модуль – самое практичное это Arduino Nano на ATmega368P , хотя и 168ой в большинстве случаев хватит памяти

1.thumb.JPG.f05501ce3a8a4dd45f0abe03a7af6da3.JPG

По питанию

Внутренний стабилизатор Наны не использую , каждый должен заниматься своим делом , да и откровенно маломощный он

Питание через разъем USB могу использовать только при макетировании , в постоянной работе только через пины питания 5в на плате

Источником 5в питания использую чаще всего такие миниатюрные зарядники 5в 1а

2.thumb.JPG.b125faca4207545a3b546fc02b3f66a5.JPG

Ну или подобные 5в блоки питания

3.thumb.JPG.18b781a25e6dd1da9013392aaa59d30e.JPG

Но бывают случаи когда импульсный источник питания противопоказан , пришлось вернутся пару раз к классике , трансформаторным БП (то бишь 50гц)

Проблемы возникали при «длинном» подключении DS18B20 , метров в 10-15 , с питанием от импульсного источника постоянно проходили ошибки , а то и вовсе датчик затыкался

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

Беру пару штук АА , а после с них повышаю напряжение до 5в  модулем MT3608

4.thumb.JPG.8fab23728dad0ac1796ba4512817f911.JPG, он небольшой и плоский считай , место не много занимает

Далееиспользование беспаечных макетных плат и типовых проводов-перемычек

5.thumb.JPG.ea84a4ae386992601d75ed7907d2a2d7.JPG

Все это только на этапе макетирования , в работе этот суррогат отметаю

Довольно таки часто в придачу к беспаечной макетке требуется подобный модуль питания для макетных плат

6.thumb.JPG.73d21b65f0384668f055ec8c52957952.JPG, но все же обычно хватает USB разъема на ардуинке ,

все равно в процессе отладки постоянно скетч перезаливать приходится

Ну теперь можно к модулям обвязки перейти

Прежде всего индикация

Из светодиодных это модули на базе TM1637 , их два варианта – часовой с двуеточием по середине и с декадными точками , удобней конечно второй вариант , но предложения по ним более редки , и те же китайцы сплошь и рядом норовят подсунуть взамен часовой вариант

7.thumb.JPG.feccada0443130cfa29bdbee6eb9edc0.JPG8.thumb.JPG.279fbd89b4cb829ae85043cb1b9890c7.JPG

Ну и еще эти модули по высоте цифр различаются 0,36’’ и 0,56’’

По цвету я для дома беру красные или зеленые , для улицы пожалуй синие больше подходят

Из жидкокристаллических в ходу у меня HD44780 двухстрочные 2*16 и четырехстрочные 4*20

1.thumb.JPG.5dd64a0f4001d59b9c086cb11dfab89b.JPG, именно на эти модули предусмотрена непосредственная установка модуля последовательного интерфейсом

9.JPG.c1282e62de53def1cc05616dedfc90a3.JPG, использовать модули индикации без него считаю мазохизмом

К графическим индикаторам душа у меня не лежит , хотя возможно мелкогабаритные OLED дисплеи и имеет смысл попробовать в деле , именно из-за их габаритов (поставлю себе галочку на будущее)

Измерение температуры

Аналоговые датчики , на подобие LM335 , отметаю , далеко без искажений аналоговый сигнал передашь

Ну а из цифровых безусловно самый распространенный DS18B20 , и к нему есть претензии , прежде всего по недостаточной точности , зачем дискретность 1/16° , коли точность в пределе 0,5°-1° , но лучшего варианта из доступных и недорогих нет

3.thumb.JPG.40676f72807efa0e22481f03e6697e0b.JPG в зависимости от места использования беру или просто датчик или датчик помещенный в герметичную гильзу и исходящим кабелем

И да , ведь кстати в датчиках других параметров очень часто в виде дополнительной опции еще и температурный датчик стоит , точностью великой они не блещут , но на халяву говорят и уксус пьют

Освещенность

Я прикипел к BH1750 , дешевый , распространенный , точный

2.thumb.JPG.e0c5dc191cc029a795642b3d8b1ecd6c.JPG

Минус один в яркий солнечный день (100-120клюкс) его рабочей шкалы не хватает , по пачпорту обещают 65,536кл , но из-за закулисных интриг потолок выходит еще ниже – 54,612кл

Обходил это или уменьшая угол обзора , или помещая датчик в корпус с ослабленной прозрачностью , а потом вводил в скетч поправочный коэффициент

Есть еще один интересный датчик освещенности VEML7700 , у него диапазон в одном из режимов повыше , что-то в пределе 120кл

Гонял немного его в ручном , не автоматическом режиме , подбирая усиление и время экспозиции находил режим до 65,536кл , но не более , надо разбираться , но скорее всего опять лукавят

Помещу в разряд освещенности еще и аналоговый модуль УФ освещенности GUVA-S12SD , он банально прост УФ светодиод служащий приемником 240nm-370nm излучения и ОУ с фиксированным усилением

4.JPG.521ccf490ecc027cb95d53701cbc23eb.JPG

С пяток таких модулей брал – разбежка выхода экземпляров до трех раз , это что-то:09fp: , видно так гуляет чувствительность светодиодов к УФ излучению , это более чем измерение в попугаях

Достоинство только одно , датчик абсолютно глух к более высоким спектрам , дома он спит абсолютно , на яркий синий источник света тоже не реагирует , а вот на улице значение аналогового сигнала с него строго пропорционально значениям освещенности в данный момент , ни разу аномальных всплесков УФ не замечал , хотя тут возможно надо ложиться в засаду на долго77.gif.f4e513008296507755992baf4b5d31d4.gif

Влажность воздуха

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

5.JPG.7b97ea9f97d9afc102288058c2caf290.JPG

Достаточно точный , шустро бегает по всему диапазону , и до 12% опускался , и 99% поднимался , и даже перескакивал на 00% несколько раз в бане , очевидно подразумевая 100%

Второе его достоинство – он очень динамичен , и дискретность у него 16бит АЦП , можно с сотыми %  отображать показатели влажности , правда это при точности до 3% , но это не мешает чувствовать относительные микроизменения влажности

Давление

BMP180 , раз попробовал и не ищу другого , стабильно , надежно работает , первое изделие с 2017 в комнате висит , за это время датчик и на миллиметр не уплыл

6.thumb.JPG.b71ad31ad390846b0213ffab8c26ace1.JPG

Наспех пробовал еще BMP280 , но чем-то он мне в первое знакомство не приглянулся , так и не пробовал его повторно

Когда ваял себе регистратор данных возникла еще потребность в двух модулях

Часы реального времени , на тот момент самыми популярными были на связке DS3231 + AT24C32

7.JPG.51e3bca2e6a4dbe3d0d9c76b1edcfabb.JPG

Время много прошло , возможно сейчас что лучше есть , не в курсе , врать не буду

Ну и модуль считывания карт micro sd , куда все намерянное с привязкой к времени писать

8.thumb.JPG.cce5b76945edb30790fabf4999b8bc14.JPG

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

А так интересен индикатор начала и интенсивности дождя (опять же то что на АЛИ за три копейки даже не рассматриваем) , направление и сила ветра – опять же если долго и упорно самому мудрить

Термоконтроллеры неплохие и так идут , тут ардуино как собаке пятая нога

Таймера времени тоже неплохие готовые есть

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

×
×
  • Создать...