Перейти к содержанию

Рекомендуемые сообщения

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

Примечание:считать просто выплеском. к чему приведет не знаю.

Поделиться сообщением


Ссылка на сообщение
6 часов назад, Haaans сказал(а):

Просмотрел весь скетч. Аккуратное решение.

Загляните в первый пример (BlinkWithoutDelay), который я просил загрузить в плату контроллера. Ничего не напоминает? =)))

Спойлер

const int ledPin = LED_BUILTIN;
int ledState = LOW;
unsigned long previousMillis = 0;
const long interval = 1000;

void setup() {
  pinMode(ledPin, OUTPUT);
}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    if (ledState == LOW) {          // это я убрал \
      ledState = HIGH;              // это я убрал \\
    } else {                        // это я убрал ||||| нам не надо менять состояние сетодиода
      ledState = LOW;               // это я убрал //
    }                               // это я убрал /
    
    digitalWrite(ledPin, ledState); // Это я заменил, т.к. мы выполняем вместо мигания, свою задачу, при достижении millis == interval
  }
}

 

Большинство "Аккуратных решений" уже есть в примерах. Нужно только адаптировать под собственные задачи.

6 часов назад, Haaans сказал(а):

Невероятно, но руки опускаются.

Если бы у меня каждый раз опускались руки при нахождении нужного решения, вместо самопридумывания, я бы уже давно этими мозолистыми задушил статую свободы. :ap:
Даже не представляю сколько бы мне потребовалось времени, чтоб придумать/сделать самому да тот же двигатель внутреннего сгорания или жесткий диск на безумные 10Мб :)

Возможность использовать "Коллективный разум" нас  отличает от низших форм жизни, пользуйтесь на здоровье! :38:

Поделиться сообщением


Ссылка на сообщение
6 часов назад, VALKNUT сказал(а):

Возможность использовать "Коллективный разум" нас  отличает от низших форм жизни, пользуйтесь на здоровье! :38:

Дак да. Право не возьму в толк почему на меня это так подействовало. Вероятно усталость сказалась. Но я был на верном пути.

Поделиться сообщением


Ссылка на сообщение
7 часов назад, VALKNUT сказал(а):

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

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

ЗЫ: это чисто для понимания моей позиции. не хочется сводить все к копировать и вставить.

Поделиться сообщением


Ссылка на сообщение
32 минут назад, Haaans сказал(а):

ЗЫ: это чисто для понимания моей позиции. не хочется сводить все к копировать и вставить.

Это понятно было сразу.
По этому я предложил загрузить в контроллер первый пример именно мигание светодиодом без delay. Ведь есть пример проще. Я Вам дал намёк. Любое ваше устройство, которое будет сделано так или иначе, в процессе работы потребует отсчета какого-то времени. И если использовать delay вместо millis, Вы рано или поздно поймете, что delay замораживает исполнение кода = вешает контроллер.

Я сам начинал с грубейших ошибок и часто без понимания ЧТО я делаю копипастил чужой код. Это ни хорошо, ни плохо. Главная цель - запустить, вторичная - разобраться. (у меня так)
Когда всё заработало, можно посидеть и поразбираться, а почему так и не иначе.

Поделиться сообщением


Ссылка на сообщение
1 час назад, VALKNUT сказал(а):

Вы рано или поздно поймете, что delay замораживает исполнение кода = вешает контроллер.

Так в мат части у Алекса Гувера об этом сказано. Я и решил не использовать данный вариант.

1 час назад, VALKNUT сказал(а):

Это понятно было сразу.
По этому я предложил загрузить в контроллер первый пример именно мигание светодиодом без delay. Ведь есть пример проще.

Интересно, что же помогло это сразу понять.

1 час назад, VALKNUT сказал(а):

 Я Вам дал намёк.

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

1 час назад, VALKNUT сказал(а):

Главная цель - запустить, вторичная - разобраться. (у меня так)

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

Поделиться сообщением


Ссылка на сообщение
2 минут назад, Haaans сказал(а):

Интересно, что же помогло это сразу понять.

когда Вы попросили помочь разобраться., а не сделать за Вас.

Поделиться сообщением


Ссылка на сообщение

В процессе "AQLUX" - просто и без наворотов.
Датчик(VEML7700) + контроллер(Arduino Nano) + OLED дисплей(SH1106).
image.jpg.5fd1f9bdede8b4bf22e4da7ed3308b17.jpg

- Питание по шнурку USB: от зарядного, от компа, от смартфона с OTG.
- Данные: на экран и в терминал USB (PuTTY / OTG софт*).
- Вывод на экран двух значений: с учетом прозрачности корпуса и без учета (как есть).
- Выносной датчик в герметичном корпусе.

ЗЫ. Потестил 2 датчика, которые измеряют LUX, этот датчик понравился больше.

*Софт для Android - любой, который умеет читать данные из Serial(USB). Но это возможно, если телефон поддерживает OTG.
Пробовал "Serial Monitor" и "USBTerminal" - обе программы корректно отображают поступающие данные.

Поделиться сообщением


Ссылка на сообщение
11 часов назад, VALKNUT сказал(а):

В процессе "AQLUX" - просто и без наворотов.

Провожу тестирование датчика и изучая вопрос, наткнулся на онлайн калькулятор "Convert Lux to PPFD - Online Calculator"
На фотке значение от пыха смартфона =)
image.thumb.png.8107929f95bce7fdd43d002ca7fe3c4e.png

 

Поделиться сообщением


Ссылка на сообщение
11 часов назад, VALKNUT сказал(а):

Софт для Android - любой, который умеет читать данные из Serial(USB)

Нельзя никак организовать по воздуху подобное общение? Вопрос не конкретно про вашу сборку, а вообще.

Поделиться сообщением


Ссылка на сообщение

6 часов назад, Haaans сказал(а):

Нельзя никак организовать по воздуху подобное общение? Вопрос не конкретно про вашу сборку, а вообще.

Конечно можно. Но.

Представим, что "устройство" попало в руки человеку, далекому от айти. Вместо того, чтоб включить и увидеть результат измерений, он должен будет запустить браузер в компе или браузер в смартфоне и ввести непонятные ему цифры IP адреса. А если рядом нет wi-fi роутера, то создать на смартфоне точку доступа, с именем и паролем зашитыми в прошивке и только после этого "массажа деревянной ноги" начинать измерения. Хорошо, если он это делает дома. А если друзья попросили измерить?

Для работы по воздуху (результат в браузере), вместо Arduino Nano можно использовать любую ESP. Но на мой взгляд, чем меньше действий от включения, до получения первого результата измерений, тем юзабельней устройство.

Более того, я уверен на 99%, что гипотетический пользователь не станет заморачиваться даже с выводом инфы через USB. Дисплея, даже самого миниатюрного, хватит для получения всей необходимой информации. Планирую сделать сенсорную кнопку "селектор", которой можно будет вывести результат и в люксах и в PPFD. Ну или что-то там еще, что может потребоваться... что расчитывается имея люксы (вот это бы обсудить*).

*Обсудить ЧТО измерять, а не куда послать полученные данные.

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

 

Поделиться сообщением


Ссылка на сообщение

@VALKNUT , перечитал вопрос и ответ. Похоже я спросил про одно, а вы ответили про другое. Попробую иначе с примером. Вот есть контроллер с ви фи и блютуз + датчик температуры 1 штука. Без интернета , вайфай, кабеля в смартфон и прочего просто по блютуз можно увидеть температуру? Вопрос подразумевает ответ да или нет. 

Поделиться сообщением


Ссылка на сообщение
4 минут назад, Haaans сказал(а):

по блютуз можно увидеть температуру? Вопрос подразумевает ответ да или нет. 

Вероятно да, но я с блютузами не заморачивался ни разу. =)))
Наводящий вопрос: какое приложение смартфона должно подключиться к "устрйству" по блютузу и что-то показать?

4 минут назад, Haaans сказал(а):

Похоже я спросил про одно, а вы ответили про другое.

Да, я ответил про устройство, которое делаю я, т.к. Вы процитировали мое сообщение относящееся именно к нему и не уточнили, что спрашиваете про устройство, которое делаете Вы.

Ну и до кучи: ESP8266 имеет только Wi-Fi интерфейс. Что кагбэ намекает, что подключиться к блютузу не выйдет =))

Поделиться сообщением


Ссылка на сообщение
15 минут назад, VALKNUT сказал(а):

Да, я ответил про устройство, которое делаю я, т.к. Вы процитировали мое сообщение относящееся именно к нему и не уточнили, что спрашиваете про устройство, которое делаете Вы.

Прикольно тут у вас)))))

Поделиться сообщением


Ссылка на сообщение
17 минут назад, VALKNUT сказал(а):

Наводящий вопрос: какое приложение смартфона должно подключиться к "устрйству" по блютузу и что-то показать?

Это был следующий шаг в размышлениях, но не очевидный (доя меня). 😂

18 минут назад, VALKNUT сказал(а):

Да, я ответил про устройство, которое делаю я, т.к. Вы процитировали мое сообщение относящееся именно к нему и не уточнили, что спрашиваете про устройство, которое делаете Вы

Учту свою ошибку 

18 минут назад, VALKNUT сказал(а):

Ну и до кучи: ESP8266 имеет только Wi-Fi интерфейс. Что кагбэ намекает, что подключиться к блютузу не выйдет =))

Нужно модуль расширения 😂 

без шуток. Тут я перемудрил 

3 минут назад, AlexLi сказал(а):

Прикольно тут у вас)))))

А если слово устройство заменить на аквариум то…

Поделиться сообщением


Ссылка на сообщение
10 минут назад, Haaans сказал(а):

Нужно модуль расширения 😂 

без шуток. Тут я перемудрил 

Тогда не модуль, а ESP32, там и блютуз есть =) Но смысла нет =)

Поделиться сообщением


Ссылка на сообщение
17 минут назад, VALKNUT сказал(а):

Тогда не модуль, а ESP32, там и блютуз есть =) Но смысла нет =)

Супер. Благодарю за помощь в прекращении жевания мыслительной жвачки

Поделиться сообщением


Ссылка на сообщение
В 12.08.2024 - 11:32, VALKNUT сказал(а):

- Данные: на экран и в терминал USB (PuTTY / OTG софт*)

Он по оператору Print выводит данные только на внешний 2-х строчный дисплей или есть эмуляция чтобы через USB на компе данные увидеть?

Или для компа что другое?

Поделиться сообщением


Ссылка на сообщение
5 минут назад, Lx671 сказал(а):

Он по оператору Print выводит данные только на внешний 2-х строчный дисплей или есть эмуляция чтобы через USB на компе данные увидеть?

Или для компа что другое?

Serial.print("text"); // выводит в СОМ порт
image.jpg.75821d19678e84acf1a121f9b6604f07.jpg

display.print("text"); // выводит на экран

Поделиться сообщением


Ссылка на сообщение

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

За основу беру пример BlinkWithouDelay. Он мне нужен, чтобы не мудрить самому, а просто его попробую адаптировать под свою задачу.

Для простоты отключаю один датчик. Но в мониторе порта показывает температуру в две строки с одинаковым адресом. Это понятно скетч изначально написан для ДВУХ датчиков. Это потом исправлю.

Update: Я сломаль :). На сегодня хватит.

Поделиться сообщением


Ссылка на сообщение

Так. В продолжение вчерашних "упражнений". Взял пример для одного датчика температуры.

Добавил в него таймер опроса температуры.

Добавил функцию на включение и выключение диода в случае превышения температуры заданного значения. Но компилятор ругается на строку 147. Вывод

Цитата

Ошибка компиляции: значение void не игнорируется так, как должно быть

Поиск внятного ничего не дал.

Под спойлером весь код скетча.

Спойлер

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

//============
//Данные для счетчика времени для опросов
unsigned long previousMillis = 0; // Нулевое значение для начала отсчета
const long interval = 3000; //Длительность паузы между опросами
float tempNado = 30.0; //Температура после превышения которой включается диод
const int ledPin = LED_BUILTIN; //определит пин на который прицеплен диод установленный на плате.
int ledState = LOW; //Задаем изначальное положение диода ВЫКЛ. Она будет перезаписываться в зависимости от температуры
float currentTemp; //задаю переменную для получения температуры
//=============

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;

/*
 * Setup function. Here we do the basics
 */
void setup(void)
{
  // start serial port
  Serial.begin(9600);
  Serial.println("Dallas Temperature IC Control Library Demo");
  //=================
  pinMode(ledPin, OUTPUT); //Переключение пина светодиода в ВЫХОДНОЙ режим
  //=================
  // locate devices on the bus
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: "); 
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");
  
  // Assign address manually. The addresses below will beed to be changed
  // to valid device addresses on your bus. Device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  // Note that you will need to use your specific address here
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

  // Method 1:
  // Search for devices on the bus and assign based on an index. Ideally,
  // you would do this to initially discover addresses on the bus and then 
  // use those addresses and manually assign them (see above) once you know 
  // the devices on your bus (and assuming they don't change).
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0"); 
  
  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices, 
  // or you have already retrieved all of them. It might be a good idea to 
  // check the CRC to make sure you didn't get garbage. The order is 
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  //printAddress(insideThermometer);
  Serial.println();

  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
  sensors.setResolution(insideThermometer, 9);
 
  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC); 
  Serial.println();
  //================
  void opros (); //функция для перезапуска счетчика времени 
  //================
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress)
{
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  float tempC = sensors.getTempC(deviceAddress);
  if(tempC == DEVICE_DISCONNECTED_C) 
  {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
}
/*
 * Main function. It will request the tempC from the sensors and display on Serial.
 */

// function to print a device address
//void printAddress(DeviceAddress deviceAddress)
//{
  //for (uint8_t i = 0; i < 8; i++)
  /*{
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
*/
void loop (void) {
  //счетчик на Millis для повторения опроса через заданый промежуток в interval
  unsigned long currentMillis = millis(); 
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    opros ();
  }
}
void opros ()
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures(); // Send the command to get temperatures
  Serial.println("DONE");
  
  // It responds almost immediately. Let's print out the data
  printTemperature(insideThermometer); // Use a simple function to print out the data
}
//Ниже функция сравнения температуры с заданым значением.
void compare () 
{
  currentTemp = sensors.requestTemperatures(); //задаю переменную для получения температуры
  if (currentTemp >= tempNado) {
    ledState = HIGH;
   } else {
      ledState = LOW;
    }

    // set the LED with the ledState of the variable:
    digitalWrite(ledPin, ledState);
}

 

Я понимаю, что надо что-то сделать с sensors.requestTemperatures(), но не понимаю  что. Есть только догадка, что связано как-то с типом данных, которые выдает датчик или с тем что я указал в начале функции.

Поделиться сообщением


Ссылка на сообщение
7 часов назад, Haaans сказал(а):

Я понимаю, что надо что-то сделать с sensors.requestTemperatures(), но не понимаю  что.

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

Спойлер

// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

//============
//Данные для счетчика времени для опросов
unsigned long previousMillis = 0;  // Нулевое значение для начала отсчета
const long interval = 3000;        //Длительность паузы между опросами
float tempNado = 30.0;             //Температура после превышения которой включается диод
const int ledPin = LED_BUILTIN;    //определит пин на который прицеплен диод установленный на плате.
int ledState = LOW;                //Задаем изначальное положение диода ВЫКЛ. Она будет перезаписываться в зависимости от температуры
float currentTemp, tempC;                 //задаю переменную для получения температуры
//=============

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;

/*
 * Setup function. Here we do the basics
 */
void setup(void) {
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");
  //=================
  pinMode(ledPin, OUTPUT);  //Переключение пина светодиода в ВЫХОДНОЙ режим
  //=================
  // locate devices on the bus
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  // Assign address manually. The addresses below will beed to be changed
  // to valid device addresses on your bus. Device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  // Note that you will need to use your specific address here
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

  // Method 1:
  // Search for devices on the bus and assign based on an index. Ideally,
  // you would do this to initially discover addresses on the bus and then
  // use those addresses and manually assign them (see above) once you know
  // the devices on your bus (and assuming they don't change).
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");

  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices,
  // or you have already retrieved all of them. It might be a good idea to
  // check the CRC to make sure you didn't get garbage. The order is
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  //printAddress(insideThermometer);
  Serial.println();

  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
  sensors.setResolution(insideThermometer, 9);

  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
  //================
  void opros();  // первый опрос датчика, потом по таймеру -----------//функция для перезапуска счетчика времени
  //================
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress) {
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  tempC = sensors.getTempC(deviceAddress);
  if (tempC == DEVICE_DISCONNECTED_C) {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
}
/*
 * Main function. It will request the tempC from the sensors and display on Serial.
 */

// function to print a device address
//void printAddress(DeviceAddress deviceAddress)
//{
//for (uint8_t i = 0; i < 8; i++)
/*{
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
*/

void opros() {

  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();  // Send the command to get temperatures
  Serial.println("DONE");

  // It responds almost immediately. Let's print out the data
  printTemperature(insideThermometer);  // Use a simple function to print out the data
}

//Ниже функция сравнения температуры с заданым значением.
void compare() {
  sensors.requestTemperatures();  //задаю переменную для получения температуры
  currentTemp = tempC;
  if (currentTemp >= tempNado) {
    ledState = HIGH;
  } else {
    ledState = LOW;
  }

  // set the LED with the ledState of the variable:
  digitalWrite(ledPin, ledState);
}

void loop(void) {
  //счетчик на Millis для повторения опроса через заданый промежуток в interval
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    opros();
  }
}

 

1. Переменную tempC сделал глобальной, чтоб она виделась в любом месте скетча "float currentTemp, tempC;"
2. Переменной "currentTemp" присваиваю значение переменной "tempC" (но можно обращаться напрямую к переменной "tempC", без "доставщика пиццы".
Примерно так:

void compare() {
  sensors.requestTemperatures();  // выполняю опрос датчика
  if (tempC >= tempNado) {        // сравниваю данные с датчика с необходимыми
    ledState = HIGH;
  } else {
    ledState = LOW;
  }

3. Вынес "void loop() {}" в конец скетча. На работу не влияет, привычка =)
4. Зачем отдельно делать "void compare() {}"? Где вызов этой функции в скетче?
Надо содержимое "compare" перенести в "opros"

void opros() {
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();  // Send the command to get temperatures
  Serial.println("DONE");

  //printTemperature(insideThermometer);  // Use a simple function to print out the data

  tempC = sensors.getTempC(deviceAddress);
  if (tempC == DEVICE_DISCONNECTED_C) {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.println(tempC);
  
  if (currentTemp >= tempNado) {
    ledState = HIGH;
  } else {
    ledState = LOW;
  }

  digitalWrite(ledPin, ledState);   // set the LED with the ledState of the variable:
}

5. Зачем нужна функция "void printTemperature(DeviceAddress deviceAddress) {}"?
Всю работу выполняет "void opros() {}" - "компания с кучей доставщиков пиццы" - не нужна, "пицца перед нами на столе, нужно просто её взять"

Поделиться сообщением


Ссылка на сообщение
1 час назад, VALKNUT сказал(а):

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

О, об этом где-то в документах на библиотеку говорится верно?

1 час назад, VALKNUT сказал(а):

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

  Развернуть скрытое содержание


// Include the libraries we need
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into port 2 on the Arduino
#define ONE_WIRE_BUS 2

//============
//Данные для счетчика времени для опросов
unsigned long previousMillis = 0;  // Нулевое значение для начала отсчета
const long interval = 3000;        //Длительность паузы между опросами
float tempNado = 30.0;             //Температура после превышения которой включается диод
const int ledPin = LED_BUILTIN;    //определит пин на который прицеплен диод установленный на плате.
int ledState = LOW;                //Задаем изначальное положение диода ВЫКЛ. Она будет перезаписываться в зависимости от температуры
float currentTemp, tempC;                 //задаю переменную для получения температуры
//=============

// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);

// arrays to hold device address
DeviceAddress insideThermometer;

/*
 * Setup function. Here we do the basics
 */
void setup(void) {
  // start serial port
  Serial.begin(115200);
  Serial.println("Dallas Temperature IC Control Library Demo");
  //=================
  pinMode(ledPin, OUTPUT);  //Переключение пина светодиода в ВЫХОДНОЙ режим
  //=================
  // locate devices on the bus
  Serial.print("Locating devices...");
  sensors.begin();
  Serial.print("Found ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" devices.");

  // report parasite power requirements
  Serial.print("Parasite power is: ");
  if (sensors.isParasitePowerMode()) Serial.println("ON");
  else Serial.println("OFF");

  // Assign address manually. The addresses below will beed to be changed
  // to valid device addresses on your bus. Device address can be retrieved
  // by using either oneWire.search(deviceAddress) or individually via
  // sensors.getAddress(deviceAddress, index)
  // Note that you will need to use your specific address here
  //insideThermometer = { 0x28, 0x1D, 0x39, 0x31, 0x2, 0x0, 0x0, 0xF0 };

  // Method 1:
  // Search for devices on the bus and assign based on an index. Ideally,
  // you would do this to initially discover addresses on the bus and then
  // use those addresses and manually assign them (see above) once you know
  // the devices on your bus (and assuming they don't change).
  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");

  // method 2: search()
  // search() looks for the next device. Returns 1 if a new address has been
  // returned. A zero might mean that the bus is shorted, there are no devices,
  // or you have already retrieved all of them. It might be a good idea to
  // check the CRC to make sure you didn't get garbage. The order is
  // deterministic. You will always get the same devices in the same order
  //
  // Must be called before search()
  //oneWire.reset_search();
  // assigns the first address found to insideThermometer
  //if (!oneWire.search(insideThermometer)) Serial.println("Unable to find address for insideThermometer");

  // show the addresses we found on the bus
  Serial.print("Device 0 Address: ");
  //printAddress(insideThermometer);
  Serial.println();

  // set the resolution to 9 bit (Each Dallas/Maxim device is capable of several different resolutions)
  sensors.setResolution(insideThermometer, 9);

  Serial.print("Device 0 Resolution: ");
  Serial.print(sensors.getResolution(insideThermometer), DEC);
  Serial.println();
  //================
  void opros();  // первый опрос датчика, потом по таймеру -----------//функция для перезапуска счетчика времени
  //================
}

// function to print the temperature for a device
void printTemperature(DeviceAddress deviceAddress) {
  // method 1 - slower
  //Serial.print("Temp C: ");
  //Serial.print(sensors.getTempC(deviceAddress));
  //Serial.print(" Temp F: ");
  //Serial.print(sensors.getTempF(deviceAddress)); // Makes a second call to getTempC and then converts to Fahrenheit

  // method 2 - faster
  tempC = sensors.getTempC(deviceAddress);
  if (tempC == DEVICE_DISCONNECTED_C) {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.print(tempC);
}
/*
 * Main function. It will request the tempC from the sensors and display on Serial.
 */

// function to print a device address
//void printAddress(DeviceAddress deviceAddress)
//{
//for (uint8_t i = 0; i < 8; i++)
/*{
    if (deviceAddress[i] < 16) Serial.print("0");
    Serial.print(deviceAddress[i], HEX);
  }
}
*/

void opros() {

  // call sensors.requestTemperatures() to issue a global temperature
  // request to all devices on the bus
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();  // Send the command to get temperatures
  Serial.println("DONE");

  // It responds almost immediately. Let's print out the data
  printTemperature(insideThermometer);  // Use a simple function to print out the data
}

//Ниже функция сравнения температуры с заданым значением.
void compare() {
  sensors.requestTemperatures();  //задаю переменную для получения температуры
  currentTemp = tempC;
  if (currentTemp >= tempNado) {
    ledState = HIGH;
  } else {
    ledState = LOW;
  }

  // set the LED with the ledState of the variable:
  digitalWrite(ledPin, ledState);
}

void loop(void) {
  //счетчик на Millis для повторения опроса через заданый промежуток в interval
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    opros();
  }
}

 

1. Переменную tempC сделал глобальной, чтоб она виделась в любом месте скетча "float currentTemp, tempC;"
2. Переменной "currentTemp" присваиваю значение переменной "tempC" (но можно обращаться напрямую к переменной "tempC", без "доставщика пиццы".
Примерно так:


void compare() {
  sensors.requestTemperatures();  // выполняю опрос датчика
  if (tempC >= tempNado) {        // сравниваю данные с датчика с необходимыми
    ledState = HIGH;
  } else {
    ledState = LOW;
  }

3. Вынес "void loop() {}" в конец скетча. На работу не влияет, привычка =)
4. Зачем отдельно делать "void compare() {}"? Где вызов этой функции в скетче?
Надо содержимое "compare" перенести в "opros"


void opros() {
  Serial.print("Requesting temperatures...");
  sensors.requestTemperatures();  // Send the command to get temperatures
  Serial.println("DONE");

  //printTemperature(insideThermometer);  // Use a simple function to print out the data

  tempC = sensors.getTempC(deviceAddress);
  if (tempC == DEVICE_DISCONNECTED_C) {
    Serial.println("Error: Could not read temperature data");
    return;
  }
  Serial.print("Temp C: ");
  Serial.println(tempC);
  
  if (currentTemp >= tempNado) {
    ledState = HIGH;
  } else {
    ledState = LOW;
  }

  digitalWrite(ledPin, ledState);   // set the LED with the ledState of the variable:
}

5. Зачем нужна функция "void printTemperature(DeviceAddress deviceAddress) {}"?
Всю работу выполняет "void opros() {}" - "компания с кучей доставщиков пиццы" - не нужна, "пицца перед нами на столе, нужно просто её взять"

1 и 2 шаги не понимаю зачем делать.

4. Отдельно вынес в рамках удобства работы над ошибками. Принимаю что логично внести внутрь опрос.

5. Исходный пример не трогал, цель была диод включить. Отсечение лишнего отложил на потом. Но вероятно «логику» как подход надо менять 

Поделиться сообщением


Ссылка на сообщение
25 минут назад, Haaans сказал(а):

О, об этом где-то в документах на библиотеку говорится верно?

Чукча не читатель, чукча писатель (с) анекдот.
Я не знаю про документы на библиотеку, ни разу не открывал =)

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

Спойлер

#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2              // Назначем пин OneWare

//============						// Данные для счетчика времени для опросов
unsigned long previousMillis = 0;   // Нулевое значение для начала отсчета
const long interval = 3000;         // Длительность паузы между опросами
byte DSResolution = 13;             // Разрешение датчика температуры
float tempC;                        // Задаем переменную текущей температуры
float tempNado = 30.0;              // Температура после превышения которой включается диод
const int ledPin = LED_BUILTIN;     // Определит пин на который прицеплен диод установленный на плате.
//int ledState = LOW;               // Задаем изначальное положение диода ВЫКЛ. Она будет перезаписываться в зависимости от температуры
bool ledState = false;              // Задаем изначальное положение диода ВЫКЛ. Она будет перезаписываться в зависимости от температуры
//=============

OneWire oneWire(ONE_WIRE_BUS);      // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
DeviceAddress insideThermometer;    // arrays to hold device address

void setup(void) {
  Serial.begin(115200);
  Serial.println("Запуск устройства...");
  //=================
  pinMode(ledPin, OUTPUT);          // Назначение пина светодиода в ВЫХОДНОЙ режим
  //=================

  Serial.print("Поиск датчиков...");
  sensors.begin();
  Serial.print("Найдено ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" датчиков.");

  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");

  //================
  void opros (); //функция для перезапуска счетчика времени
  //================
}

void opros() {
  sensors.setResolution(insideThermometer, DSResolution);       // Задаем разрешение датчика из переменной
  sensors.requestTemperatures();                                // Посылаем датчику запрос температуры

  tempC = sensors.getTempC(insideThermometer);                  // В переменную пишем полученные данные от датчика(такого-то)
  if (tempC == DEVICE_DISCONNECTED_C) {                         // Если адрес/датчик не обнаружены, сообщаем об ошибке
    Serial.println("Error: Could not read temperature data");   // Сообщение об ошибке
    return;                                                     // Возвращаемся
  } else {                                                      // Если же адрес/датчик обнаружены, пишем данные в терминал
    Serial.print("Temp C: "); Serial.println(tempC);            // Данные в терминал
  }

  if (tempC >= tempNado) {                                      // Сравниваем данные датчика и контролируемой температуры
    ledState = HIGH;                                            // Если текущая температура больше или равна нужной
  } else {                                                      // Или
    ledState = LOW;                                             // Если текущая температура не больше и не равна нужной
  }
  digitalWrite(ledPin, ledState);                               // Зажигаем или тушим светодиод
}

void loop (void) {
  //счетчик на Millis для повторения опроса через заданый промежуток в interval
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    opros ();
  }
}

 


 

Поделиться сообщением


Ссылка на сообщение
2 минут назад, VALKNUT сказал(а):

Чукча не читатель, чукча писатель (с) анекдот.
Я не знаю про документы на библиотеку, ни разу не открывал =)

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

  Развернуть скрытое содержание


#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2              // Назначем пин OneWare

//============						// Данные для счетчика времени для опросов
unsigned long previousMillis = 0;   // Нулевое значение для начала отсчета
const long interval = 3000;         // Длительность паузы между опросами
byte DSResolution = 13;             // Разрешение датчика температуры
float tempC;                        // Задаем переменную текущей температуры
float tempNado = 30.0;              // Температура после превышения которой включается диод
const int ledPin = LED_BUILTIN;     // Определит пин на который прицеплен диод установленный на плате.
//int ledState = LOW;               // Задаем изначальное положение диода ВЫКЛ. Она будет перезаписываться в зависимости от температуры
bool ledState = false;              // Задаем изначальное положение диода ВЫКЛ. Она будет перезаписываться в зависимости от температуры
//=============

OneWire oneWire(ONE_WIRE_BUS);      // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire);// Pass our oneWire reference to Dallas Temperature.
DeviceAddress insideThermometer;    // arrays to hold device address

void setup(void) {
  Serial.begin(115200);
  Serial.println("Запуск устройства...");
  //=================
  pinMode(ledPin, OUTPUT);          // Назначение пина светодиода в ВЫХОДНОЙ режим
  //=================

  Serial.print("Поиск датчиков...");
  sensors.begin();
  Serial.print("Найдено ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" датчиков.");

  if (!sensors.getAddress(insideThermometer, 0)) Serial.println("Unable to find address for Device 0");

  //================
  void opros (); //функция для перезапуска счетчика времени
  //================
}

void opros() {
  sensors.setResolution(insideThermometer, DSResolution);       // Задаем разрешение датчика из переменной
  sensors.requestTemperatures();                                // Посылаем датчику запрос температуры

  tempC = sensors.getTempC(insideThermometer);                  // В переменную пишем полученные данные от датчика(такого-то)
  if (tempC == DEVICE_DISCONNECTED_C) {                         // Если адрес/датчик не обнаружены, сообщаем об ошибке
    Serial.println("Error: Could not read temperature data");   // Сообщение об ошибке
    return;                                                     // Возвращаемся
  } else {                                                      // Если же адрес/датчик обнаружены, пишем данные в терминал
    Serial.print("Temp C: "); Serial.println(tempC);            // Данные в терминал
  }

  if (tempC >= tempNado) {                                      // Сравниваем данные датчика и контролируемой температуры
    ledState = HIGH;                                            // Если текущая температура больше или равна нужной
  } else {                                                      // Или
    ledState = LOW;                                             // Или если текущая температура не больше или не равна нужной
  }
  digitalWrite(ledPin, ledState);                               // Зажигаем или тушим светодиод
}

void loop (void) {
  //счетчик на Millis для повторения опроса через заданый промежуток в interval
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    opros ();
  }
}

 


 

Супер. Посмотрю. И чтобы не донимать вопросами займусь уроками от Алекса Гайвера

Поделиться сообщением


Ссылка на сообщение
1 час назад, VALKNUT сказал(а):

скетч в качестве основы

А это не полный скетч, который он просил?

1 час назад, VALKNUT сказал(а):

ledState

Где вы привязываете эту переменную к конкретному выходу? Как-то не нашел??

Поделиться сообщением


Ссылка на сообщение
54 минут назад, Lx671 сказал(а):

Где вы привязываете эту переменную к конкретному выходу? Как-то не нашел??

digitalWrite(ledPin, ledState);
2 часов назад, Haaans сказал(а):

pinMode(ledPin, OUTPUT);

 

Поделиться сообщением


Ссылка на сообщение
1 час назад, Lx671 сказал(а):

Где вы привязываете эту переменную к конкретному выходу? Как-то не нашел??

const int ledPin = LED_BUILTIN;     // Определит пин на который прицеплен диод установленный на плате.

Только что, Haaans сказал(а):

const int ledPin = LED_BUILTIN;

Смотреть пример BlinkWithoutDelay.

Поделиться сообщением


Ссылка на сообщение

Допилил "Термоконтроль" для серверной..
Так же бот телеграм отправляет сообщение о запуске контрольки с текущей (при запуске) температурой в помещении.

Спойлер

 

На Компе
image.thumb.png.65776cd497e7c76b9ce5d7c77feaed76.png

На смартфоне
image.thumb.png.67fd95dea9697ff748538fbc4f032b9f.png

 

Можно собираться в отпуск =)))
ЗЫ. Внешний адрес так же сделал доступным, чтоб контролить удаленно.
image.jpg.cd6f2c34fcc42ed5530c3edd44c9aa16.jpg

Поделиться сообщением


Ссылка на сообщение
В 16.08.2024 - 11:43, VALKNUT сказал(а):

Можно собираться в отпуск =)))

Хватит работать)) 

Такой модуль случайно не изучали - https://nuttx.apache.org/docs/latest/platforms/xtensa/esp32/boards/esp32-audio-kit/index.html

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

Там есть аудио_вход, мне надо кусок звука затащить и анализировать.

Поделиться сообщением


Ссылка на сообщение

13 минут назад, Lx671 сказал(а):

Хватит работать)) 

Такой модуль случайно не изучали - https://nuttx.apache.org/docs/latest/platforms/xtensa/esp32/boards/esp32-audio-kit/index.html

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

Там есть аудио_вход, мне надо кусок звука затащить и анализировать.

Увы, не сталкивался.

Поделиться сообщением


Ссылка на сообщение

@VALKNUT, привет. На что обратить внимание при выборе реле, на которое esp будет давать сигнал? Сила тока?

что нужно купить чтобы с esp регулировать яркость светодидной ленты?

а и дисплей для как выбирать для температуры и возможно счетчика по свету (сколько времени светит).

корзинку на али собираю. Вот вопросики появились. 

Поделиться сообщением


Ссылка на сообщение
1 час назад, Haaans сказал(а):

@VALKNUT, привет. На что обратить внимание при выборе реле, на которое esp будет давать сигнал? Сила тока?

что нужно купить чтобы с esp регулировать яркость светодидной ленты?

а и дисплей для как выбирать для температуры и возможно счетчика по свету (сколько времени светит).

корзинку на али собираю. Вот вопросики появились. 

1. Реле. Они есть разного типа и обычные и твердотельные.
Обычные проще и универсальней в коммутации, т.к. оперируют "сухими" контактами.
image.jpg.40833978195356fa64a6a96d91266f55.jpg
Твердотельные только для 220В и до 2А нагрузки. Их прелесть в отсутствии звука, это реально прелесть!
image.thumb.png.0e2faf9fb6dacbd510af6a3c0d80c40e.png

2. Яркость ленты - очень просто.
image.jpg.d5f11d8f0779348376bea3151681a716.jpg
- LR7843 - 30V 161A
- AOD4184 - 40V 50A
- FR120N - 100V 9.4A

3. Дисплеи.
Здесь полное раздолье, но лучше для начала выбрать с интерфейсом I2C (4пин), а не SPI(7пин).
Их множество и TFT и OLED.
Для тестов и общего понимания работы с дисплеями хватит малыша SSD1306 (0.9")
image.jpg.822c4e79fcd16080ff36c9aaa5e9ae3f.jpg

Или чуть крупней SH1106 (1.3")
image.jpg.4e00c32323299355ff21e79478c57ddb.jpg

Поделиться сообщением


Ссылка на сообщение
39 минут назад, VALKNUT сказал(а):

1. Реле

А ток потребления реле не нужно учитывать?

Поделиться сообщением


Ссылка на сообщение
1 минуту назад, Haaans сказал(а):

А ток потребления реле не нужно учитывать?

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

Поделиться сообщением


Ссылка на сообщение

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

×