#1 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-13 10:56:16

ard125 пише:
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;

#2 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-12 13:15:31

г0сть пише:
Archangel пише:

Как их соединить через uart?

проводами rx-tx

Я уже начинаю понимать) спасибо... вот так? как реализовать общение через uart, подскажите пожалуйста?

mini_PINOUT-0G-00005215-UNOWiFi-R3-AT328-ESP8266-CH340G_edit.jpeg

#3 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-12 12:09:56

г0сть пише:
Archangel пише:

возможно проще мою затею решить с помощью сетевого модуля W5500?

Кто ж знает что у вас за затея. Вы ее так и не озвучили толком.

Archangel пише:

как же в данном случае вывести на дисплей информацию с esp

Соединить ардуину и есп, например, через uart

Затея простая) оставить имеющуюся метеостанцию и добавить вывод на народный мониторинг.
Как их соединить через uart?

#5 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-11 23:03:05

ard125 пише:

Можно, но осторожно. Он используется при старте/загрузке ESP, на нем должен быть высокий уровень в момент старта(после старта - неважно). Если по каким то причинам датчик посадит уровень - модуль не заведется. Безболезненно можете использовать 4

Хорошо... Уже завтра попробую. Спасибо!

...а как же в данном случае вывести на дисплей информацию с esp, если туда уже выводиться информация с ардуино?

#6 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-11 22:23:55

ard125 пише:

Вот распиновка вашего модуля.
Пины ESP в правом нижнем углу платы

вот тут-то я и прозрел ((( елы-палы!!!

хорошо, если датчик подключен к ардуине на восьмом пине... можно ли его же подключить к esp например к второму пину?

#7 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-11 21:46:52

ard125 пише:

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

OneWire  ds(8);  // Номер ноги к которой подключили датчик

на ардуине работает же. могу сменить на 9 или 10.

#8 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-11 21:20:37

ard125 пише:
Archangel пише:
OneWire  ds(8);  // on pin 2 (a 4.7K resistor is necessary)

Куда у вас подключен датчик?

все правильно подключен в 8 пин... комент не поправил.

#9 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-11 19:44:15

ard125 пише:
Archangel пише:

написал скетч для esp8266 что бы подключался к wifi сети и передавал температуру с ds18b20. Загрузил его.

Где этот скетч и куда его загружаете?

переключатели на плате ставлю для загрузки в esp8266 и через arduino загружаю.

#10 Re: Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-11 19:36:00

сорри... был на работе, а там нету данного скетча...

// отправка данных на народмон.ру с градусника 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);          // включаем прерывание по таймеру
  }  
  
 
}

#11 Програмування Arduino » Метеостанция на Arduino UNO WiFi R3 от RobotDyn » 2021-01-11 14:42:54

Archangel
відповідей: 21

Сделал метеостанцию работающую на плате 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);
}

Підвал форуму