Погодная станция. Требуется помощь.
- Войдите на сайт для отправки комментариев
Ср, 25/03/2015 - 20:46
Привет форумчане. Я Марк. Нашел здесь: http://habrahabr.ru/post/240677/ отличный скетч.
Вот он:
#include <LCD5110_Graph.h>
#include "DHT.h"
#include <Wire.h>
#include <BMP085.h>
#include "RTClib.h"
#define DHTPIN 10 // 10 pin для датчика DHT22
#define DHTTYPE DHT22
RTC_DS1307 RTC;
BMP085 dps = BMP085();
DHT dht(DHTPIN, DHTTYPE);
long temp3 = 0, Pressure = 0, Altitude = 0;
// pin 3 - Serial clock out (SCLK)
// pin 4 - Serial data out (DIN)
// pin 5 - Data/Command select (D/C)
// pin 7 - LCD chip select (CS)
// pin 6 - LCD reset (RST)
LCD5110 myGLCD(3, 4, 5, 6, 7);
extern unsigned char SmallFont[];
void setup() {
myGLCD.InitLCD();
myGLCD.setFont(SmallFont);
Wire.begin();
RTC.begin();
dht.begin();
delay(2000);
dps.init(MODE_ULTRA_HIGHRES, 3200, true); // 3200 это 32 метра над уровнем моря (Питер на такой высоте располагается+ надо добавить несколько метров в зависимости от этажа на котором живете)
}
void loop() {
dps.getPressure(&Pressure);
dps.getAltitude(&Altitude);
dps.getTemperature(&temp3);
DateTime now = RTC.now();
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
float h = dht.readHumidity();
// Read temperature as Celsius
float t = dht.readTemperature();
myGLCD.setFont(SmallFont); // задаем маленький размер шрифта на экране
myGLCD.clrScr(); // Очистка экрана
myGLCD.print("Time=", LEFT, 0); //задаем время
myGLCD.printNumI(int(now.hour()), 32, 0); // 32,0 означет 32=номер пропуска в строке, те откуда будем печатать. 0=номер строки
myGLCD.print(":", 45, 0);
myGLCD.printNumI(int(now.minute()), 50, 0);
myGLCD.print(":", 62, 0);
myGLCD.printNumI(int(now.second()), 67, 0);
myGLCD.print("Date=", LEFT, 10); //задаем дату
myGLCD.printNumI(int(now.day()), 32, 10);
myGLCD.print("/", 44, 10);
myGLCD.printNumI(int(now.month()), 50, 10);
myGLCD.print("/", 62, 10);
myGLCD.printNumI(int(now.year() - 2000), 68, 10);
myGLCD.print("T=", LEFT, 20); //задаем температуру
myGLCD.printNumF(t, 2, 13, 20); //Это температура с DHT22
myGLCD.print("/", 45, 20);
myGLCD.printNumF(temp3 * 0.1, 2, 53, 20); //Это температура с барометра
myGLCD.print("Hum=", LEFT, 30); // задаем влажность с DHT22
myGLCD.printNumF(h, 2, 28, 30);
myGLCD.print("%", 63, 30);
myGLCD.print("Pres=", LEFT, 40); // задаем атмосферное давление
myGLCD.printNumF(Pressure / 133.3, 2, 31, 40); //рассчет атмосферного давления
myGLCD.print("mm", 68, 40);
// Serial.print(" Alt(m):"); кому надо, это текущая высота над уровнем моря
// Serial.print(Altitude / 100);
myGLCD.update(); // Вывод вместимого буфера на дисплей
delay (1000); // Задержка 1 с
}
Возникла проблема. У меня нет датчика: Часы реального времени DS3231. Зато у меня есть датчик DS 1302. Вот никак не пойму как его привязать к данному скетчу. Может кто-то поможет? Буду очень признателен. Заранее спасибо.
Здравствуйте Марк.
Прежде чем привязать ваш модуль часов реального времени, вам нужно сначала отвязать библиотеку RTClib.
Потом найти библиотеку для DS1302. Понять на какие пины можно подключить ваш модуль и потом начать привязывать к скетчу.
P.S. Я бы пошёл таким путём.
Пины указывать в библиотеке DS1302? Она у меня есть
У меня к сожалению нет такого модуля. Пины в библиотеке указывать не нужно. Это вы в скетче прописываете. Вот посмотрите это начало вашего скетча. Я привязал ваш модуль на 8,9 и 11 пины.
Я понял спасибо. Но ведь время выставить необходимо именно в библиотеке?
Нашёл такое видео https://youtu.be/dCevx2I3S38
Там автор выводит время и дату в сериал, в вашем случае вы выводите всё на дисплей.
Kolchugin. Спасибо. Завтра попробую, потом отпишу. Я так понял больше ничего не надо в скетче менять?
Почему не надо, надо :) Не всё так просто, но и не всё так сложно ;)
Привет. В скетче вышла ошибка: rtc.begin();
Всем привет. Есть скетч по снятию данных с датчика давления.
// BMP085_test2
// by Filipe Vieira
// Simple test of BMP085 output using default settings using dynamic update.
// In order to take full advantage of dynamic measurement, automatic temperature updates must be disabled.
// To disable automatic updates set AUTO_UPDATE_TEMPERATURE to false in bmp085.h.
// IMPORTANT!! To get correct values you MUST CHANGE init() parameters, in
// this example I've set 50m based on GPS data for my location.
#include <Wire.h>
#include <BMP085.h>
BMP085 dps = BMP085(); // Digital Pressure Sensor
long Temperature = 0, Pressure = 0, Altitude = 0;
unsigned long time1=0;
void setup(void) {
Serial.begin(9600);
Wire.begin();
delay(3000);
// uncomment for different initialization settings
//dps.init(); // QFE (Field Elevation above ground level) is set to 0 meters.
// same as init(MODE_STANDARD, 0, true);
//dps.init(MODE_STANDARD, 101850, false); // 101850Pa = 1018.50hPa, false = using Pa units
// this initialization is useful for normalizing pressure to specific datum.
// OR setting current local hPa information from a weather station/local airport (QNH).
dps.init(MODE_STANDARD, 0, true); // 50 meters, true = using meter units // 50 метров Саратов, либо ставим ноль =0 метров
// this initialization is useful if current altitude is known,
// pressure will be calculated based on TruePressure and known altitude.
// note: use zeroCal only after initialization.
// dps.zeroCal(101800, 0); // set zero point
}
void loop(void) {
// calculate temperature every 1 sec (dynamic measurement)
// NOTE: in order to take full advantage of dynamic measurement set AUTO_UPDATE_TEMPERATURE to false in bmp085.h
if (((millis() - time1)/1000.0) >= 1.0) {
dps.calcTrueTemperature();
time1 = millis();
}
dps.getTemperature(&Temperature);
dps.getPressure(&Pressure);
dps.getAltitude(&Altitude);
Serial.print("Nik :)");
Serial.print(" Temp(C):");
Serial.print(Temperature*0.1,1);
Serial.print(" Pressure(mm):");
Serial.println(Pressure/133.3,1);
// Wait one second before repeating :)
delay (5000); // ждем 5 секунд
}
Не могу разобраться как подключить динамик. Хочу чтобы при определенных значениях (меняются данные в какую либо стороны), buzzer издавал определенные звуки. Кто сможет помочь?
Привет. В скетче вышла ошибка: rtc.begin();
Правильно, это от другой библиотеки, по этому и ошибка.
Отдельно часы получилось запустить, по примеру что, на видео?
Привет. Чет не получается. Пробовал один раз.
Значит нужно разобраться.
Нарисуйте схему как вы подключали часовой модуль и какой скетч при этом использовали.
ок. немного позже. а не можете помочь с buzzer?
Не не могу. Сначала нужно с часами разобраться. После уже к бузеру переходить.
договорились. на связи.
Библиотека скачена. Установлена. При загрузке скетча выходит ошибка:
String dayAsString(const Time::Day day) {
И дальше тормоз.
этот скетч загружен. все работает.
// DS1302_Serial_Easy (C)2010 Henning Karlsen
// web: http://www.henningkarlsen.com/electronics
//
// A quick demo of how to use my DS1302-library to
// quickly send time and date information over a serial link
//
// I assume you know how to connect the DS1302.
// DS1302: CE pin -> Arduino Digital 2
// I/O pin -> Arduino Digital 3
// SCLK pin -> Arduino Digital 4
#include <DS1302.h>
// Init the DS1302
DS1302 rtc(2, 3, 4);
void setup()
{
// Set the clock to run-mode, and disable the write protection
rtc.halt(false);
rtc.writeProtect(false);
// Setup Serial connection
Serial.begin(9600);
// The following lines can be commented out to use the values already stored in the DS1302
rtc.setDOW(FRIDAY); // Set Day-of-Week to FRIDAY
rtc.setTime(19, 3, 0); // Set the time to 12:00:00 (24hr format)
rtc.setDate(28, 3, 2015); // Set the date to August 6th, 2010
}
void loop()
{
// Send Day-of-Week
Serial.print(rtc.getDOWStr());
Serial.print(" ");
// Send date
Serial.print(rtc.getDateStr());
Serial.print(" -- ");
// Send time
Serial.println(rtc.getTimeStr());
// Wait one second before repeating :)
delay (1000);
}
этот скетч загружен. все работает.
Т.е. время и дату в мониторе порта показывет?
Да, в мониторе все отл.
Подключаете модуль часов:
CE pin -> Arduino Digital 8
I/O pin -> Arduino Digital 9
SCLK pin -> Arduino Digital 11
Подправил скетч, пробуйте.
Привет. Загружен подправленный скетч. Результат на картинке
https://drive.google.com/file/d/0B8VC5Vs5EHloVlBWYWZSclV1UUU/view?usp=sh...
После загрузки исправленного скетча скетча
https://drive.google.com/file/d/0B8VC5Vs5EHloMmxEaVpPSFRnX28/view?usp=sh...
А это мой изначальный скетч.
У меня датчик не 22, а 11. Исправил в скечте, и вот окончательный результат на экране.
https://drive.google.com/file/d/0B8VC5Vs5EHloa3VrTWJUaGtqU1k/view?usp=sh...
Может я пока что-то не понимаю, либо часовой модуль у вас не так подключен.
При таком скетче и подключении на пины 8,9,11, в монитор порта, дату и время выводит?
В монитор выводит. только время неверное.
https://drive.google.com/file/d/0B8VC5Vs5EHloOGZ3ZnpPcFNXa00/view?usp=sh...
Выставил время в модуль.
https://drive.google.com/file/d/0B8VC5Vs5EHloM3dCUHRlbzVxY0U/view?usp=sh...
Интересно работает, время через секунду показывает.
Подправил скетч, попробуйте.
.03.2015 -- 17:39:48
Friday 29.03.2015 -- 17:39:49
Friday 29.03.2015 -- 17:39:50
Friday 29.03.2015 -- 17:39:51
Friday 29.03.2015 -- 17:39:52
Friday 29.03.2015 -- 17:39:53
Friday 29.03.2015 -- 17:39:54
Friday 29.03.2015 -- 17:39:55
Friday 29.03.2015 -- 17:39:56
Friday 29.03.2015 -- 17:39:57
все отл. я питание отцепил от часов
пробовать скетч станции?
Давай на ты. ок?
Да это для станции. Давай на ты.
брось еще раз итоговый скетч я залью.
Заливай из 28 сообщения.
показатели кривые
5 сек
я переставил на 11 датчик. время по нолям
время не идет.
питание отцепил от часиков. все норм. тока год показывает так: 201... пятерка не умещается
Давай начнём сначала. Собираешь погодную станцию. Модуль часов подключаешь:
CE pin -> Arduino Digital 8
I/O pin -> Arduino Digital 9
SCLK pin -> Arduino Digital 11
Дальше заливаешь вот этот скетч:
Открываешь монитор порта. Если время и дату показывает, заливаешь этот скетч:
Да... Фотографию покажи, то что на экране показывает.
Залей этот скетч и прибивай на стену.
1. после загрузки скетча времени:
29.03.2015 -- 18:25:04
Friday 29.03.2015 -- 18:25:05
Friday 29.03.2015 -- 18:25:06
Friday 29.03.2015 -- 18:25:07
Friday 29.03.2015 -- 18:25:08
Friday 29.03.2015 -- 18:25:09
Friday 29.03.2015 -- 18:25:10
Friday 29.03.2015 -- 18:25:11
далее загружаю скетч станции.
все отл. но. секунды идут вот так: 02,03,05,06,08... и одна цифра года не уместилась. 201..
пробую новый скетч.
КЛАСС !!! СПАСИБО !!! Я сильно напрёг?
На стену пока его рано. Хочу пищалку воткнуть. Типа извещатель об изменении параметров.
Если часики отстали, то сначала гружу скетч со временем, сохраняю. потом опять станцию? я верно мыслю?
Фото https://drive.google.com/file/d/0B8VC5Vs5EHlod2RqcFdWZmtLZnc/view?usp=sh...
Огромное спасибо пользователю : Kolchugin за помощь в написании скетча "ПОГОДНАЯ СТАНЦИЯ" !!!
Поизучай библиотеку ds1302. Там можно выводить разный формат времени и даты. Вот твой скетч погодной станции как и в авторском варианте, только время показывает в формате "часы и минуты". Если нужно чтобы показывал секунды, в 58 строке удали строки FORMAT_SHORT, так же и с датой.