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

feniсs

Пользователь
  • Публикаций

    851
  • Зарегистрирован

  • Посещение

  • Победитель дней

    1

Записи блога, опубликованные feniсs

  1. feniсs
    Как оказалось очень актуальный вопрос кто с микропроцессорными делами связан
    Я вот до последней поры и не заморачивался этим вопросом , на метровом куске кабеля датчик влажности раза три датчик влажности вывешивал , проблем со сбоями не было
    А вот сейчас собрался переделывать метеостанцию  , планирую несколько датчиков влажности и освещенности достаточно далеко отвести , вот и стал вопрос не будет ли линия i2c сбоить
    Полез в инет читать , так кроме того что разработчик интерфейса гарантирует стабильную работу на длинах до 2х метров внушающей информации больше нет
    Находятся балаболы кто кричит что и метра интерфейс не вытянет , другие заявляют что у кого-то и 20м и 100м без "спецсредств" линия тянет , но таких все норовят в разряд сказочников поставить , как всегда треп есть треп , так что сам не пощупаешь - не узнаешь
    ----------------------------------------
    И так отмотал 10м 4х жильного сигнального кабеля (не витая пара , и не телефонка , и не экран) :
    такой вот
    Далее беру свой незаменимый регистратор данных , вешаю через этот кабель на него GXHT30
    В сумме на шине i2c у меня 4 нагрузки висит , три внутрикорпусных (часы , карта и дисплей) ну и плюс на выносном 10м кабеле датчик влажности
    Для начала кабель развесил по всей длине вдоль самых злачных мест : компа , сетевых проводов , у драйверов светодиодного освещения
    Короче в самых смердящих ЭМ наводками местах , и начал запитывать логгер от разных источников
    Начал с импульсного блочка питания самой дешевой схемотехники , прочитал флешку с результатами измерений - лишь 32% замера влажности , температура нормально прошли , все остальное с сбоем
    После запитался с usb порта компьютера , тут вообще мрак , лишь 11% показаний прошли , что надо сказать очень удивило , но скорее всего тут причина полного провала кроется что кабель проброшен в прямой близости от источника питания , что повысило уровень помех
    Третьим источником энергии стал классический источник питания на обычном 50гц трансформаторе , и тут сразу картина сменилась , 76% показаний прошли , но это все равно для нормальной работы мало
    Ну и четвертый тест - это автономный источник питания в самом регистраторе , 18650 элемент и модуль MT3608 (который кстати работает на частоте 1,2мгц) - и вот тут я дождался своих желанных 100% , причем без всякого округления , из 142 замеров не было ни одного сбоя , вот что значит нет емкостной завязки с сетью
    Но это все же жесткие испытания были , на практике я напротив буду тянуть кабель на возможно большем расстоянии от источников помех , так что повтор тестов уже с кабелем сложенным в кольца рядом с регистратором
    И тут все пошло как по маслу , автономка - 100% , 50гр БП - 100% , USBкомпа - 100% , и лишь дешевый импульсник поднасрал выдав лишь 67% гут :

    Ну и какие выводы тут можно сделать ?
    10м длина кабеля  вполне хорошо пропускает i2c , основной причиной сбоев являются электромагнитный наводки а не емкость кабеля как многие вещают , по крайней мере для длины 10м эти не является проблемой , так что очень возможно что прокатит использование и экранированной сигналки , хотя бы в зоне повышенной смердливости , на улице можно и на обычный кабель перейти
    На длинных линиях я давно отказался от импульсников DS1820 давно этому научили , автономное питание это не для сутками работающих схем , так что остается классика
    шутка конечно , на порядок мельче хватит для наших дел
  2. feniсs
    Регистратор данных весьма полезная в садо-огородных делах штука , со своим универсальным можно сказать 7 лет в любви и дружбе живу
    Основная его начинка спрятана в корпусе , а все требуемые в данном случае датчики подсоединяются к внешним разъемам , в теории десятка полтора одновременно датчиков могу подсоединить , но чаще 2-3-4 одновременно требуются
    ну вот к примеру одна из обработок данных логгера в экселе
    Это в одну из майских ночей сравнивал температуру на улице и в парнике
    Ладно , хорош лирики , что же нам потребуется для создания Регистратора Данных , окромя самой ардуины это модуль часов реального времени
    я такой обычно использую на DS3231 и AT24C32
    И само собою кошелек , куда складывать информацию будем , то бишь модуль карты памяти :
      под microSD-карту
    Перед началом работ часы снаряжаем элементом 2032 , затем в модуль часов загружаем текущую дату , время , тут пример вам в помощь :

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

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

    Ну и заливаем программу (скетч) :
    #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");
    Она переведена у меня в разряд комментариев , если ее активировать , то регистратор при каждой подаче питания будет удалять прежний файл и начинать писать за ново
    В принципе у меня так это и работает сейчас в действующем изделии , но при этом всегда есть риск что вы запустили логгер на ночь или вообще на несколько суток , а в какой-то момент будет отключение сети и в этом случае все предыдущие данные пропадут при повторной подачи питания
    По этой причине я и исключил эту строку из кода , если такая ситуация вам не опасна по причине не долгих измерений или наличия бесперебойного питания на борту , то конечно же лучше активировать эту строку , это избавит вас от необходимости удалять старые файлы с карты вручную
    Я у себя сейчас внеся изменения в код на рабочем девайсе вынужден был на флешке такой пустой файл-напоминалку создать :

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

    В код программы вносим изменения :
    #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сек.

       }


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

     

     

     
  3. 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у с ардуиной
    с плоттера такой график получил , зубья до 1° при опросе 0,2сек , можно конечно брать к примеру среднеарифметическое за 10 измерений скажем и будет относительно сносно , но ради чего столько мытарств
    При том еще что в тесте датчик стоял у проца рядом , а отведи его на несколько метров ... , там вообще ужас будет
    Короче так и остается одна DS18B20
    Вариант первый :
    Подключение DS18B20 без запроса адреса прописки , на один цифровой вход такое делать чревато , стоит одному датчику не отозваться при опросе и весь ряд сместится на одну позицию , так что для меня главный принцип , если нет адресации , то 1 вход - 1 датчик
    Спрашивается , а есть ли смысл потреблять датчики без прописки , отвечу есть , есть он в том случае если есть вероятность выхода датчика из строя , а снимать блок с ардуиной и перепрошивать адрес нового датчика несподручно
    У меня например такая система в бане стоит , там три термометра , бак с водой , температура у пола и у головы , в моечное отделение только через стекло дисплей торчит , было уже раз что в баке термометр потек , быстро поменял его и все , снимать процессорный блок , вынимать ардуинку и тащить ее домой на перепошивку не пришлось
    Комплектация :
    Arduino nano
    HD44780 2004 + модуль посл.интерфейса
    DS18B20 3шт.
    R 4,7ком 3шт.
    Схема подключения :

    макет в сборе , очень так единодушно датчики показания выдают , правда все три были из одной партии
    Программа (скетч) :
    #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шт.
    Схема подключения :

    Программа (скетч) :
    #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х
    как в паспортном столе за шоколадку выведаете адреса работников вносим их в скетч
    Ну и напоследок мне все же захотелось хоть какую-то компанию DS18B20 найти , пошел по подселенцам , нашел парочку :
    в модуле давления BMP180 и в датчике влажности GXHT30
    Вариант третий :
    Он чисто соревновательный , или будем считать что работников выгнали нормы ГТО сдавать
     Комплектация :
    Arduino nano
    HD44780 2004 + модуль посл.интерфейса
    DS18B20 1шт.
    R 4,7ком 1шт.
    BMP180
    GXHT30
    Схема подключения :

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


    Опять же очень близко ложатся данные
    Программа (скетч) :
    #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);                                                      
      } 
     Навряд ли потребуется такая сборка , но пусть будет , раз уж написана  , под час ведь бывает что начнешь скрещивать двух индивидов и ошибки так и лезут из-за невнимательности
       
  4. feniсs
    Актуальная , на слуху сейчас тема , соответственно и разных датчиков хватат
    Уж я сильно не заморачивался этим вопросом , но в моей кубышке целых три модели завалялось :
    Два аналоговых - GUVA-S12SD  и  ML8511
    Да один цифровой - VEML6070
    Сразу на начальном этапе отмел аналоговый ML8511
    Без облучения чем либо на его выходе 0,9-0,95в , дал засветку УФ , напряжение поднялось ближе к полутора вольтам , все бы это можно было еще пережить , на когда датчик прореагировал и на синий свет , и на белый , пусть и послабее чем на УФ , но на мат сорвался в голос когда УФ-датчик и красный цвет увидел , после такого дисквалифицировал его пожизненно
    А вот другой аналоговый GUVA-S12SD - молодец , впрочем я это уже и раньше знал , летом часто с нам в сад выбегал в поисках УФ активности
    Так и не подловил ни одной УФ аномалии , все жестко повязано на видимую солнечную освещенность , УФ компонента жестко привязана к ней
    Самое интересное что датчик до безобразия прост - уф-фотодиод и оу для раскачки сигнала
    Осталось сказать о цифровике VEML6070 , мозгов понавертели в нем ого-го , а по делу тоже туфта , так же путает свою шерсть с государственной , так же все вплоть до красного цвета видит любвиобильный мой
    Но все же оспавил его для сравнения с GUVA-S12SD , чтоб не устраивать безальтернативных выборов
    И так
    Вариант первый :
    Комплектация :
    Arduino nano
    HD44780 1602 + модуль посл.интерфейса
    VEML6070
    GUVA-S12SD
    Схема подключения :

    Программа (скетч) :
    #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);
    }
    УФ светодиод 365нм оба датчика видят , один меряет в попугаях , другой в мартышках , но не суть , есть некие условные единицы , на практике важно больше/меньше , что было вчера , что сегодня
    синий цвет , GUVA-S12SD по нулям , а VEML6070 продолжает хавать и синий
    белый холодный светодиод  , VEML6070 заметно умерил пыль , но все равно считает его
    ну и наконец красный , а VEML6070 так и не уймется , что у вас ? веревочка ?, давайте и веревочку
    Вот и куда такой тащить на улицу , он весь солнечный спектр в одну кошелку сметет
    Разве что дома для каких экспериментов использовать , когда знаешь что работаешь только с УФ составляющей
    Посему я все же оставил ему право на жизнь , только индикатор взял попроще , тут 4х знаков хватит за глаза
    Вариант второй :
    Комплектация :
    Arduino nano
    TM1637
    VEML6070
    Схема подключения :

    тестдрайв
    Программа(скетч) :
    #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
    Схема подключения :

    тестдрайв
    Программа(скетч) :
    #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мка в качестве вольтметра ограничив ток резистором
    я он  с такой порнографией летом пробегал , ну и заводской люксометр еще брал чтобы привязывать УФ уровень к освещенности
    Напругу кроны енкой 5в ограничил , головку под одновольтовый вольтметр заточил , выше 1в показаний и не было
     
  5. feniсs
    Есть несколько модулей распознавания цвета , изначально их предназначение определять цвет предмета вблизи датчика
    Датчик подсвечивает белыми светодиодами исследуемый объект , а отраженный от него свет уже обрабатывает фотоматрица , которая состоит из красного, зеленого, синего и прозрачного фотодиода
    Вся матрица закрыты ИК-фильтром, которая минимизирует влияние ИК-излучения на показания
    Лет 8 назад игрался с подобной игрушкой , но на другом модуле (TCS3200) , но сейчас он уже антикваром можно сказать стал и цена на него неадекватно выросла , так что для новых игр возьмем датчик посвежее - TCS3472
    Чтоб игрушка оказалась повеселей добавил в нее еще люксметр , в принципе и с 3472 матрицы можно затребовать данные об освещенности , но там эта функция как-то в кривых попугаях дает ответ
    Комплектация :
    Arduino nano
    HD44780 2004 + модуль посл.интерфейса
    TCS3472
    BH1750
    Схема подключения :

    Светодиоды с модуля 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
    Но это ориентировочные цифры , возможно где в документации они прописаны точно

    Вот сборка на макете под холодным освещением в комнате , синий , зеленый по 40% , красному лишь 20% остается
    а это уже под теплым светодиодом при выключенном общем свете , здесь картина сменилась , на красный приходится 50% , синему лишь 20% осталось
    а вот полноспектральный диод , зеленый канал подавлен , всего 13% , красный , синий примерно поровну
    По моноцветам уберу картинки под спойлер :
     
  6. feniсs
    Влажность воздуха что при выращивании рассады , что летом в теплице , да и нам самим , в нашей среде обитания однозначно значимый параметр
    Как правило ничего мы кардинально поменять не имеем возможности , так хоть быть в курсе ситуации уже если не хлеб , то сухарики
    За последние 10-15 лет , как китайцы начали нас баловать своими творениями , много каких изделий от них перепробовал , но единственный датчик что устроил меня от и до это GXHT30 , в этой серии есть и другие варианты , но самый распространенный и весьма не дорогой именно он
    Вариант первый :
    Вывод влажности воздуха , ну и заодно температуры (коль ее датчик в тот же кристалл засандален) на жидкокристаллический дисплей
    Этот датчик выдает значение и влажности , и температуры с дискретностью до сотых долей  , такая скрупулезность не всегда и нужна , но всегда можно программно ограничить вывод данных до десятых долей , а то и до целых чисел
    Комплектация :
    Arduino nano
    HD44780 1602 + модуль посл.интерфейса
    GXHT30
    Схема подключения :

    Программа (скетч) :
    #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сек.
    }
    Это я показал ленивый вариант программы , в работе это будет выглядеть так :
    специально показал что можно выводить данные и с одним , и с двумя знаками после запятой
    Но как видим место на экране еще завались , ничего полезного нам больше вывести нечего , так что можно забить пустое место шлаком , создать так сказать красоту
    В сборке ничего не меняем , только перепишем программу :
    #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сек.
    }
    Ну вот теперь совсем другой вид , хотя информации ни на грош больше не стало :

    Ну и , опять же для примера , убрал дробные части значений
    Да заодно показал в коде как можно вывести на экран русские буквы , а то табло умеет только на латинице материться
    Вариант второй :
    Вывод на LCD дисплей данных с двух таких датчиков , к сожалению только с двух , чип что в датчике влажности стоит умеет лишь по двум адресам по шине I2C на связь выходить(44 и 45) , адрес переключается подачей разного уровня на вторую ногу чипа , но злые китайцы почти никогда не разводят эту ногу на плате , тупо сажают ее на массу
    Ну два датчика на один процессорный мозг это уже лучше чем один , можно сравнить влажность в разных точках на одном экране , хотя у меня есть потребность к февралю снимать показания с трех гигрометров на один мозг и экран , в принципе есть идея как обходными путями это сделать , но это в перспективе
    Комплектация :
    Arduino nano
    HD44780 1602 + модуль посл.интерфейса
    GXHT30 - 2 штуки , но один из них с доступом к заветной второй ноге чипа
    Схема подключения :

    Программа (скетч) :
    #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сек.
    }
    В работе это выглядит так :
    тут уже нет место для надписей на заборе , только все по существу
    Кстати приятно порадовала что разбежка с показаниях крайне не существенна
    Вариант третий :
    Вывод значений влажности воздуха на четырехразрядный светодиодный индикатор
    Подчас ведь не надо ничего лишнего , только одно сначение и все
    Комплектация :
    Arduino nano
    TM1637
    GXHT30
    Схема подключения :

    Не совсем тот модуль TM1637 на схеме изображен , должен быть вариант на котором нет двоеточия , а только одни запятые стоят , дело в том что в модулях с двоеточием запятые стоят бутафорские , они не участвуют в работе
    Можно и такой модуль конечно ставить , но разделительного знака у нас не будет
    Нужный индикатор выглядит так :
    на нем нет посередине двоеточия как в часовом варианте
    Ну и скетч под светодиодный вариант :
    #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сек.
    }
     
  7. feniсs
    Обратил внимание на датчик освещенности VEML7700 из-за обещанного более высокого предела измерений , заявляется около 120кЛюкс
    Пару лет назад немного поигрался с ним   и забросил , помню что в одних вариантах включения он на 40кЛюкс затыкался , на других доходил до 65кЛюкс и дальше ни ногой , сейчас вот повторно решил с ним поработать
    Вариант первый :
    Даю на откуп все мозгам датчика , он в этом режиме на автомате сам определяет для себя и время интегрирования , и усиление , я только итог
    Комплектация :
    Arduino nano
    HD44780 1602 + модуль посл.интерфейса
    VEML7700
    Схема подключения :

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

    Ну и программа(скетч) :
    #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);
    }
    Прежде чем перейти к другой сборке приведу тут выдержку из статьи с буржуйского сайта , под спойлер убрал длинно больно , но уж больно подробное досье на этого парня
     
    Мда , разобрался раз через раз , но главное :
    Датчик оснащен двумя фотодиодами с различными спектральными характеристиками, представленными двумя каналами: 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
    Схема подключения :

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

    Программа(скетч) :
    #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);
    }
    В программе выставлено минимальное усиление и минимальное время интегрирования , хотя это как раз режим под высокие уровни освещенности , чем дома и не пахнет , но этими двумя параметрами я вдоволь поигрался , обратил внимание что в разных режимах измерения выдаваемые значения освещенности заметно гуляют , видно все же надежней довериться их автоматике
    А напоследок я решил поиграться разноцветными светодиодиками , поглядеть как на них реагируют оба канала , и что после обработки выплюнет люксметр :
    УФ диод 390-400нм , а производитель говорил что "белый" канал лишь в сторону ИК расширен
    синий диод ALS канал его больше выделяет
    зеленый диод ALS канал так же его лучше принимает
    красный , его уже больше "белый" канал любит
    ИК диод 850нм , "белый" канал прям тащится от него , но в расчет освещенности мало что попадает
    Как же мудрено они считают
     
     
  8. feniсs
    Вариант первый :
    Вывод данных с одного датчика освещенности на жидкокристаллический индикатор
    К сожалению данный тип датчиков имеет верхний предел в 54,612клюкс , что как минимум в два раза ниже потолка освещенности в яркий солнечный день
    Приходится хитрить , помещать датчик в корпус из материала с ограниченной прозрачностью и вводить поправочный коэффициент в расчетах
    Комплектация :
    Arduino nano
    HD44780 1602 + модуль посл.интерфейса
    BH1750
    Схема подключения :

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

    Программа (скетч) :
    #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
    Схема подключения :

    Так выглядит в работе :
    первый цикл среднее значение не высвечивается , пока массив данных на набьется полностью показаниями , чтобы не вводить нас в заблуждение заниженными цифрами
    после уже постоянно будут высвечиваться оба параметра , и текущие , и усредненные
    Программа (скетч) :
    #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 , много большие значения ставить не прокатит , памяти ардуинки не хватит
    но усреднение по 500_м замерам более чем достаточно
    Вот картинка теста с плоттера , синие это текущие , красное усредненное , достаточно вполне определиться какая погода преимущественно , солнечно или пасмурно
    Так что если надо уменьшить время усреднения размерность массива лучше не трогать , а изменить период обращения к датчику
    Для 1 часа этот период у меня выставлен 7,2сек , для 10мин. ставим 1,2сек , для 20мин. 2,4сек и т.д.
    А вот для домашних нужд я ставил размерность массива 20-25 и время очередности датчика в пределах 0,1сек
    тут подобная картинка на плоттере выскакивает , на ровном плато где я руками не махал , видно что показания не стабильны пилой али синусоидой дрожат (следствие работы ламп) по этому участку среднее значение (красная линия) прямеханька по середине прет
    А острые броски текущих плавно повторяет без зубов , только чуть притормаживая
    Конечно это тоже все просто приборчик посмотрелка , на практике , чтоб от него больше пользы было , надо выводить с него команды на исполнительное устройство , будь то зуммер , шторки закрывания рассады или система орошения какая к примеру
    Перешагнуло среднее значение некий выставленный порог - выдается команда на исполнительный механизм , самое простое это конечно зуммер , а исполнительный механизм это я
    Вариант третий :
    Повторяет первый вариант , только с той разницей что тут подключено два датчика освещенности , меняя уровень на пятой ноге (все же есть от пятой ноги польза) можно подключить эти датчики по разным адресам
     Комплектация :
    Arduino nano
    HD44780 1602 + модуль посл.интерфейса
    BH1750 - два модуля
    Схема включения :

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

    Программа (скетч) :
    #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 , получше разберемся что он может
     
  9. feniсs

    BMP180 TM1637
    Вариант первый :
    Вывод показаний атмосферного давления на светодиодный индикатор в мм рт. ст.
    Комплектация :
    Arduino nano
    TM1637
    BMP180
    Схема подключения :

    Программа (скетч) :
    #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 сек. Между опросами датчика
    }
    Пояснений к скетчу тут никаких не требуется , все ужато до минимума , раз в секунду производится опрос датчика и данные выводятся на экран
    рабочая сборка на макетке
    Вариант второй :
    Упоминал во введении что для многих датчиков довеском вешают еще внутренний датчик температуры , иногда не грех этим воспользоваться
    Будем поочередно выводить на экран то давление , то температуру
    Сразу скажу на практике такой вариант мягко говоря не ах , быстро достанет вас своим морганием
    Привожу его только чтобы показать как сделать запрос у датчика давления температуры
    Комплектация :
    Arduino nano
    TM1637
    BMP180
    Схема подключения остается та же :

    Меняется только программный код :
    #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сек. на табло будет отображаться то давление , то температура (окр.до целого значения) :

    Вариант третий :
    Вариант первый что я привел всем хорош , но если вы такой барометр установите в спальне то он начнет вас ночью раздражать своим ярким свечением , можно конечно выставить яркость индикатора на малый уровень , но тогда другая проблема , днем при свете он ставит мало заметен
    Ну значит программно введем режим день/ночь , цена вопроса - еще две копеечных детальки , резистор и фоторезистор
    Комплектация :
    Arduino nano
    TM1637
    BMP180
    фоторезистор  GL5506 или другой из этой серии
    резистор 0,25вт , номинал берем близкий к сопротивлению фоторезистора при освещенности
    Схема подключения с небольшими изменениями :
    добавлен последовательная цепочка резистор+фоторезистор , с ее средней точки снимается сигнал на аналоговый вход А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 от освещенности
    В реале у меня подобный барометр стоит дома с красным индикатором
    фоторезистор выведен на лицевую сторону корпуса
    Вариант четвертый
    Выводит давление и температуру на два разных дисплея TM1637
    Схема интересна как образец подключение двух или более модулей TM1637 на одну ардуинку
    Кроме того на одном из дисплеев показано как активировать на нем работу с запятыми
    Комплектация :
    Arduino nano
    TM1637 - два штук
    BMP180
    Схема подключения :

    Кстати внимательно подключайте модули TM1637 , питание на них разводится по разному , на модулях где предусмотрена распайка в обе стороны с краю обычно плюс идет , а модули с распайкой в одну сторону обычно с краю минус ставят , хотя и это не закон , китайская специфика понимаешь ли
    образец отображения информации для данного варианта
    Программа (скетч) :
    #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);
    }
     
  10. feniсs

    ?
    ЗИМА , время когда огородные дела завершены , сегодня даже первый снег выпал , да и до рассадных хлопот еще ого-го , я обычно в это время стараюсь в другое свое хобби удариться , в электронику , не стало бы она моим единственным увлечением если еще немного здоровье сдаст
    Завожу честно говорю не интересный совсем для вас дорогие форумчанки блог , мальчишечий
    Хотя для сада в нем будут полезности , даже более , буду затрагивать только те конструкции что садоводу пригодиться могут
    Да и не поверю что ни у кого из вас нет ни внуков , ни сыновей , ни зятей , али мужей в конце концов кто разбирается или способен разобраться в такой увлекательной для ума игрушке как Arduino
    Это такой микропроцессорный конструктор который быстро собирается , а чтобы он ожил в мозги процессора нужно программку(скетч) написать и затолкнуть , можно и чужую в инете найти , но только это не интересно (нет зарядки для мозгов) , а главное что многие из них не зафурычат , поскольку кучу раз у друг друга передраны и на хватали в код ошибок
    Вот поэтому и собираюсь здесь со временем разместить подборку 100% рабочих программ и схем по нашей с вами садово-огородной специфике
    Почему все же здесь , да пожалуй потому что я здесь основательно корнями осел , скажу честно , хотел изначально на дзене эту тему вести , но после историей с платной подпиской на комментарии и смайлики сотрудничать с ними желания нет , да и не велся я никогда на ихнюю монетизацию , игнорировал их призывы штампуй больше , денег дадим
    Ну а пока первой запись , назовем ее
    ВВЕДЕНИЕ
    Предпочитаемая мной комплектация для «проектов»(ну что так пафосно называют) садовой направленности
    Ну прежде всего процессорный модуль – самое практичное это Arduino Nano на ATmega368P , хотя и 168ой в большинстве случаев хватит памяти

    По питанию
    Внутренний стабилизатор Наны не использую , каждый должен заниматься своим делом , да и откровенно маломощный он
    Питание через разъем USB могу использовать только при макетировании , в постоянной работе только через пины питания 5в на плате
    Источником 5в питания использую чаще всего такие миниатюрные зарядники 5в 1а

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

    Но бывают случаи когда импульсный источник питания противопоказан , пришлось вернутся пару раз к классике , трансформаторным БП (то бишь 50гц)
    Проблемы возникали при «длинном» подключении DS18B20 , метров в 10-15 , с питанием от импульсного источника постоянно проходили ошибки , а то и вовсе датчик затыкался
    Иногда возникает необходимость еще и в автономном питании , на батарейках его расточительно организовывать , литиевые аккумуляторы я как-то обхожу стороной , их только обидь нечайно , так отдача замучает , так что остаются никель-кадмиевые
    Беру пару штук АА , а после с них повышаю напряжение до 5в  модулем MT3608
    , он небольшой и плоский считай , место не много занимает
    Далее – использование беспаечных макетных плат и типовых проводов-перемычек

    Все это только на этапе макетирования , в работе этот суррогат отметаю
    Довольно таки часто в придачу к беспаечной макетке требуется подобный модуль питания для макетных плат
    , но все же обычно хватает USB разъема на ардуинке ,
    все равно в процессе отладки постоянно скетч перезаливать приходится
    Ну теперь можно к модулям обвязки перейти
    Прежде всего индикация
    Из светодиодных это модули на базе TM1637 , их два варианта – часовой с двуеточием по середине и с декадными точками , удобней конечно второй вариант , но предложения по ним более редки , и те же китайцы сплошь и рядом норовят подсунуть взамен часовой вариант

    Ну и еще эти модули по высоте цифр различаются 0,36’’ и 0,56’’
    По цвету я для дома беру красные или зеленые , для улицы пожалуй синие больше подходят
    Из жидкокристаллических в ходу у меня HD44780 двухстрочные 2*16 и четырехстрочные 4*20
    , именно на эти модули предусмотрена непосредственная установка модуля последовательного интерфейсом
    , использовать модули индикации без него считаю мазохизмом
    К графическим индикаторам душа у меня не лежит , хотя возможно мелкогабаритные OLED дисплеи и имеет смысл попробовать в деле , именно из-за их габаритов (поставлю себе галочку на будущее)
    Измерение температуры
    Аналоговые датчики , на подобие LM335 , отметаю , далеко без искажений аналоговый сигнал передашь
    Ну а из цифровых безусловно самый распространенный DS18B20 , и к нему есть претензии , прежде всего по недостаточной точности , зачем дискретность 1/16° , коли точность в пределе 0,5°-1° , но лучшего варианта из доступных и недорогих нет
    в зависимости от места использования беру или просто датчик или датчик помещенный в герметичную гильзу и исходящим кабелем
    И да , ведь кстати в датчиках других параметров очень часто в виде дополнительной опции еще и температурный датчик стоит , точностью великой они не блещут , но на халяву говорят и уксус пьют
    Освещенность
    Я прикипел к BH1750 , дешевый , распространенный , точный

    Минус один в яркий солнечный день (100-120клюкс) его рабочей шкалы не хватает , по пачпорту обещают 65,536кл , но из-за закулисных интриг потолок выходит еще ниже – 54,612кл
    Обходил это или уменьшая угол обзора , или помещая датчик в корпус с ослабленной прозрачностью , а потом вводил в скетч поправочный коэффициент
    Есть еще один интересный датчик освещенности VEML7700 , у него диапазон в одном из режимов повыше , что-то в пределе 120кл
    Гонял немного его в ручном , не автоматическом режиме , подбирая усиление и время экспозиции находил режим до 65,536кл , но не более , надо разбираться , но скорее всего опять лукавят
    Помещу в разряд освещенности еще и аналоговый модуль УФ освещенности GUVA-S12SD , он банально прост УФ светодиод служащий приемником 240nm-370nm излучения и ОУ с фиксированным усилением


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

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

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

    Достаточно точный , шустро бегает по всему диапазону , и до 12% опускался , и 99% поднимался , и даже перескакивал на 00% несколько раз в бане , очевидно подразумевая 100%
    Второе его достоинство – он очень динамичен , и дискретность у него 16бит АЦП , можно с сотыми %  отображать показатели влажности , правда это при точности до 3% , но это не мешает чувствовать относительные микроизменения влажности
    Давление
    BMP180 , раз попробовал и не ищу другого , стабильно , надежно работает , первое изделие с 2017 в комнате висит , за это время датчик и на миллиметр не уплыл

    Наспех пробовал еще BMP280 , но чем-то он мне в первое знакомство не приглянулся , так и не пробовал его повторно
    Когда ваял себе регистратор данных возникла еще потребность в двух модулях
    Часы реального времени , на тот момент самыми популярными были на связке DS3231 + AT24C32

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

    Есть потребность в измерении влажности почвы , но что копеечное предлагают это даже не рассматриваю
    А так интересен индикатор начала и интенсивности дождя (опять же то что на АЛИ за три копейки даже не рассматриваем) , направление и сила ветра – опять же если долго и упорно самому мудрить
    Термоконтроллеры неплохие и так идут , тут ардуино как собаке пятая нога
    Таймера времени тоже неплохие готовые есть
    Ну а так можно ваять куда фантазия заведет , у меня например последняя поделка пень-леший который по ночам проходящих мимо пугает , сверкает глазищами и матерится при этом (правда на своем языке) , вот точно чем бы мужик не тешился , лишь бы картошку не окучивал
×
×
  • Создать...