я решил для себя проблему с шрифтами очень просто - накидал 2 програмки. Одна делает картинки из шрифта, а вторая пишет код по пикселям :) Знаю что ржачно, но надо было срочно :) Клиент шибко хотел фендибоберный шрифт на экране видеть.
большеватый дисплей это в домашнюю теплицу с выносом в дом
в дачной теплице будет жалко - влажность и плохие жадные люди
ну и вдруг автономку городить расход питания большой подсветка
oled рулит маленький, но чёткий :) и еще есть такой, но там проводов больше и чего то скорость обновления не очень и по SPI библиотека которая заработала очень много памяти на УНО жрет, но для теплицы пойдет
несколько экранов можно сделать и листать по времени поочереди и главный экран с мелкоподробной инфой
я решил для себя проблему с шрифтами очень просто - накидал 2 програмки. Одна делает картинки из шрифта, а вторая пишет код по пикселям :) Знаю что ржачно, но надо было срочно :) Клиент шибко хотел фендибоберный шрифт на экране видеть.
То есть можно в начале программы типа такого сделать для каждой буквы , а потом выводить их ?
Так как сделал настройки , то понял что было бы неплохо настройки запоминать в памяти :)
На правильно ли я пути ?
#include <EEPROM.h>
void setup() {
//здесь считываем из памяти наши значения
HumPompOf = EEPROM.read(0);
}
void loop() {
// здесь записываем когда изменяется
if (buttons > 100 && buttons < 200) {//кнопка +
++HumPompOff;
EEPROM.write(0, HumPompOff);//как тут записать то? так ?
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("ChangeHumPompOff");
lcd.setCursor(0, 1);
lcd.print("Current: ");
lcd.print(HumPompOff);
delay(200);
TempMillisCicle1 = millis( );//время отсчета для выхода из цикла
}
}
Как правильно записать это ? Под адресс надо переменную задавать ?
Как правильно записать это ? Под адресс надо переменную задавать ?
Вот делал тестовый термометр с записью в епром макс и мин и считыванием и знаком
сложность разбить на целое и дробное (есть разные способы)
в епром запись байтами приходится всё самому продумывать и интерфейс обмена и хранения
вот код местами надрал из библиотек, местами сам
/*
* Thermometer - read temperature using an LM35 sensor and display it on a PCD8544 LCD.
*
* Copyright (c) 2010 Carlos Rodrigues <cefrodrigues@gmail.com>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#include <PCD8544.h>
#include <DS1307.h>
#include <OneWire.h>
#include <EEPROM.h>
// Init the DS1307
long previousMillis = 0; // will store last time LED was updated
// the follow variables is a long because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long interval = 1000; // interval at which to blink (milliseconds)
//DS1307 rtc(4, 5);
//int pik = 0;
//const int buttonPin = 8; // the number of the pushbutton pin
//const int ledPin = 11; // the number of the LED pin
//const int ledPinG = 9; // the number of the LED pin
//int horr;
//int minuta;
//int seki;
//Time t;
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
OneWire ds(10); // on pin 10
float tmax=-100, tmin=100, temp, celsius;
int address = 0;
int tmaxZN_int, tmax_int, tmaxDR_int, tminZN_int, tmin_int, tminDR_int;
int i;
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
const int buttonPin = 9;
static const byte sensorPin = 0;
static const byte ledPin = 13;
// The dimensions of the LCD (in pixels)...
static const byte LCD_WIDTH = 84;
static const byte LCD_HEIGHT = 48;
// The number of lines for the temperature chart...
static const byte CHART_HEIGHT = 5;
// A custom "degrees" symbol...
static const byte DEGREES_CHAR = 1;
static const byte degrees_glyph[] = { 0x00, 0x07, 0x05, 0x07, 0x00 };
// A bitmap graphic (10x2) of a thermometer...
static const byte THERMO_WIDTH = 10;
static const byte THERMO_HEIGHT = 2;
static const byte thermometer[] = { 0x00, 0x00, 0x48, 0xfe, 0x01, 0xfe, 0x00, 0x02, 0x05, 0x02,
0x00, 0x00, 0x62, 0xff, 0xfe, 0xff, 0x60, 0x00, 0x00, 0x00};
static PCD8544 lcd;
void setup() {
pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);
lcd.begin(LCD_WIDTH, LCD_HEIGHT);
// Register the custom symbol...
lcd.createChar(DEGREES_CHAR, degrees_glyph);
// Setup Serial connection
Serial.begin(9600);
//read tmin from eeprom
tminZN_int = EEPROM.read(3); // priznak minusa -C
tmin_int = EEPROM.read(4);
tminDR_int = EEPROM.read(5);
//read tmax from eeprom
tmaxZN_int = EEPROM.read(0);// priznak minusa -C
tmax_int = EEPROM.read(1);
tmaxDR_int = EEPROM.read(2);
tmax = tmax_int + (tmaxDR_int*0.01);
if (tmaxZN_int == 1) tmax=tmax * -1; // priznak minusa -C
tmin = tmin_int + (tminDR_int*0.01);
if (tminZN_int == 1) tmin=tmin * -1; // priznak minusa -C
//delay(100);
}
void loop() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
// clearmax ();
Serial.println(" ");
Serial.print("HIGH - ");
Serial.println(buttonState);
}
else {
// turn LED off:
Serial.println(" ");
Serial.print("LOW - ");
Serial.println(buttonState);
}
// Start beyond the edge of the screen...
static byte xChart = LCD_WIDTH;
digitalWrite(ledPin, HIGH);
// Draw the thermometer bitmap at the bottom left corner...
Serial.println(" ");
Serial.println("LCD_HEIGHT/8 - THERMO_HEIGHT");
Serial.println(LCD_HEIGHT/8 - THERMO_HEIGHT);
lcd.setCursor(0, LCD_HEIGHT/8 - THERMO_HEIGHT);
lcd.drawBitmap(thermometer, THERMO_WIDTH, THERMO_HEIGHT);
// Wrap the chart's current position...
if (xChart >= LCD_WIDTH) {
xChart = THERMO_WIDTH + 2;
}
// Update the temperature chart...
lcd.setCursor(xChart, 1);
lcd.drawColumn(CHART_HEIGHT, map(temp, 20, 35, 0, CHART_HEIGHT*6)); // ...clipped to the 0-45C range.
lcd.drawColumn(CHART_HEIGHT, 0); // ...with a clear marker to see the current chart position.
xChart++;
// Read the temperature (in celsius)...
// float temp = (1.1 * analogRead(sensorPin) * 100.0) / 1024.0;
// float temp = (1.1 * analogRead(sensorPin)/1.38 * 100.0) / 1024.0;
temperature ();
Serial.print(" ---- ++++ t C = ");
Serial.print(celsius);
temp=celsius;
// Print the temperature (using the custom "degrees" symbol)...
lcd.setCursor(26, 1);
lcd.print(temp, 2);
lcd.print("\001C ");
lcd.setCursor(0, 0);
if (tminZN_int == 0) lcd.print("+"); // priznak minusa -C
if (tminZN_int == 1) lcd.print("-"); // priznak minusa -C
lcd.print(tmin,1);
lcd.setCursor(LCD_WIDTH*0.5, 0);
if (tmaxZN_int == 0) lcd.print("+"); // priznak minusa -C
if (tmaxZN_int == 1) lcd.print("-"); // priznak minusa -C
lcd.print(tmax,1);
lcd.setCursor(72, 0);
lcd.print("\001C ");
digitalWrite(ledPin, LOW);
delay(800);
}
void clearmax () {
lcd.setCursor(0, 0);
lcd.print("--- clear ----");
EEPROM.write(0, 0);
EEPROM.write(1, 0);
EEPROM.write(2, 0);
EEPROM.write(3, 0);
EEPROM.write(4, 30);
EEPROM.write(5, 0);
Serial.println(" ");
Serial.print("HIGH - ");
Serial.println(buttonState);
}
float temperature ()
{
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
// float fahrenheit;
if ( !ds.search(addr)) {
// Serial.println("No more addresses.");
// Serial.println();
ds.reset_search();
//delay(250);
// return;
}
// Serial.print("ROM =");
for( i = 0; i < 8; i++) {
// Serial.write(' ');
// Serial.print(addr[i], HEX);
}
// if (OneWire::crc8(addr, 7) != addr[7]) {
// Serial.println("CRC is not valid!");
// return;
// }
// Serial.println();
ds.reset();
ds.select(addr);
ds.write(0x44,1); // start conversion, with parasite power on at the end
//delay(500); // maybe 750ms is enough, maybe not
// we might do a ds.depower() here, but the reset will take care of it.
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++) { // we need 9 bytes
data[i] = ds.read();
}
unsigned int raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10) {
// count remain gives full 12 bit resolution
raw = (raw & 0xFFF0) + 12 - data[6];
}
} else {
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw << 3; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw << 2; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw << 1; // 11 bit res, 375 ms
// default is 12 bit resolution, 750 ms conversion time
}
celsius = (float)raw / 16.0;
// fahrenheit = celsius * 1.8 + 32.0;
if (celsius < tmin) {
tmin = celsius;
if (tmin >= 0) {
tminZN_int = 0;
}
else
{
tminZN_int = 1; // priznak minusa -C
}
tmin_int = (int)tmin;
tminDR_int = (tmin - (int)tmin) * 100;
EEPROM.write(3, tminZN_int); // priznak minusa -C
EEPROM.write(4, tmin_int);
EEPROM.write(5, tminDR_int);
Serial.println("-- write tmin eerrom ----------------");
if (tminZN_int == 0) Serial.print("+");
if (tminZN_int == 1) Serial.print("-");
Serial.print(tmin_int);
Serial.print(".");
Serial.println(tminDR_int);
Serial.println("-- celsius ----------------");
Serial.print(celsius);
Serial.println("------------------");
}
if (celsius > tmax | tmax == 85 | tmax > 120 )
{
tmax = celsius;
if (tmax >= 0) {
tmaxZN_int = 0;
}
else
{
tmaxZN_int = 1;
}
tmax_int = (int)tmax;
tmaxDR_int = (tmax - (int)tmax) * 100;
EEPROM.write(0, tmaxZN_int); // priznak minusa -C
EEPROM.write(1, tmax_int);
EEPROM.write(2, tmaxDR_int);
// lcd.setCursor(LCD_WIDTH*0.5, 0);
// if (tmaxZN_int == 0) lcd.print("+");
// if (tmaxZN_int == 1) lcd.print("-");
// lcd.print(tmax);
// lcd.print(tmaxDR_int);
// lcd.print("\001C");
Serial.println("-- write tmax eerrom ----------------");
if (tmaxZN_int == 0) Serial.print("+");
if (tmaxZN_int == 1) Serial.print("-");
Serial.print(tmax_int);
Serial.print(".");
Serial.println(tmaxDR_int);
Serial.println("-- celsius ----------------");
Serial.print(celsius);
Serial.println("------------------");
}
Serial.print(" t C = ");
Serial.print(celsius);
Serial.print(", t max = ");
Serial.print(tmax);
Serial.print(", t min = ");
Serial.println(tmin);
Serial.println("------------------");
}
/* EOF - Thermometer.ino */
А вспомнил еще у меня сервы есть, но кинематику думать тяжело, надо прогу типа када что ли,
усилия рычаги посмотреть - а так идея сдвигать в пазах заслонку аля форточка или поднимать её
в сотовом поликарбонате прорезать - будет не тяжелая (вентиляцию нужно в самом верхнем месте делать приточное внизу - можно типа завесы. Разряжением будет открываться под собственным весом закрываться)
))))) а зачем дробные ? я только целую часть использую .
Паяльник уже в Москве , через дня три четыре подпояю RTC и буду мучить время :) Имхо полив по таймеру надо предусмотреть , ввиду наличия жалоб на датчик влажности почвы .
))))) а зачем дробные ? я только целую часть использую .
те же максимумы записать, да мало ли, ну это на бубущее
Cyoko пишет:
Имхо полив по таймеру надо предусмотреть , ввиду наличия жалоб на датчик влажности почвы .
в таймерах ds3231 не смог год в виде 2014 назначить в одном варианте примеров только 1914 получался ну это не суть как важно можно програмно 20хх подставлять
были варианты отсчитывать время от восхода (датчик освещения ставил)
жалобы на датчик упростить можно заменив штатную щупалку на два электрода нержавейки (в инете видел, народ одобряет и использует)
Да, прям вижу весна и теплицы поплыли... под парусами. А еще можно консерваторий настроить везде, консервы они страсть какие вкусные. :)
Так я не пойму по таймерам. Что вам мешает в епром даты и время записывать? Можно еще флажок ставить для автоматического расчета и повторения по дням или неделям.
Я думал установить часы реального времени . И с помощью их сделать таймеры . Так разве не надежнее ? В них и батарейка есть , и память вроде как ) Надо будет примеры поискать.....
Я думал установить часы реального времени . И с помощью их сделать таймеры . Так разве не надежнее ? В них и батарейка есть , и память вроде как ) Надо будет примеры поискать.....
rts надежнее
конкуренты делают отсчет от восхода солнца типа естественный ход времени и автокоррекция
таймеры в других системах (конкурентов :) ) обычно раз в день два и три дня полив примерно 40 минут
у них через капельницу вытекает примерно 2 литра. Я покупал расходометрпроточный хотел по литрам наливать бочку
есть примеры для rts ds3231 в библиотеке я покупал такой он с памятью и батарейка перезаряжаемая LIR2032
Усыплять дуню пока не буду :) пусть поживет еще.....
Вот пока нашел вроде рабочий пример с таймером , как пояльник придет , опробую и буду уже дорабатывать .
#include "Arduino.h"
#include <Wire.h>
#include <DS1307.h>
#define timePIN 13
void setup()
{
Serial.begin(9600);
pinMode(timePIN, OUTPUT);
}
void loop()
{
if(Serial.available()) SetTime();
int Hour = RTC.get(DS1307_HR, true);
int Minute = RTC.get(DS1307_MIN, false);
int Second = RTC.get(DS1307_SEC, false);
int FullMinutes = Hour * 60 + Minute;
int FullMinutesTimerOn = 8 * 60 + 30;
int FullMinutesTimerOff = 16 * 60 + 40;
if(FullMinutes >= FullMinutesTimerOn && FullMinutes <= FullMinutesTimerOff) digitalWrite(timePIN, HIGH);
else digitalWrite(timePIN, LOW);
Print(); // ПОСЛЕ ОТЛАДКИ НУЖНО УДАЛИТЬ !!!
Serial.print(addZero(Hour));
Serial.print(":");
Serial.print(addZero(Minute));
Serial.print(":");
Serial.println(addZero(Second));
delay(1000);
}
void SetTime()
{
delay(10);
if (Serial.read() == 't')
{
int h = (Serial.read() - '0') * 10 + (Serial.read() - '0');
Serial.read();
int m = (Serial.read() - '0') * 10 + (Serial.read() - '0');
RTC.stop();
RTC.set(DS1307_SEC,0);
RTC.set(DS1307_MIN,m);
RTC.set(DS1307_HR,h);
RTC.start();
}
while(Serial.available())
{
delay(2);
Serial.read();
}
}
String addZero(int val) // Добавим 0 перед значением часа/минуты/секунды, если оно меньше 10
{
if (val<10) return "0" + String(val);
else return String(val);
}
void Print() // ЭТУ ФУНКЦИЮ ПОСЛЕ ОТЛАДКИ НУЖНО УДАЛИТЬ !!!
{
Serial.print(FullMinutesTimerOn);
Serial.print(" >> ");
Serial.print(FullMinutes);
Serial.print(" << ");
Serial.print(FullMinutesTimerOff);
Serial.print(" ");
}
вот тоже вроде интересный пример
// during an alarm the INT pin of the RTC is pulled low
//
// this is handy for minimizing power consumption for sensor-like devices,
// since they can be started up by this pin on given time intervals.
#include <Wire.h>
#include "ds3231.h"
#define BUFF_MAX 256
// time when to wake up
uint8_t wake_HOUR = 15;
uint8_t wake_MINUTE = 49;
uint8_t wake_SECOND = 9;
// how often to refresh the info on stdout (ms)
unsigned long prev = 5000, interval = 5000;
void set_alarm(void)
{
// flags define what calendar component to be checked against the current time in order
// to trigger the alarm - see datasheet
// A1M1 (seconds) (0 to enable, 1 to disable)
// A1M2 (minutes) (0 to enable, 1 to disable)
// A1M3 (hour) (0 to enable, 1 to disable)
// A1M4 (day) (0 to enable, 1 to disable)
// DY/DT (dayofweek == 1/dayofmonth == 0)
boolean flags[5] = { 0, 0, 0, 1, 1 };
// set Alarm1
DS3231_set_a1(wake_SECOND, wake_MINUTE, wake_HOUR, 0, flags);
// activate Alarm1
DS3231_set_creg(DS3231_INTCN | DS3231_A1IE);
}
void setup()
{
Serial.begin(9600);
Wire.begin();
DS3231_init(DS3231_INTCN);
DS3231_clear_a1f();
set_alarm();
}
void loop()
{
char buff[BUFF_MAX];
unsigned long now = millis();
struct ts t;
// once a while show what is going on
if ((now - prev > interval) && (Serial.available() <= 0)) {
DS3231_get(&t);
// display current time
snprintf(buff, BUFF_MAX, "%d.%02d.%02d %02d:%02d:%02d", t.year,
t.mon, t.mday, t.hour, t.min, t.sec);
Serial.println(buff);
// display a1 debug info
DS3231_get_a1(&buff[0], 59);
Serial.println(buff);
if (DS3231_triggered_a1()) {
// INT has been pulled low
Serial.println(" -> alarm1 has been triggered");
// clear a1 alarm flag and let INT go into hi-z
DS3231_clear_a1f();
}
prev = now;
}
}
Но хочется чтоб и время устанавливать самому из меню , и таймер недельный :)))))
У меня кстати РТС ds1307 но вроде они почти одинаковые .
отличия не смертельные, в ds1307 точность сильно зависит от кварца мне (да и на форумах часто жаловались) попадался с неправильным кварцем не 32768. Уходит на минуту в сутки и больше (сейчас заказал с правильным кварцем проверю)
Паяльщик из меня конечно еще тот, но вроде ножки держатся.
Вообщем вот что пока получил:
библиотеки
#include <EEPROM.h>
#include <DS1307.h>
//Массив, содержащий время компиляции
char compileTime[] = __TIME__;
DS1307 clock;
в сетапе:
void setup() {
//Запускаем часы реального времени
clock.begin();
тупо вбиваем любую дату
clock.fillByYMD(2013,1,19);//Jan 19,2013
clock.fillByHMS(15,28,30);//15:28 30"
clock.fillDayOfWeek(SAT);//Saturday
clock.setTime();//write time to the RTC chip
в лупе:
clock.getTime();
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(clock.hour);
lcd.setCursor(0, 1);
lcd.print(clock.minute);
ошибки не выдает , но и время тоже :)
пишет 45 и 165 в строках и они не меняются. Значит чтото я делаю не так .
Первый вопрос : у меня scl и sda это пины 20 и 21. Что то я не вижу где их менять. Может из-за этого все ? Еще где то про пин 4 слышал чтото нехорошее.....
А ларчик просто открывался :) У меня модуль с алиэкспресса , квадратный такой, без ножек. Так вот там с двух сторон дырки под ножки. Я с другой стороны подпаял и все заработало.
Теперь я так понимаю время у меня есть :)
Думки вот о чем:
Как совместить меню и часы.
Настройка времени кнопками с шилда.
Хранение в памяти....NV Ram это для этого ? Видел гдето в скетчах.....
Ну и сообственно недельный и суточный таймер.
Так что есть чем занятся пока идет етернет шилд :)
А я тут заметил, что датчики влажности почвы, полное УГ =(
Там на обычную печатную плату нанесён тонкий слой меди. Разумеется, через пару месяцев у поверхности почвы целиком разъело окисью этот тонкий слой меди =(
Видимо придётя учиться самому делать и калибровать подобные датчики из обычных металических гвоздей или чего-нить подобного.
// #############################################################################
// #
// # Scriptname : DS1307_Test.pde
// # Author : Peter Schmelzer, Oliver Kraus
// # Date : 2011-04-08
// # Version : 1.21
// # License : cc-by-sa-3.0
// #
// # Description:
// # Test file for the DS1307new library. Assumes that you have a DS1307
// # connected to the I2C-Bus of your Arduino and that it has a battery backup.
// #
// #############################################################################
// *********************************************
// INCLUDE
// *********************************************
#include <Wire.h> // For some strange reasons, Wire.h must be included here
#include <DS1307new.h>
// *********************************************
// DEFINE
// *********************************************
// *********************************************
// VARIABLES
// *********************************************
uint16_t startAddr = 0x0000; // Start address to store in the NV-RAM
uint16_t lastAddr; // new address for storing in NV-RAM
uint16_t TimeIsSet = 0xaa55; // Helper that time must not set again
// *********************************************
// SETUP
// *********************************************
void setup()
{
pinMode(2, INPUT); // Test of the SQW pin, D2 = INPUT
digitalWrite(2, HIGH); // Test of the SQW pin, D2 = Pullup on
Serial.begin(9600);
/*
PLEASE NOTICE: WE HAVE MADE AN ADDRESS SHIFT FOR THE NV-RAM!!!
NV-RAM ADDRESS 0x08 HAS TO ADDRESSED WITH ADDRESS 0x00=0
TO AVOID OVERWRITING THE CLOCK REGISTERS IN CASE OF
ERRORS IN YOUR CODE. SO THE LAST ADDRESS IS 0x38=56!
*/
RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08
/*
Uncomment the next 2 lines if you want to SET the clock
Comment them out if the clock is set.
DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
AFTER SETTING THE CLOCK ONCE.
*/
// TimeIsSet = 0xffff;
// RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
/*
Control the clock.
Clock will only be set if NV-RAM Address does not contain 0xaa.
DS1307 should have a battery backup.
*/
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet != 0xaa55)
{
RTC.stopClock();
RTC.fillByYMD(2011,4,8);
RTC.fillByHMS(22,7,0);
RTC.setTime();
TimeIsSet = 0xaa55;
RTC.setRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
RTC.startClock();
}
else
{
RTC.getTime();
}
/*
Control Register for SQW pin which can be used as an interrupt.
*/
RTC.ctrl = 0x00; // 0x00=disable SQW pin, 0x10=1Hz,
// 0x11=4096Hz, 0x12=8192Hz, 0x13=32768Hz
RTC.setCTRL();
Serial.println("DS1307 Testsketch");
Serial.println("Format is \"hh:mm:ss dd-mm-yyyy DDD\"");
uint8_t MESZ;
MESZ = RTC.isMEZSummerTime();
Serial.print("MEZ=0, MESZ=1 : ");
Serial.println(MESZ, DEC);
Serial.println();
}
// *********************************************
// MAIN (LOOP)
// *********************************************
void loop()
{
RTC.getTime();
if (RTC.hour < 10) // correct hour if necessary
{
Serial.print("0");
Serial.print(RTC.hour, DEC);
}
else
{
Serial.print(RTC.hour, DEC);
}
Serial.print(":");
if (RTC.minute < 10) // correct minute if necessary
{
Serial.print("0");
Serial.print(RTC.minute, DEC);
}
else
{
Serial.print(RTC.minute, DEC);
}
Serial.print(":");
if (RTC.second < 10) // correct second if necessary
{
Serial.print("0");
Serial.print(RTC.second, DEC);
}
else
{
Serial.print(RTC.second, DEC);
}
Serial.print(" ");
if (RTC.day < 10) // correct date if necessary
{
Serial.print("0");
Serial.print(RTC.day, DEC);
}
else
{
Serial.print(RTC.day, DEC);
}
Serial.print("-");
if (RTC.month < 10) // correct month if necessary
{
Serial.print("0");
Serial.print(RTC.month, DEC);
}
else
{
Serial.print(RTC.month, DEC);
}
Serial.print("-");
Serial.print(RTC.year, DEC); // Year need not to be changed
Serial.print(" ");
switch (RTC.dow) // Friendly printout the weekday
{
case 1:
Serial.print("MON");
break;
case 2:
Serial.print("TUE");
break;
case 3:
Serial.print("WED");
break;
case 4:
Serial.print("THU");
break;
case 5:
Serial.print("FRI");
break;
case 6:
Serial.print("SAT");
break;
case 7:
Serial.print("SUN");
break;
}
Serial.print(" seconds since 1.1.2000:");
Serial.print(RTC.time2000, DEC);
uint8_t MESZ = RTC.isMEZSummerTime();
Serial.print(" MEZ=0, MESZ=1 : ");
Serial.print(MESZ, DEC);
Serial.print(" - Address in NV-RAM is: ");
RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
Serial.print(lastAddr, HEX);
lastAddr = lastAddr + 1; // we want to use it as addresscounter for example
RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
if (TimeIsSet == 0xaa55) // check if the clock was set or not
{
Serial.println(" - Clock was set!");
}
else
{
Serial.println(" - Clock was NOT set!");
}
delay(1000); // wait a second
}
Не совсем понятно по коду.....
вот это
RTC.getRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
Serial.print(lastAddr, HEX);
lastAddr = lastAddr + 1; // we want to use it as addresscounter for example
RTC.setRAM(0, (uint8_t *)&lastAddr, sizeof(uint16_t));
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
зачем ?
кто может рассказать человеческим языком что тут с записью чтением и для чего это надо ?
Сделал вот так :
#include <DS1307new.h>
unsigned long TempMillisTime; //засечка времени для отображения часов
RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));// Store startAddr in NV-RAM address 0x08
/*
Uncomment the next 2 lines if you want to SET the clock
Comment them out if the clock is set.
DON'T ASK ME WHY: YOU MUST UPLOAD THE CODE TWICE TO LET HIM WORK
чтото не хотит никто помогать :) Ну ладно будем думать вслух.
Пока основная проблема с пониманием логики работы библиотек...
Вот какая идея у меня:
1. При вкючении питания выводим время с РТС на экран
2. Если время не правильное, то дуем в меню настройки времени
3. там нас ждут подпункты год месяц все дела.
4. Вот тут вопрос можно ли обновлять только часы например или надо выключать таймер , полностью перезаписывать и включать ?Тогда заходим в них , присваем переменной значение и изменяем ее на нужное нам. Такс....Ну и при выходе надо обновить значения всех переменных времени и выкл-записываем-вкл таймер с новыми значениями.
5. а после выхода попадаем в функцию вывода времени на экран уже с новыми значениями.
Как вам мой вариант :)))) Чет мудрено помойму .
Какие есть идеи по данной реализации ? Можно ли в функции обновлять значения времени таймера ?
Не могу чтото примера найти. Вот с какой библиотекой нашел , так и сделал:) Вообщем то не проблема залить сначала нормальную дату и запомнить ее навсегда.
Сейчас таймеры думаю , вот это вроде норм такая задачка оказалась :)
Круто - еще кусок допилен!
Ну да. Правда теперь я понял что хочу экран 20 на 4 или нокиевский какойто :)
И можно уже начинать думать о связи с внешним миром . Вообщем это к растратам ))))
Берите сразу нормальный цветной экран. Разница по цене не большая.
На счет экрана пока не решился . Вот какой прикольный походу : http://ru.aliexpress.com/item/Free-shipping-LCD-module-TFT-3-5-inch-TFT-LCD-screen-for-Arduino-MEGA2560-Board/1683788780.html
Вопросы по экрану :
Как узнать поддерживает он русские буквы ии нет ?
Походу надо будет библиотеку меню править ?
Вообщем и хочется и вроде как смысла нет .
Лучше вот думаю такую штуку закажу : http://www.aliexpress.com/store/product/2-4G-Wireless-Module-Embedded-Uart-Wifi-Module-UART-WiFi-Network-Server-Client-IEEE802-11b-with/110055_1886232538.html
И буду подключать устройство к серверу .
я решил для себя проблему с шрифтами очень просто - накидал 2 програмки. Одна делает картинки из шрифта, а вторая пишет код по пикселям :) Знаю что ржачно, но надо было срочно :) Клиент шибко хотел фендибоберный шрифт на экране видеть.
ой, прям вижу как ты смотрел на себя серьзно из зеркала и требовал фельдибоберный шрифт и неприменно с завитушками. Ыыы
Зато стребовал!
Зато стребовал!
Ну я ж не спорю. Красиво получилось.
большеватый дисплей это в домашнюю теплицу с выносом в дом
в дачной теплице будет жалко - влажность и плохие жадные люди
ну и вдруг автономку городить расход питания большой подсветка
oled рулит маленький, но чёткий :) и еще есть такой, но там проводов больше и чего то скорость обновления не очень и по SPI библиотека которая заработала очень много памяти на УНО жрет, но для теплицы пойдет
несколько экранов можно сделать и листать по времени поочереди и главный экран с мелкоподробной инфой
ну и вдруг автономку городить расход питания большой подсветка
тумблер на разрыв питания к экрану, не?
тумблер на разрыв питания к экрану, не?
как вариант катет (по гипотенузе :) ) ну это не суть как важно
ну и вдруг автономку городить расход питания большой подсветка
тумблер на разрыв питания к экрану, не?
Подсветку можно и без тумблера отключать и даже яркость шимом регулировать. Было бы желание.
> Подсветку можно и без тумблера отключать и даже яркость шимом регулировать. Было бы желание.
Ещё можно контрастность шимом рулить и гасить экран полностью, если нет нажатий клавы более минуты. Было бы желание. :)
я решил для себя проблему с шрифтами очень просто - накидал 2 програмки. Одна делает картинки из шрифта, а вторая пишет код по пикселям :) Знаю что ржачно, но надо было срочно :) Клиент шибко хотел фендибоберный шрифт на экране видеть.
То есть можно в начале программы типа такого сделать для каждой буквы , а потом выводить их ?
Более рациональное решение есть ? :)
Более рациональное решение есть ? :)
варианты :
1. делают только отсутствующие русские буквы
2. обходятся символами как вы написали выше
3. думать SD карточку на нее картинки со всеми вытекающими
или взять маленький дисплей :) и сразу отпадет проблема длинных текстов
краткость сестра... как вариант посмотреть интерфейсы аналогичных устройств
Вообщем проще выучить английский :)
Так как сделал настройки , то понял что было бы неплохо настройки запоминать в памяти :)
На правильно ли я пути ?
Как правильно записать это ? Под адресс надо переменную задавать ?
Как правильно записать это ? Под адресс надо переменную задавать ?
Вот делал тестовый термометр с записью в епром макс и мин и считыванием и знаком
сложность разбить на целое и дробное (есть разные способы)
в епром запись байтами приходится всё самому продумывать и интерфейс обмена и хранения
вот код местами надрал из библиотек, местами сам
Считывание из епром
Запись данных
Стирание еепром забиваем нули
еепром конечно изнашивается, но народ тесты делал на убой - хватает надолго
лучше на SD карту писать заодно и логи будут
в еепроме обычно только настройки хранят
еще в часовом модуле бывает память встраивают там ее побольше и она выносливее
DS1307 - модуль часов реального времени (RTC) arduino - готовый модуль часов реального времени со слотом под батарейку.
Характеристики:
Вроде понял ) Щас буду пробовать
А зачем стирать ? Разве нельзя просто перезаписывать ?
Спасибо большое за пример , все получилось .
А зачем стирать ? Разве нельзя просто перезаписывать ?
можно перезаписать просто при первом чтении после других экспериментов чистил
и дробные числа есть способ проще записывать
как помню операции смещения регистров (>> такие) не стал вникать, а типа библиотеки не нашел
допилим общими усилиями автономное плавание теплиц :)
Наш девиз - Весна близко... :)
А вспомнил еще у меня сервы есть, но кинематику думать тяжело, надо прогу типа када что ли,
усилия рычаги посмотреть - а так идея сдвигать в пазах заслонку аля форточка или поднимать её
в сотовом поликарбонате прорезать - будет не тяжелая (вентиляцию нужно в самом верхнем месте делать приточное внизу - можно типа завесы. Разряжением будет открываться под собственным весом закрываться)
))))) а зачем дробные ? я только целую часть использую .
Паяльник уже в Москве , через дня три четыре подпояю RTC и буду мучить время :) Имхо полив по таймеру надо предусмотреть , ввиду наличия жалоб на датчик влажности почвы .
))))) а зачем дробные ? я только целую часть использую .
те же максимумы записать, да мало ли, ну это на бубущее
Имхо полив по таймеру надо предусмотреть , ввиду наличия жалоб на датчик влажности почвы .
в таймерах ds3231 не смог год в виде 2014 назначить в одном варианте примеров только 1914 получался ну это не суть как важно можно програмно 20хх подставлять
были варианты отсчитывать время от восхода (датчик освещения ставил)
жалобы на датчик упростить можно заменив штатную щупалку на два электрода нержавейки (в инете видел, народ одобряет и использует)
А таймеры ты реализовывал ? Таймеры полезно иметь :) Полив по утрам например. Я еще пока о них не думал , но думаю надо сдеать суточный и недельный .
допилим общими усилиями автономное плавание теплиц :)
Наш девиз - Весна близко... :)
Да, прям вижу весна и теплицы поплыли... под парусами. А еще можно консерваторий настроить везде, консервы они страсть какие вкусные. :)
Так я не пойму по таймерам. Что вам мешает в епром даты и время записывать? Можно еще флажок ставить для автоматического расчета и повторения по дням или неделям.
Я пока RTC даже не смотрел . Но любой идеи реализации таймеров буду рад .
Есть библиотека она автоматом время считает в часах.минутах. днях недели.годах от milis. Проблема только что бы свет не моргал.
Я думал установить часы реального времени . И с помощью их сделать таймеры . Так разве не надежнее ? В них и батарейка есть , и память вроде как ) Надо будет примеры поискать.....
Я думал установить часы реального времени . И с помощью их сделать таймеры . Так разве не надежнее ? В них и батарейка есть , и память вроде как ) Надо будет примеры поискать.....
rts надежнее
конкуренты делают отсчет от восхода солнца типа естественный ход времени и автокоррекция
таймеры в других системах (конкурентов :) ) обычно раз в день два и три дня полив примерно 40 минут
у них через капельницу вытекает примерно 2 литра. Я покупал расходометр проточный хотел по литрам наливать бочку
есть примеры для rts ds3231 в библиотеке я покупал такой он с памятью и батарейка перезаряжаемая LIR2032
с прерываниями пример в библиотеке
можно усыплять дуню и по прерыванию она проснется от будильника RTS
а будильник следующий ставить програмно и по кнопке вывод прерыванием принудительно из сна и вход в меню
Усыплять дуню пока не буду :) пусть поживет еще.....
Вот пока нашел вроде рабочий пример с таймером , как пояльник придет , опробую и буду уже дорабатывать .
вот тоже вроде интересный пример
Но хочется чтоб и время устанавливать самому из меню , и таймер недельный :)))))
Весна близко !!! ))
У меня кстати РТС ds1307 но вроде они почти одинаковые .
У меня кстати РТС ds1307 но вроде они почти одинаковые .
отличия не смертельные, в ds1307 точность сильно зависит от кварца мне (да и на форумах часто жаловались) попадался с неправильным кварцем не 32768. Уходит на минуту в сутки и больше (сейчас заказал с правильным кварцем проверю)
А зачем в часы ставить "не правильный" кварц? Что бы сбить с толку врага?
Видимо китайцы впаивают что под рукой есть :)
Мне кстати пришел наконец то паяльник :) Осталось научится паять и приступим к интеграции чаосв в устройство .
А зачем в часы ставить "не правильный" кварц? Что бы сбить с толку врага?
зачем ВРАГА ? сразу уж Вас ! у врага - другие ЧИПЫ !
Всем привет , появились вопросы с часами:)
Паяльщик из меня конечно еще тот, но вроде ножки держатся.
Вообщем вот что пока получил:
библиотеки
тупо вбиваем любую дату
ошибки не выдает , но и время тоже :)
пишет 45 и 165 в строках и они не меняются. Значит чтото я делаю не так .
Первый вопрос : у меня scl и sda это пины 20 и 21. Что то я не вижу где их менять. Может из-за этого все ? Еще где то про пин 4 слышал чтото нехорошее.....
должен автоматом определить что мега и взять эти sda scl
можно глянуть в самой библиотеке может там есть где поменять пины
еще есть вариант (непомню какой-то сработал на меге) пройтись сканером устройств i2c или другим
и взять библиотеку с принудительной установкой пинов
А ларчик просто открывался :) У меня модуль с алиэкспресса , квадратный такой, без ножек. Так вот там с двух сторон дырки под ножки. Я с другой стороны подпаял и все заработало.
Теперь я так понимаю время у меня есть :)
Думки вот о чем:
Как совместить меню и часы.
Настройка времени кнопками с шилда.
Хранение в памяти....NV Ram это для этого ? Видел гдето в скетчах.....
Ну и сообственно недельный и суточный таймер.
Так что есть чем занятся пока идет етернет шилд :)
А я тут заметил, что датчики влажности почвы, полное УГ =(
Там на обычную печатную плату нанесён тонкий слой меди. Разумеется, через пару месяцев у поверхности почвы целиком разъело окисью этот тонкий слой меди =(
Видимо придётя учиться самому делать и калибровать подобные датчики из обычных металических гвоздей или чего-нить подобного.
Так и есть , об этом много чего написано.... Хотя покупать на сезон этот датчик за 50р думаю тоже норм.
Но я и хочу добить таймеры, чтоб всегда была возможность сделать полив по таймеру.
не протянет он сезона. лучше сразу электроды поменять на нержавейку.
уже нашел электродов пачку, нужно в цветках возобновить умный полив для испытания
не протянет он сезона. лучше сразу электроды поменять на нержавейку.
еще были идеи подключать этот датчик только для измерения (раз в час например)
окисляется сильнее при постоянном пропускании тока
это реализовано
Что то с часами пока подвижек мало , так что пофантазирую....
Итак что хотелось бы видеть:
1) При включении ардуинки выводим заставку, опрашиваем датчики, выводим на экран время. Ну и собственно реализации установки времени с помощью кнопок.
2) следит за датчиками, управляет релюхами.
3)В меню добавить пункт настройки времени
Ну и само собой по времени выходить из меню , вроде реализовал, не помню :)
4) В меню добавить пару пунктов настройки таймеров, суточный и недельный например.
5) запись времени в нврам.
Вот такое нафантазировалось )))
Упращенный вариант :
Установка времени в сетапе, таймер
Давно не выкладывал скетч
Код чтото разрастается, надо срочно разобраться с временем и таймерами :)
Ребят вот нашел хороший пример
Не совсем понятно по коду.....
вот это
зачем ?
кто может рассказать человеческим языком что тут с записью чтением и для чего это надо ?
Сделал вот так :
#include <DS1307new.h>
unsigned long TempMillisTime; //засечка времени для отображения часов
и еще вот это что за пин такой ?
чтото не хотит никто помогать :) Ну ладно будем думать вслух.
Пока основная проблема с пониманием логики работы библиотек...
Вот какая идея у меня:
1. При вкючении питания выводим время с РТС на экран
2. Если время не правильное, то дуем в меню настройки времени
3. там нас ждут подпункты год месяц все дела.
4. Вот тут вопрос можно ли обновлять только часы например или надо выключать таймер , полностью перезаписывать и включать ?Тогда заходим в них , присваем переменной значение и изменяем ее на нужное нам. Такс....Ну и при выходе надо обновить значения всех переменных времени и выкл-записываем-вкл таймер с новыми значениями.
5. а после выхода попадаем в функцию вывода времени на экран уже с новыми значениями.
Как вам мой вариант :)))) Чет мудрено помойму .
Какие есть идеи по данной реализации ? Можно ли в функции обновлять значения времени таймера ?
помогите понять что это значит ?
RTC.setRAM(0, (uint8_t *)&startAddr, sizeof(uint16_t));
или это
RTC.getRAM(54, (uint8_t *)&TimeIsSet, sizeof(uint16_t));
не могу понять что куда записывается.....
Так время вроде удалось сделать.... Но вот вопрос , почему не перезаписывает значения ?
Возьми просто "DS1307.h". Там все проще и явное обращение к переменным времени.
Не могу чтото примера найти. Вот с какой библиотекой нашел , так и сделал:) Вообщем то не проблема залить сначала нормальную дату и запомнить ее навсегда.
Сейчас таймеры думаю , вот это вроде норм такая задачка оказалась :)