RSS блога
Подписка
Простейшая DIY интернет-метеостанция за 5$
- Цена: $1.38
- Перейти в магазин
Сегодня будем делать простейшую интернет-метеостанцию. Никаких выносных датчиков, никаких дисплеев — просто измеряет температуру-влажность-давление и отправляет в интернет, на сайты narodmon.ru и www.wunderground.com. Как говорится, добавь и свою могучую кучку в гору мировой бигдаты!!!
Нам понадобится платка Wemos D1 Mini (клоник за 2$), платка с датчиком BME280 (2.55$), какой-нибудь корпус и wi-fi-роутер с интернетом.
Схема простая до безобразия.
Главное выполнить всё на пайке, а не на штырьках, а то от дребезга контактов у BME280 иногда сносит крышу и он начинает выдавать полный бред, пока ему питание не передернешь.
Вот так выглядит функционально полностью рабочий полуфабрикат метеостанции.
Далее нужно упаковать это в корпус и повесить за окно. Если есть возможность разместить метеостанцию на западной стороне — никаких проблем. Но у меня такой возможности нет и примерно 4ч в день метеостанция будет на солнце, поэтому я пока еще в раздумьях — как-бы снизить погрешность без громоздкой жалюзийной защиты датчика? Если знаете хорошие варианты — предлагайте в каментах. Питается вся конструкция от USB-порта wifi-роутера — это позволяет, при необходимости, удаленно перезагрузить метеостанцию вместе с роутером.
Теперь по софту — будем использовать Arduino IDE. Там всё стандартно — устанавливаем, в меню выбираем: Инструменты->Плата->Lolin (Wemos) D1 R2 & mini, при необходимости, устанавливаем библиотеку Adafruit BME280 library и оукей. C китайскими платами на BME280 есть один нюанс — они могут быть с разным адресом. Обычно это 0x76 или 0x77, хотя бывают и более экзотичные варианты. В общем, если датчик вдруг не работает, то ищем на компе файл Adafruit_BME280.h, в нем ищем строчку #define BME280_ADDRESS (0x76) и в ней меняем 0x76 на 0x77, ну или наоборот.
Да, вот такой скетч — кривенький, но простой и рабочий. Раз в 10 минут делает по 30 отсчетов, усредняет и отправляет показания по протоколу MQTT на narodmon.ru и по протоколу HTTP на wunderground.com. Хотел еще добавить постинг на openweathermap.org, но ниасилил — в конце концов я же не настоящий сварщик и погроммист из меня примерно такой же, как балерина.
Само собой, предварительно нужно зарегистрироваться на обоих сайтах, а также получить на narodmon.ru пароль для MQTT (в справке по API) и зарегистрировать погодную станцию на wunderground.com, чтобы получить ID и Key.
На этом, пожалуй, всё. Думаю, тут всё просто и каждый, при желании, сможет модифицировать этот полуфабрикат под себя — добавить датчик освещенности или дождя, например. Можно подумать над deep sleep и автономным питанием на 4хАА или 5хАА и т.п…
Нам понадобится платка Wemos D1 Mini (клоник за 2$), платка с датчиком BME280 (2.55$), какой-нибудь корпус и wi-fi-роутер с интернетом.
Схема простая до безобразия.
Главное выполнить всё на пайке, а не на штырьках, а то от дребезга контактов у BME280 иногда сносит крышу и он начинает выдавать полный бред, пока ему питание не передернешь.
Вот так выглядит функционально полностью рабочий полуфабрикат метеостанции.
Далее нужно упаковать это в корпус и повесить за окно. Если есть возможность разместить метеостанцию на западной стороне — никаких проблем. Но у меня такой возможности нет и примерно 4ч в день метеостанция будет на солнце, поэтому я пока еще в раздумьях — как-бы снизить погрешность без громоздкой жалюзийной защиты датчика? Если знаете хорошие варианты — предлагайте в каментах. Питается вся конструкция от USB-порта wifi-роутера — это позволяет, при необходимости, удаленно перезагрузить метеостанцию вместе с роутером.
Теперь по софту — будем использовать Arduino IDE. Там всё стандартно — устанавливаем, в меню выбираем: Инструменты->Плата->Lolin (Wemos) D1 R2 & mini, при необходимости, устанавливаем библиотеку Adafruit BME280 library и оукей. C китайскими платами на BME280 есть один нюанс — они могут быть с разным адресом. Обычно это 0x76 или 0x77, хотя бывают и более экзотичные варианты. В общем, если датчик вдруг не работает, то ищем на компе файл Adafruit_BME280.h, в нем ищем строчку #define BME280_ADDRESS (0x76) и в ней меняем 0x76 на 0x77, ну или наоборот.
Скетч для Ардуинки
#include <ESP8266WiFi.h>
#include <Adafruit_BME280.h>
#include <PubSubClient.h>
Adafruit_BME280 bme; // I2C
// Replace with your network details
const char* ssid = «WIFINET»;
const char* password = «пароль_вайфай»;
float h, t, tF, p, pb, pin, dp, dpF;
char temperatureString[6];
char temperatureFString[6];
char dpString[6];
char dpFString[6];
char humidityString[6];
char pressureString[7];
char pressureInString[6];
#define SRV «narodmon.ru»
#define MAC «хх:dd:c2: хх:a3: хх» //МАК-адрес метеостанции
#define PASS «ххххх» // пароль для mqtt постинга на narodmon
#define USERNAME «yyyyyyyyy» // логин на narodmon
#define TOPIC «yyyyyyyy/BME280/»
#define SRV2 «weatherstation.wunderground.com»
#define StationID «ZZZZZZZ» // ID станции на сайте wunderground.com
#define PASS2 «xxxxx» // Key станции на сайте wunderground.com
//MQTT Narodmon
char server[] = SRV;
char authMethod[] = USERNAME;
char token[] = PASS;
char clientId[] = MAC;
char conntopic[] = TOPIC «status»;
//HTTP GET WUnderground
char server2[] = SRV2;
char authMethod2[] = StationID;
char token2[] = PASS2;
char webpage[] = «GET /weatherstation/updateweatherstation.php?»;
WiFiClient nmClient;
WiFiClient wuClient;
PubSubClient clientMQ(server, 1883, nmClient);
// only runs once on boot
void setup() {
// Initializing serial port for debugging purposes
Serial.begin(115200);
delay(10);
// Connecting to WiFi network
Serial.println();
Serial.print(«Connecting to „);
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.»);
}
Serial.println("");
Serial.println(«WiFi connected»);
// Printing the ESP IP address
Serial.println(WiFi.localIP());
Serial.println(F(«BME280 start»));
if (!bme.begin()) {
Serial.println(«Could not find a valid BME280 sensor, check wiring!»);
while (1);
}
}
// runs over and over again
void loop() {
getWeather();
doPublishNM(«humidity», String(h, 2));
doPublishNM(«temperature», String(t, 2));
doPublishNM(«pressure», String(p, 2));
doPublishWU(temperatureFString, pressureInString, humidityString, dpFString);
delay(600000);
}
void getWeather() {
h = 0;
float valh;
for (int i=0; i<30; i++) {
delay (random(50,500));
valh = bme.readHumidity();
Serial.print(valh);
Serial.print("\n");
h = h+valh;
}
h=h/30;
Serial.print("\n");
t = 0;
float valt;
for (int i=0; i<30; i++) {
delay (random(50,500));
valt = bme.readTemperature();
Serial.print(valt);
Serial.print("\n");
t = t+valt;
}
t=t/30;
tF=(t*1.8)+32;
Serial.print(tF);
p = 0;
float valp;
for (int i=0; i<30; i++) {
delay (random(50,500));
valp = bme.readPressure();
Serial.print(valp);
Serial.print("\n");
p = p+valp;
}
p=p/30/100.0F;
dp = t-((1-(h/100))/0.05);
dpF = (dp*1.8)+32;
pb = p/pow(2.718281828, -0.029*9.81*150/(8.31*(t+273.15))); // приводим абсолютное давление к уровню Балтийского моря (высота 150м)
pin = p*0.0296133971008484;
dtostrf(t, 5, 2, temperatureString);
dtostrf(tF, 4, 2, temperatureFString);
dtostrf(h, 5, 2, humidityString);
dtostrf(p, 6, 2, pressureString);
dtostrf(pin, 4, 2, pressureInString);
dtostrf(dpF, 5, 2, dpFString);
}
// MQTT публикация Narodmon.ru
void doPublishNM(String id, String value) {
// если не подключен, то подключаемся. Висит пока не подключится!!!
if (!!!clientMQ.connected()) {
Serial.print(«Reconnecting client to „); Serial.println(server);
while (!!!clientMQ.connect(clientId, authMethod, token, conntopic,0,0,“online»)) {
Serial.print(".");
delay(500);
}
Serial.print(«connected with: „); Serial.print(clientId); Serial.print(authMethod); Serial.print(token);
Serial.println();
}
String topic = TOPIC;
String payload = value;
// String topic += id;
topic.concat(id);
Serial.print(“Publishing on: „); Serial.println(topic);
Serial.print(“Publishing payload: „); Serial.println(payload);
if (clientMQ.publish(topic.c_str(), (char*) payload.c_str())) {
Serial.println(“Publish ok»);
} else {
Serial.println(«Publish failed»);
}
}
// HTTP GET публикация WUnderground
void doPublishWU(String temperatureFString, String pressureInString, String humidityString, String dpFString) {
if (wuClient.connect(server2, 80)) {
Serial.print(F("… Connected to server: "));
Serial.print(server2);
char c = wuClient.read();
Serial.print(F(", Server response: "));
Serial.write©;
Serial.println(F(""));
Serial.println(F("… Sending DATA "));
Serial.println(F(""));
wuClient.print(webpage);
Serial.print(webpage);
wuClient.print(«ID=»);
Serial.print(«ID=»);
wuClient.print(authMethod2);
Serial.print(authMethod2);
wuClient.print("&PASSWORD=");
Serial.print("&PASSWORD=");
wuClient.print(token2);
Serial.print(token2);
wuClient.print("&dateutc=");
Serial.print("&dateutc=");
wuClient.print(«now»);
Serial.print(«now»);
wuClient.print("&tempf=");
Serial.print("&tempf=");
wuClient.print(temperatureFString);
Serial.print(temperatureFString);
wuClient.print("&baromin=");
Serial.print("&baromin=");
wuClient.print(pressureInString);
Serial.print(pressureInString);
wuClient.print("&humidity=");
Serial.print("&humidity=");
wuClient.print(humidityString);
Serial.print(humidityString);
wuClient.print("&dewptf=");
Serial.print("&dewptf=");
wuClient.print(dpFString);
Serial.print(dpFString);
wuClient.print("&softwaretype=Arduino%20UNO%20version1&action=updateraw");
Serial.print("&softwaretype=Arduino%20UNO%20version1&action=updateraw");
//Finishing the communication
wuClient.println("/ HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n");
Serial.println(F("… Server Response:"));
while(wuClient.connected()) {
while (wuClient.available()) {
char c = wuClient.read();
Serial.print©;
}
}
wuClient.flush();
wuClient.stop();
}
else {
Serial.println(F(«Connection failed»));
char c = wuClient.read();
Serial.write©;
wuClient.flush();
wuClient.stop();}
}
#include <Adafruit_BME280.h>
#include <PubSubClient.h>
Adafruit_BME280 bme; // I2C
// Replace with your network details
const char* ssid = «WIFINET»;
const char* password = «пароль_вайфай»;
float h, t, tF, p, pb, pin, dp, dpF;
char temperatureString[6];
char temperatureFString[6];
char dpString[6];
char dpFString[6];
char humidityString[6];
char pressureString[7];
char pressureInString[6];
#define SRV «narodmon.ru»
#define MAC «хх:dd:c2: хх:a3: хх» //МАК-адрес метеостанции
#define PASS «ххххх» // пароль для mqtt постинга на narodmon
#define USERNAME «yyyyyyyyy» // логин на narodmon
#define TOPIC «yyyyyyyy/BME280/»
#define SRV2 «weatherstation.wunderground.com»
#define StationID «ZZZZZZZ» // ID станции на сайте wunderground.com
#define PASS2 «xxxxx» // Key станции на сайте wunderground.com
//MQTT Narodmon
char server[] = SRV;
char authMethod[] = USERNAME;
char token[] = PASS;
char clientId[] = MAC;
char conntopic[] = TOPIC «status»;
//HTTP GET WUnderground
char server2[] = SRV2;
char authMethod2[] = StationID;
char token2[] = PASS2;
char webpage[] = «GET /weatherstation/updateweatherstation.php?»;
WiFiClient nmClient;
WiFiClient wuClient;
PubSubClient clientMQ(server, 1883, nmClient);
// only runs once on boot
void setup() {
// Initializing serial port for debugging purposes
Serial.begin(115200);
delay(10);
// Connecting to WiFi network
Serial.println();
Serial.print(«Connecting to „);
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(“.»);
}
Serial.println("");
Serial.println(«WiFi connected»);
// Printing the ESP IP address
Serial.println(WiFi.localIP());
Serial.println(F(«BME280 start»));
if (!bme.begin()) {
Serial.println(«Could not find a valid BME280 sensor, check wiring!»);
while (1);
}
}
// runs over and over again
void loop() {
getWeather();
doPublishNM(«humidity», String(h, 2));
doPublishNM(«temperature», String(t, 2));
doPublishNM(«pressure», String(p, 2));
doPublishWU(temperatureFString, pressureInString, humidityString, dpFString);
delay(600000);
}
void getWeather() {
h = 0;
float valh;
for (int i=0; i<30; i++) {
delay (random(50,500));
valh = bme.readHumidity();
Serial.print(valh);
Serial.print("\n");
h = h+valh;
}
h=h/30;
Serial.print("\n");
t = 0;
float valt;
for (int i=0; i<30; i++) {
delay (random(50,500));
valt = bme.readTemperature();
Serial.print(valt);
Serial.print("\n");
t = t+valt;
}
t=t/30;
tF=(t*1.8)+32;
Serial.print(tF);
p = 0;
float valp;
for (int i=0; i<30; i++) {
delay (random(50,500));
valp = bme.readPressure();
Serial.print(valp);
Serial.print("\n");
p = p+valp;
}
p=p/30/100.0F;
dp = t-((1-(h/100))/0.05);
dpF = (dp*1.8)+32;
pb = p/pow(2.718281828, -0.029*9.81*150/(8.31*(t+273.15))); // приводим абсолютное давление к уровню Балтийского моря (высота 150м)
pin = p*0.0296133971008484;
dtostrf(t, 5, 2, temperatureString);
dtostrf(tF, 4, 2, temperatureFString);
dtostrf(h, 5, 2, humidityString);
dtostrf(p, 6, 2, pressureString);
dtostrf(pin, 4, 2, pressureInString);
dtostrf(dpF, 5, 2, dpFString);
}
// MQTT публикация Narodmon.ru
void doPublishNM(String id, String value) {
// если не подключен, то подключаемся. Висит пока не подключится!!!
if (!!!clientMQ.connected()) {
Serial.print(«Reconnecting client to „); Serial.println(server);
while (!!!clientMQ.connect(clientId, authMethod, token, conntopic,0,0,“online»)) {
Serial.print(".");
delay(500);
}
Serial.print(«connected with: „); Serial.print(clientId); Serial.print(authMethod); Serial.print(token);
Serial.println();
}
String topic = TOPIC;
String payload = value;
// String topic += id;
topic.concat(id);
Serial.print(“Publishing on: „); Serial.println(topic);
Serial.print(“Publishing payload: „); Serial.println(payload);
if (clientMQ.publish(topic.c_str(), (char*) payload.c_str())) {
Serial.println(“Publish ok»);
} else {
Serial.println(«Publish failed»);
}
}
// HTTP GET публикация WUnderground
void doPublishWU(String temperatureFString, String pressureInString, String humidityString, String dpFString) {
if (wuClient.connect(server2, 80)) {
Serial.print(F("… Connected to server: "));
Serial.print(server2);
char c = wuClient.read();
Serial.print(F(", Server response: "));
Serial.write©;
Serial.println(F(""));
Serial.println(F("… Sending DATA "));
Serial.println(F(""));
wuClient.print(webpage);
Serial.print(webpage);
wuClient.print(«ID=»);
Serial.print(«ID=»);
wuClient.print(authMethod2);
Serial.print(authMethod2);
wuClient.print("&PASSWORD=");
Serial.print("&PASSWORD=");
wuClient.print(token2);
Serial.print(token2);
wuClient.print("&dateutc=");
Serial.print("&dateutc=");
wuClient.print(«now»);
Serial.print(«now»);
wuClient.print("&tempf=");
Serial.print("&tempf=");
wuClient.print(temperatureFString);
Serial.print(temperatureFString);
wuClient.print("&baromin=");
Serial.print("&baromin=");
wuClient.print(pressureInString);
Serial.print(pressureInString);
wuClient.print("&humidity=");
Serial.print("&humidity=");
wuClient.print(humidityString);
Serial.print(humidityString);
wuClient.print("&dewptf=");
Serial.print("&dewptf=");
wuClient.print(dpFString);
Serial.print(dpFString);
wuClient.print("&softwaretype=Arduino%20UNO%20version1&action=updateraw");
Serial.print("&softwaretype=Arduino%20UNO%20version1&action=updateraw");
//Finishing the communication
wuClient.println("/ HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n");
Serial.println(F("… Server Response:"));
while(wuClient.connected()) {
while (wuClient.available()) {
char c = wuClient.read();
Serial.print©;
}
}
wuClient.flush();
wuClient.stop();
}
else {
Serial.println(F(«Connection failed»));
char c = wuClient.read();
Serial.write©;
wuClient.flush();
wuClient.stop();}
}
Да, вот такой скетч — кривенький, но простой и рабочий. Раз в 10 минут делает по 30 отсчетов, усредняет и отправляет показания по протоколу MQTT на narodmon.ru и по протоколу HTTP на wunderground.com. Хотел еще добавить постинг на openweathermap.org, но ниасилил — в конце концов я же не настоящий сварщик и погроммист из меня примерно такой же, как балерина.
Само собой, предварительно нужно зарегистрироваться на обоих сайтах, а также получить на narodmon.ru пароль для MQTT (в справке по API) и зарегистрировать погодную станцию на wunderground.com, чтобы получить ID и Key.
На этом, пожалуй, всё. Думаю, тут всё просто и каждый, при желании, сможет модифицировать этот полуфабрикат под себя — добавить датчик освещенности или дождя, например. Можно подумать над deep sleep и автономным питанием на 4хАА или 5хАА и т.п…
Самые обсуждаемые обзоры
+67 |
2871
116
|
+49 |
3210
64
|
+27 |
2058
36
|
+50 |
1862
35
|
BME + Sonnof Basic? прошитый 1MSmart и вуаля. Температура, влажность, Давление на смартфоне и тп.
Еще и с возможностью регилировки (управления внешними устройствами)
а в бесплатной прошивке sonoff basic выбирается один датчик
есть же в проге перераспределение
скл 1
сда 2
#include «HTU21D.h»
HTU21D _HTU21_Instance;
extern «C» {
#include «user_interface.h»;
}
unsigned long _HTU21_StartTime = 0UL;
float _HTU21_HOut = 0.00;
float _HTU21_TOut = 0.00;
void setup()
{
_HTU21_Instance.begin();
}
void loop()
{
//Плата:1
if( (_HTU21_StartTime ==0) || ( _isTimer(_HTU21_StartTime, 60000 ))) {
_HTU21_StartTime = millis();
_HTU21_HOut = _HTU21_Instance.readHumidity();
_HTU21_TOut = _HTU21_Instance.readTemperature();
}
}
bool _isTimer(unsigned long startTime, unsigned long period )
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
}
Зачем подключаете SDK функции через external C? Вы ведь ни одну SDK функцию в теле не вызываете. Тупо место на флешке занимаете.
Зачем esle после return? Если условие выполнится до esle не дойдет:) Имхо в таком случае лучше два if использовать тк глубокие ветвления занимают больше флеша.
If (bla-bla) return;
If (bla-bla) return;
На ес8266 мне RBD_Timer.h очень нравился и работал исправно, но вот код переписывается под есп32 и готов к новому )
— для esp32 тут
— для esp8266 тут
но для esp8266 есть нюансы
вот вам пример мигания без delay() и millis()
void changeState()
чтение данные с дачтика
а потом void setup
выводТ.attach(0.5, чтение данные с дачтика)
в теле функции которая вызывается ticker — в нашем случае readSensor() нельзя делать операции с network(wifi), serial и file!!!
На солнце конечно температуру
занижаетзавышает. Вот думаю добавить вентилятор, перед измерением воздух прогнать.Это если коробка с поверхностью, отражающей 100% падающего на нее излучения :) Я о таких поверхностях пока не слышал.
кроме
спереть со станции метеонаблюдений.Это «мониторинговая» станция — она собирает локальные показатели (температура, давление, влажность, скорость ветра...) и отправляет их в интернет на сервисы, которые собирают такую инфу по всему миру и на основе их уже делают свой прогноз.
Это станция альтруиста, а не эгоиста :)
Себестоимость где то 1000р
Вывод как на сайт автора, так и и народмонитор, оттуда на смартфон
Основная проблема найти тариф подходящий от опсоса работающего на даче. Там не нужно гигов инета за сотни рублей
На авито wi-Fi роутер, который перешивается в openwrt/ddwrt — я купил за 200 руб, но бывает всяко. За 500 точно найдёте. Или микротик какой маленький.
Ему в USB — свисток с симкой того провайдера, который вам удобен.
Всё. На даче интернет.
Сливайте оттуда себе на мобильник погоду/фотки/охранку/видеокамеры/ардуиновские проекты. Какие проблемы-то?..
В спящем режиме вся станция потребляет около 60 мкА (причем половину из них жрет спящий OLED-дисплей из-за упрощенной схемы его подключения на модуле и еще 25 мкА из оставшегося жрет менеджер питания и зарядки), в этом режиме идет только подсчет импульсов с анемометра и дождемера. Раз в несколько минут просыпается и производит замеры с кучи остальных датчиков — это около 200 миллисекунд с потреблением до 20-100 мА. И раз в 0.5-6 часов просыпается, обрабатывает накопленные данные и отправляет результаты через GSM-модем на сервер :) Тут время и потребление уже зависят от качества связи, но это от 30 сек до 2 минут при среднем потреблении около 100-200 мА.
Получается среднее потребление от 3 до 20 мА*ч, в зависимости от периода отправки результатов. Так что небольшая солнечная панель вполне способна компенсировать это даже в короткий пасмурный день :)
Но есть практический результат :) В 3 часа ночи оставил «станцию» питаться от батареи (NiMH, 3S1P, 1500 мА*ч) с подключенной солнечной панелью. Каждые 3 минуты она просыпалась и делала измерения, а каждые 30 минут она обрабатывала все накопленное, включала GSM-модем и отправляла обработанный результат на сервер. При этом солнечная панель стояла вертикально на восток и за двойным стеклопакетом окна :) И вот уже к 9 утра солнечная панель компенсировала аккуму все ночные потери. А утро (как и весь день) было пасмурным и дождливым :)
Хочу начать изучать ардуинку. Но все начало — давайте помигаем светодиодиком, а следующий шаг — нарисованная сова.
Очень хочу сделать метеостанцию внутреннюю и наружную. Внутреннюю с влажностью, СО2 и температурой. Наружный с давлением и температурой. Естественно с отображением. По возможности на андроиде, винде, на худой конец в браузере.
Хотите изучать Ардуинку — есть соответствующие сайты.
аурдинка слишком попсовая
просто мне надо 3 датчика (дом — CO), улица — температура влажность, серверная — температура, влажность, понадёжнее
Ну, и, изучать «умозрительно» — не дело. Купите и положите её перед собой на стол, откройте IDE — когда начнётся практика, тогда начнётся и изучение. И, да, не ожидайте, когда кто-то вам напишет «давай я начну тебя учить». Это не потому, что все такие «буки» жадные, это потому, что невозможно учить чему-либо «вообще», да ещё и на условиях энтузиазма.
Почувствуйте разницу. На какой вопрос вам охотнее ответят:
«Научите меня писать скетчи для часов на ардуине» или «Научите, как текущее системное время в скетче поделить на четыре цифры (десятки и единицы часов, десятки и единицы минут)».
Или, допустим, на какой из этих двух:
«Хочу научиться работать с датчиком DS18B20» или «Почему я опрашиваю DS18B20, а получаю температуру +85 градусов?».
Это я к тому, что люди охотнее помогают тем, кто сам ищет, инициатива должна исходить от вас…
Ну а на заданный вопрос ответы обязательно найдутся, будьте уверены.
Так что смелее — и вперёд, всё у вас получится.
Поэтому и прошу помощи — с чего начать: минимальный комплект и тд и тп.
Печатать платы пока не готов. Поэтому пока хочу собрать все на коленке на проводах.
Уроки про ардуинку — как я уже говорил выше: давайте помигаем светодиодом (ну вот совсем не интересно), потом давайте сделаем красивую гирлянду (ага, еще интереснее), а потом — собираем робота…
Меняем подход — гуглим «метеостанция на ардуине». cxem.net/arduino/arduino79.php — о как клево, но там опять начинается. Схема проста и понятна, но «Создаем web-сервер, присваиваем ip и порт обращения 10001»…
есть контроллер и есть внешняя периферия
они общаются по разным шинам, которые в контроллер уже встроены или же протокол реализуется программно
для этого есть готовые библиотеки под контроллеры разные
единственное это когда датчик работает от 5в, а у тебя контроллер, который не толерантный к 5в и это может попортить ему выводы
но это редко когда бывает
такого нет
я постоянно докупаю какие-то модули, чтобы удобней было отлаживать код, а не паять на макетках
иногда использую макетку, куда детали втыкаются, но туда не все можно воткнуть и вот поэтому покупаю, т.к. самому делать модуль будет дороже и гиморней
для платы ардуиновской программатор не нужен, там используется загрузчик, но из ардуины можно сделать программатор, залив в нее специальный скетч, что идет в дефолтной поставке софта
я сделаю обзор моих модулей и напишу, для чего их использовать
для понимания этой фразы как бы подразумевается, что бы знаком уже, как реализуется любой сервер с точки зрения программирования, что такое потоки, что такое порт сервера, как работает хттп
вот там в каментах есть забавный камент
когда человек задает такие вопросы, то ему как бы крайне не рекомендуется заниматься программированием
программирование связанное с сетями подразумевает, что ты уже знаеш весь стек протоколов и как там что работает
Сначала научись подымать сервера, изучи архитектуру сетей, а потом бери в руки паяльник.
Это если нужен результат в виде устройства.
А если нужно научиться, то и нужно начинать с азов, постепенно наращивая сложность и спрашивая непонятное. Ардуинщиков полно. А на буржуйских сайтах — ещё больше.
«Кто хочет — ищет способы».
Just do it!
это все равно что школьник придет в быдловуз, а ему там скажут, что как ты собрался изучать интегралы, если ты еще не знаеш отрицательных чисел
а школьник скажет, что вот сообщество-то оказывается закрытое и чсвешное
ну вот возьмем твой линк
cxem.net/arduino/arduino79.php
из него кусок кода
client.println(«HTTP/1.1 200 OK»);
client.println(«Content-Type: text/html»);
client.println();
это не входит напрямую в рамки программирования, т.к. для понимания этих надписей надо почитать о работе протокола хттп, что такое заголовки и что такое тело хтмл документа, как браузер понимает хтмл, куки, когда кешировать, когда еще что-то
когда-то давно я тоже не понимал нихера и смотрел как баран на ворота и не мог понять, откуда берутся все эти слова, почему так надо писать
оказывается есть открытая спецификация о хттп и есть еще куча статей (даже в начале нулевых) о работе веб сервера, что он там шлет и для чего
когда же я взял не то перл, не то пхп и функции для посыла заголовков, то я понял, что это такое
потом я просто брал функции для работы с тцп сокетами и слал уже не просто заголовки, а еще коды и версии протоколов, т.е. то, что скрыто под капотом вебсервера
в данном скетче как раз показан пример работы сырых сокетов и обертка самая примитивнейшая для хттп, т.к. хттп сильно жрет ресурсы (в виду своей текстовости), а 8 битный контроллер с парой кб озу очень не любит тексты
поэтому тут по сути нет вебсервера как такового
в есп8266 уже есть реализация, что облегчает написание кода и обработку запросов ури
сначала возьми какой-то простой язык типа пхп, работу с сокетами и попробуй написать код, который будет выдавать тебе страницу с датой и временем
так ты съэкономиш много времени на компиляции и заливке кода, но ты главное ощутиш процессы, которые происходят
когда у тебя будет ощущение, а не просто какие-то знания, то ты будеш уверен в своих силах и какие-то глюки в коде уже на слабом контроллере тебя не будут вводить в ступор, т.к. ты непоймеш, на каком уровне работы программы возникает глюк — то ли озу закончилось, то ли еще что-то (опечатался в хтмл коде)
программирование это очень сложная штука в том плане, что надо знать много смежной инфы или узнать ее в ходе решения задачи
нельзя просто так взять и начать писать код, как это в дешевых фильмах про хакиров
поэтому у них и зарплаты такие высокие, но когда ты неделю посидиш по 8 часов в напряжении, то ощутиш весь ад
Купить полный комплект модулей вы не сможете — на основе этих контроллеров делают что угодно: от эмуляторов клавиатуры(или миди клавиатуры) до 3д принтеров\квадрокоптеров.
Если вы хотите что-то сделать своими руками — обдумайте и закупайтесь, недостающие делали можно докупить на месте за 2-3 цены.
Ардуино не лучшая среда разработки, атмеги не самые лучшие камни. Но тут самый низкий порог входа и сами контроллеры копеечные, а датчики одинаковые — для ардуины/esp/stm и в вашей стиралке/телевизоре такие же стоят.
а) точный уличный датчик температуры/влажности в любом корпусе
с батарейкой (или с проводом USB) и Wi-Fi (можно под народмон)
б) надёжный датчик температуры (влажности — тоже можно)
в серверной, с мониторингом/алертингом, т.е. чтобы стандартный интерфес (USB) к ПК был
что проще, дешевле, какие нужны компоненты?
с чего начать
программирование/протоколы/
устройство памяти/стека/регистров знаю
контроллеры — любые достаточные, лишь бы дешевле
По точности датчиков — сложный вопрос, влажность меряют DHT-11/DHT-22, но на их точность есть нарекания.
Температура — ds18b20 самые простые.
Если делать автономный беспроводной датчик, то копать надо глубже, энергосбережение в ESP я плохо знаю. И на том же ESP-01 это потребует буквально прямых рук — чтобы припаяться к не выведенному выводу.
Преимущество ESP — это модули с встроенным WiFi. Ардуино при примерно той же цене не имеет средств общения, он требует добавления средств связи. А на есп можно как сделать простейший сервер, заходя браузером на который можно смотреть показания, так можно и наладить отсылку данных на какой-нибудь сборщик данных в инете (thingspeak), где будет хранится история показаний.
Без знания самого языка будет в тройне сложно. ВТорое — учиться надо уметь самому! Третье — браться сразу «датчики, роботы, не совместимо» — надо браться за то что «совместимо» до вас с наглядными примерами. А потом из вот этих вот кубиков у вас будут формироваться блоки знаний, которыми можно оперировать.
Но «ардуино за 3 минуты» не стоит ни ждать, ни… это просто не возможно.
о, круто, я не знал что Atmega328 стоят меньше 3 долларов!
а теперь помигай двумя так, чтобы один мигал раз в секунду
второй вспыхивал на 300мс с паузой в 600мс
а третий плавно загорался и гас
и все это ОДНОВРЕМЕННО
и тут ты внезапно начнеш понимать, что мигание светодиодом это просто
а вот мигание светодиодами с заданными параметрами — это откроет для тебя море новой инфы, включая построение скелета программы (не путать с алгоритмом)
сразу скажу, что инфы мало об этом, но я ее знаю и даже не поленился и нашел для тебя точный линк
robotosha.ru/arduino/multi-tasking-arduino.html
habr.com/ru/post/413779/
www.youtube.com/watch?v=tt_EUA7aQNk
этот камент уже дал тебе столько инфы, что месяц будеш изучать
нужно еще успеть обработать входящие сигналы и уложиться в длительность тика таймера, так же не выйти за рамки озу
у старого препода были знания и ответственное отношение к предмету
лабы были по субботам всю зиму (полгода)
2 пары
я обычно приходил из ночного клуба
час спал,
потом что-то делал, но обучение не шло
потом он мне сказал «что ты мучаешься,
напиши какое-нибудь слово и я от тебя отстану»
короче, помигал на зачёт
контроллеры были из серии intel 8080
или типа того
я вот ни туда, ни туда не ходил
дома изучал все сам и прокачался
когда учился на всяких курсах и в пту, то был круче всех
т.к. всё настроено и автоматизировано.
Проблемы если и возникают, то только от тупости пользователей.
обоими
срочно
В клубах я развлекался, т.к. был молод,
в том возрасте такой вид досуга хорошо заходил.
В ВУЗе действительно научили тому,
что можно было бы впихнуть в интенсивные двухмесячные курсы.
Но это в любом вузе так, за редким исключением
(но и там тоже курсы, просто шестимесячные).
www.youtube.com/watch?v=4Ue2BuqXlMA
Я тоже копипастю часто. Правда в большинстве случаев от оригинальной копипасты у меня в конце концов остается процентов 10-20, остальное оказывается переделанным и оптимизированным мною :)
знаю чела, который вместо изучения криптографии
городит какие-то самопальные «шифры»,
единственная «криптостойкость» которых в том,
что никто не знает что я делаю
выглядит печально, в т.ч. его зарплата
Vernam cipher
Ни когда, даже если будут десятки гуру программирования ты не осилишь вот так с нуля всю необъятную программирования даже МК Mega328. Ибо без знания языка, его понимания и умения пользоваться поиском… когда еще в институте на заключительной лабе было задание без конспектов и т.д. выполнить задание (за семестр итоговый балл, он составлял 1/3 итоговой оценки за предмет)… я просто нажал F1 в IDE. За что получил «срочно все закрой и иди сюда», я конечно испугался, ибо 1/3 оценки у меня не могло и быть (за помещение, у меня его не было, я раз в месяц приходил и просто сдавал работы за месяц), т.е. это уже неуд. Но меня ждала зачетка с отметкой «отлично».
По сему программирование вообще — это мануалы. А уж пересказывать их вам… это не благодарная тема.
Ну и по поводу отладки — как вы средствами отладки увидили бы что экран из 10 байт обработал только 8 верно, а 2 проглотил, но итога не выдал?
но гуру таки нужны. вот именно в институте толковые преподаватели и рассказывали о правильных принципах программирования, показывая не только как можно, но и как нужно. в этом суть
так что «программирование вообще» — это нифига не мануалы. мануалы это азы, помогающие понять что в принципе можно сделать. а дальше уже вступают в дело опытные наставники, рассказывающие как НУЖНО делать, ну а потом уже приходит опыт.
а насчет отладки — ну существуют например эмуляторы всяческие. чтобы не расходовать ресурс памяти контроллера, а погонять вначале просто так. для микроконтроллеров такое есть ведь. для банальных и стандартных элементов как минимум.
Так отладка или эмулятор? Во вторых ты уверен что эмулятор верно написан, уж коли у тебя железка в оригинале кривая?
Тут уже ни чем не помочь.
короче, учиться программированию нужно. и не по книжкам, а с учителем, который покажет что ты делаешь неправильно и как делать нужно. со временем придёт понимание возможных решений и «инстинкт» их правильного выбора.
можно научиться и самостоятельно. но это очень уж долго.
а) точный уличный датчик температуры/влажности в любом корпусе
с батарейкой (или с проводом USB) и Wi-Fi (можно под народмон)
б) надёжный датчик температуры (влажности — тоже можно)
в серверной, с мониторингом/алертингом, т.е. чтобы стандартный интерфес (USB) к ПК был
что проще, дешевле, какие нужны компоненты?
аурдинкой не интересуюсь
если уж нужен контроллер —
что-то менее попсовое (т.е. более дешевое) устроит
Самое дешёвое с проводом — делали из адаптера USB-TTL некий термометр для серверной. mysku.club/blog/ebay/71006.html
(Для по другим сообщениям «неплохо зарабатывающего человека» у вас довольно часто встречается упоминание дешёвого.Тут цены выражаются в половинах пачек сигарет.)
моему преемнику.
У меня они и так крепкие, а вот начальник…
Денег на этом я не заработаю.
Планов развиваться в этом направлении у меня тоже нет.
Ну как вам объяснить…
Памяти в ретро-компьютеры в офисе я уже куплю,
а SSD — нет
Зарабатываю я столько, что мне на жизнь хватает.
За ссылку благодарю. Интересная
все умеют как бы программировать и говорят, что как бы все просто, но… никто толком не может тебе объяснить, почему это именно так надо делать, а не этак
но есть годный канал, там автор боле менее объясняет
сейчас будет пилить новую серию уроков по сям и я ему там накинул инфы, как правильно организовать уроки
вот уже первый урок по сям вышел
www.youtube.com/watch?v=nFt3pJ7j8jE
если сейчас лекции ведущих университетов мира доступны?
как платные, так и бесплатные
ит и быдловуз — понятия несовместимые
www.classcentral.com/search?q=c%2B%2B
я например был в ce-bachelor.htw-berlin.de/
а здесь я спрашиваю о хобби (которое может будет, а может и нет)
то, чему я учился в университете предполагает
что мне теперь платят деньги за мои ответы
а здесь я спрашиваю потому, что
бумага всё стерпитв публичном обсуждении (споре) родится истина
(если комментарии будут полезнее ответов)
и будет доступна другим пришедшим почитать,
в том числе из поиска.
Например, прямо сейчас в другом форуме (на тему 1С, в котором я совсем не разбираюсь)
предлагаю 0,55 $ тамошней внутренней валюты за реальную помощь
Если бы вы указали более удачное —
вам гарантирована преференция
нужно сделать 3 «погодных» датчика
и 3 (или 4) передатчика по типу AMPRNET
NPR (HSMM/Hamnet) на CC1101 и подобных чипах
в готовых смущает стоимость и сложность изготовления нубом.
Готовые вроде не нужно изготавливать, готовые — это взял и включил :)
сделать — это я слишком многого хочу
типа разработка и тестирование, а потом ещё и инструкцию по монтажу и сборке
во второй части имелись в виду дизайны/рецепты
по сути мне нужен консультант который бы не смеялся над тупыми вопросами,
а чётко и по делу отвечал
Датчик уровня освещенности BH1750
Датчик атмосферного давления BMP085/180
Датчик влажности SI7021-A20
Датчик влажности HDC1080
Датчик влажности HTU21D
Сборка 3 в 1 из датчиков BH1750, HTU21D и BMP180
Комплексный датчик BME280 для измерения температуры, влажности и атмосферного давления
3д модель будки для размещения датчика на улице.
протокол MQTT, «ThingSpeak» и «Народный мониторинг»
Вот такой красивушный интерфейс
Вполне гибкая прошивка, без особых проблем добавил датчик 220В.
Пользуюсь уже 2 недели. ВОт на днях перенастроил на 3 суток лог в вебе датчика.
А еще и «проехтах». Это у тебя поделие на коленке которых тысячи в интернете, а тут серьезный поход и вполне себе завершенный проект.
Вот тебе прям распишу для одаренного:
1. Взял nodemcu, data кабель, bme280, usb кабелек как донор, просто проводкой, паяльник и прочее. Разложил на столе.
2. Открыл arduino, открыл скетч (опустим настройку IDE для прошивки ESP'ешек), подключил дата кабелем нодемцу, нажал как написано в инструкции загрузить скетч, потом данные
3. Подключился к esp по wifi, настроил подключение к моей точке. отключил все
4. согласно схеме припаял 5 проводков (питание, земля, данные) + по мануалу надо с питания на d3 кажется кинуть перемычку. я добавил питание от USB кабеля.
5. Подключил свой кабель в USB порт, открыл в браузере по указанному в настройках доменному имени web интерфейс и увидел подклчюенный датчик и показания с него.
Все.
1. Ценник не дороже твоего
2. Возни не больше чем с твоим
3. очень большая гибкость
4. возможность на будущее без великих потерь добавить свои плюшки.
А главное что сделал для нас автора — обновление интерфейса через WEB (это очень круто) и обновление прошивки через web. К примеру датчик 220В я прикручивал так:
1. Взял другую nodemcu, аппаратный детектор 220В, соединил все это
2. Открыл IDE с проектом автора, по его же документации в том же проекте добавил то что мне требовалось в указанные им места, отладил все это дело на столе.
3. отпаял датчик от тестовой ESP, припаял на постоянное место жительство, через web интефрейс обновил программную составляющую. Все. И вот сейчас меня уже кое что не устраивает и все что я сделаю так это просто перепишу код, скомпилирую его и опять же загружу через веб, не отключая и не неся на рабочее место устройство.
Просто с ходу кидаться такими тапками… Я и сам подобное на коленке делал, но хотелось именно красивостей, у меня с ними туго. Вот нашел (долго искал), делюсь.
Я немного переделываю проект под себя и делаю его чуточку понятнее. А то у него в *.h файлах все смешалось — кони люди.
Например разгреб все что у него навалено в tools.h — все фильтры переделка и оставил в filters.h, a все что связанно с расчетом абсолютной влажности, точки росы и тд. положил в meteorology.h.
Как то так. Автор проекта все равно молодец.
датчик скорости ветра сигнал 4-20MA/В 0-5 в Выход Ветер скорость передатчик Анемометр, металл matarial
https://aliexpress.com/item/item/1PCS-X-Wind-speed-sensor-signal-4-20MA-0-5V-output-wind-speed-transmitter-anemometer/32668695668.html
Кстати, там на сайте же написано насчет поддержки сенсоров:
Sensors: BMP 085/180, 1-wire DS18B20, DHT 11/21/22, AM2321
BMP — прямоугольные коробочки 2,5х2,0 мм
BME — квадратные коробочки 2,5х2,5 мм
Ну и разная маркировка на корпусах — вторая строка с «K» у bmp и с «U» у bme. В даташитах это указано.
Существует и русскоязычная версия. Заливается через ESPEasy.
Сам на днях попробовал вместо скетчей — жалею, что раньше на такой вариант не перешел. Помимо всего, это еще и совместимость с экосистемой модулей «умного дома» от Sonoff.
Т.е. просто засунул датчик в вертикальный кусок трубы так, чтобы дождём он омывался, а солнце его не доставало (у меня северная сторона, поэтому сверху солнце на него никогда не светит).
На народмоне видел фотки метеостанций, где датчик живёт в какой-то груде перевёрнутых тарелок.
Наверное, тоже норм, если над датчиком достаточно расстояния, чтобы тепло от него туда успевало уходить.
;-)
Во первых, адрес датчика можно сменить переключив перемычку на плате.
Либо, адрес можно задать в самом коде своей программы в момент инициализации
Координаты село Парский Угол Моршанский р-он Тамбовская обл.
У меня постоянно вкладка открыта…
Я тоже люблю wemos mini, но с доставкой получается уже 3 доллара… (((
Serial.write;
^
exit status 1
stray '\302' in program
Если бы он сохранил файлик ino было бы здорово.
А так мудохаться править сей шедевр :(
В тексте скетча произошла оптимизация html кода в итоге мы имеем Serial.write©
ссылка
Метеостанция за окном висит, работает на батарейках и передает инфу на народный мониторинг.
Хочу дисплейчик на столе у себя, чтоб брал данные с сайта.