Ви не увійшли.
Сторінки 1
Archangel пише:Затея простая) оставить имеющуюся метеостанцию и добавить вывод на народный мониторинг.
Сколько у вас датчиков и какие? Дисплей обязательно? Может лучше купить что-то типа NodeMCU или Wemos d1 mini + i2c модуль для дисплея или вообще дисплей тоже заменить?
Из датчиков у меня работаеит - DHT22, DS18B20 и BMP180. Дисплей обязательно, так как это с самого начала задумывалось, как метеостанция с экраном и выводом на народный мониторинг. Если б я начинал в данный момент этот проэкт, то выбрал бы 100% NodeMCU или тот же Wemos d1 mini.
Буду пробовать разобраться с UART. Вчера уже DS18B20 отправлял у меня данные, с четвертого пина все залетает. Но в плане переделать все данные все таки через UART. У меня идея вставить все данные с датчиков в масив и так их передавать.
int sensor[2]; // {ТЕМПЕРАТУРА:ВЛАЖНОСТЬ:ДАВЛЕНИЕ}
sensor[0] = celsius;
sensor[1] = h;
sensor[2] = Pressure/133.3;
Archangel пише:возможно проще мою затею решить с помощью сетевого модуля W5500?
Кто ж знает что у вас за затея. Вы ее так и не озвучили толком.
Archangel пише:как же в данном случае вывести на дисплей информацию с esp
Соединить ардуину и есп, например, через uart
Затея простая) оставить имеющуюся метеостанцию и добавить вывод на народный мониторинг.
Как их соединить через uart?
возможно проще мою затею решить с помощью сетевого модуля W5500?
Можно, но осторожно. Он используется при старте/загрузке ESP, на нем должен быть высокий уровень в момент старта(после старта - неважно). Если по каким то причинам датчик посадит уровень - модуль не заведется. Безболезненно можете использовать 4
Хорошо... Уже завтра попробую. Спасибо!
...а как же в данном случае вывести на дисплей информацию с esp, если туда уже выводиться информация с ардуино?
Вот распиновка вашего модуля.
Пины ESP в правом нижнем углу платы
вот тут-то я и прозрел ((( елы-палы!!!
хорошо, если датчик подключен к ардуине на восьмом пине... можно ли его же подключить к esp например к второму пину?
Во-первых на этой плате gpio8 не выведен физически, во-вторых, даже если бы он был, его не рекомендуется использовать, т.к. он используется для подключения к флеш-памяти. Поэтому у вас и происходит постоянный ребут. Разберитесь с распиновкой модуля или покажите фото куда вы конкретно подключаете датчик.
OneWire ds(8); // Номер ноги к которой подключили датчик
на ардуине работает же. могу сменить на 9 или 10.
Archangel пише:OneWire ds(8); // on pin 2 (a 4.7K resistor is necessary)
Куда у вас подключен датчик?
все правильно подключен в 8 пин... комент не поправил.
Archangel пише:написал скетч для esp8266 что бы подключался к wifi сети и передавал температуру с ds18b20. Загрузил его.
Где этот скетч и куда его загружаете?
переключатели на плате ставлю для загрузки в esp8266 и через arduino загружаю.
сорри... был на работе, а там нету данного скетча...
// отправка данных на народмон.ру с градусника ds18b20
// для ESP8266, ver0.3
// изменена работа с градусниками, теперь работа с 18b20 при помощи библиотеки DallasTemperature
// добавленна работа с несколькоими градусниками, данные отправляются со всех подключенных 18b20
// из основного цикла убран delay
// но как и прошлая версия, оно немного глючит.
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h> // https://github.com/milesburton/Arduino-Temperature-Control-Library
#include <Ticker.h>
OneWire ds(8); // on pin 2 (a 4.7K resistor is necessary)
DallasTemperature sensors(&ds);
Ticker flipper;
const char* ssid = "Archangel-2ghz";
const char* password = "7777777777777";
const char* host = "narodmon.ru";
const int httpPort = 8283;
const int interval = 10*60; // 10 минут
int tm = interval;
int deviceCount = 0;
void flip(){
tm--;
// Serial.println(tm);
}
void setup() {
Serial.begin(115200);
delay(10);
sensors.begin();
delay(10);
deviceCount = sensors.getDeviceCount(); // узнаем количество подключенных градусников
// sensors.getAddress(Address18b20, 0);
sensors.setResolution(10); // устанавливаем разрешение градусника 9, 10, 11, или 12 bit
sensors.requestTemperatures(); // забераем температуру с градусника
Send(); // при включении отправляем данные
flipper.attach(1, flip); // запускаем таймер
}
/// функция отправляет данные на народмон.ру
void Send() {
// Подключаемся к wifi
Serial.println();
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 данные о подключении
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
Serial.print("MAC address: ");
Serial.println(WiFi.macAddress());
Serial.println();
// подключаемся к серверу
Serial.print("connecting to ");
Serial.println(host);
// Use WiFiClient class to create TCP connections
WiFiClient client;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// отправляем данные
Serial.println("Sending...");
// заголовок
client.print("#");
client.print(WiFi.macAddress()); // отправляем МАС нашей ESP8266
client.print("#");
client.print("ESP8266"); // название устройства
// client.print("#");
// client.print("45.031660#39.004750"); // координаты местонахождения датчика
client.println();
// в цикле отправляем данные с подключенных градусников.
for (int i = 0; i <= deviceCount - 1; i++){
DeviceAddress Address18b20;
sensors.getAddress(Address18b20, i);
float temp = sensors.getTempC(Address18b20);
client.print("#");
for(int i = 0; i < 8; i++) client.print(Address18b20[i], HEX); // номер 18b20
client.print("#");
client.println(temp);
}
client.println("##");
delay(10);
// читаем ответ с и отправляем его в сериал
// вообще на ответ нужно както реагировать
Serial.print("Requesting: ");
while(client.available()){
String line = client.readStringUntil('r');
Serial.print(line);
}
client.stop();
Serial.println();
Serial.println();
Serial.println("Closing connection");
WiFi.disconnect(); // отключаемся от сети
Serial.println("Disconnect WiFi.");
}
void loop() {
if (tm == 0){ // если таймер отработал
flipper.detach(); // выключаем
tm = interval; // сбрасываем переменную таймера
sensors.requestTemperatures(); // забераем температуру с градусника
delay(10);
Send(); // отправляем
flipper.attach(1, flip); // включаем прерывание по таймеру
}
}
Сделал метеостанцию работающую на плате Arduino UNO WiFi R3 от RobotDyn с датчиками DS18B20, DHT 21, DHT22 и BMP180... Все данные с датчиков отлично выводяться на LCD дисплей 20x4.
Хочу реализовать
1. Часы с выводом на дисплей.
2. Вывод информации с датчиков на сайт народный мониторинг и доступ на андроид телефоне.
С первым пунктом не могу определиться как реализовать. Со вторым попробовал сам сделать, написал скетч для esp8266 что бы подключался к wifi сети и передавал температуру с ds18b20. Загрузил его. Перезагружаю плату, а esp8266 толи зависает, толи в бесконечный цикл попадает. Кароче говоря неопределенка, если нужно скетч скину. Одним словом нужна помощь в реализации, поэтому прошу помощи у знающих людей.
#include <Wire.h>
#include "Adafruit_LiquidCrystal.h"
#include <BMP085.h>
#include "stDHT.h"
#include <OneWire.h> //подключаем библиотеку
DHT sens(DHT22); // Указать датчик DHT11, DHT21 или DHT22. (несколько датчиков вписывать не нужно)
// Подключать можно только одинаковые датчики, то есть нельзя использовать одновременно DHT11 и DHT22
BMP085 dps = BMP085();
OneWire ds(8); // Номер ноги к которой подключили датчик
long int Temperature = 0, Pressure = 0;
// initialize the library with the numbers of the interface pins
Adafruit_LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
Serial.begin(9600);
pinMode(6, INPUT);
digitalWrite(2, HIGH);
pinMode(7, INPUT);
digitalWrite(3, HIGH);
Wire.begin();
delay(1000);
dps.init();
// set up the LCD's number of rows and columns:
lcd.begin(20, 4);
}
void loop()
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr)) {
ds.reset_search();
delay(250);
return;
}
for( i = 0; i < 8; i++) {
Serial.write(' ');
}
if (OneWire::crc8(addr, 7) != addr[7]) {
return;
}
// Первый байт ROM указывает, какой чип
switch (addr[0]) {
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1);
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE);
for ( i = 0; i < 9; i++) {
data = ds.read();
}
// Преобразование данных в фактическую температуру
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3;
if (data[7] == 0x10) {
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7;
else if (cfg == 0x20) raw = raw & ~3;
else if (cfg == 0x40) raw = raw & ~1;
}
celsius = (long int)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
dps.getPressure(&Pressure);
dps.getTemperature(&Temperature);
// set the cursor to column 0, line 1
// (note: line 1 is the second row, since counting begins with 0):
lcd.setCursor(0, 0);
Serial.print("Давление: ");
Serial.print(Pressure/133.3); //Выводим давление в мм.рт ст
Serial.print(" мм.рт стt");
Serial.print("Температура:");
Serial.print(Temperature*0.1); // Температуру в градусах Цельсия
Serial.print(" *Ct");
lcd.print("DABLENIE ");
lcd.print(Pressure/133.3); //Выводим давление в мм.рт ст
lcd.setCursor(0, 1);
Serial.print(" Температура на улице = ");
Serial.print(celsius);
Serial.print(" *C ");
lcd.print("TIn ");
lcd.print(Temperature*0.1);
lcd.setCursor(10, 1);
lcd.print("TOut ");
lcd.print(celsius);
lcd.setCursor(0, 2);
int t = sens.readTemperature(6); // чтение датчика на пине 2
int h = sens.readHumidity(6); // чтение датчика на пине 2
delay(2000);
int t2 = sens.readTemperature(7); // чтение датчика на пине 3
int h2 = sens.readHumidity(7); // чтение датчика на пине 3
Serial.print("Влажность на улице: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Температура на улице: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print("Влажность в квартире: ");
Serial.print(h2);
Serial.print(" % ");
Serial.print("Температура в квартире: ");
Serial.print(t2);
Serial.println(" *C ");
lcd.print("HumIn ");
lcd.print(h2); //Выводим давление в мм.рт ст
lcd.setCursor(10, 2);
lcd.print("HumOut ");
lcd.print(h); //Выводим давление в мм.рт ст
delay(5000);
}
Сторінки 1