помогите с небольшой проблемкой

jurafuxman
Offline
Зарегистрирован: 25.07.2014

0.96" Oled дисплей i2c.

ds1302 часики

dht11 термодатчик.

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

времени в самом коде либо мигал диодиком,ну или бибикал. типа в 18:22 включал свет на 5 мин . и что-бы с термодатчиком так-же можно было делать. перепробывал разные подходы , ну никак не заставить. в програмировании я слабоват. Помогите если кто может.


#include <Arduino.h>
#include <Wire.h>
#include <MicroLCD.h>
#include <dht.h>
#include <DS1302.h>

#define dht_dpin A0 //no ; here. Set equal to channel sensor is on

DS1302 rtc(2, 3, 4);
dht DHT;
//LCD_SH1106 lcd; /* for SH1106 OLED module */
LCD_SSD1306 lcd; /* for SSD1306 OLED module */

static const PROGMEM uint8_t cels[] =
{
0x00, 0x00, 0xF0, 0xF8, 0x18, 0x18, 0x18, 0x38, 0x30, 0x00, 0x00, 0x30, 0x48, 0x48, 0x30, 0x00,
0x00, 0x00, 0x0F, 0x1F, 0x18, 0x18, 0x18, 0x1C, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


static const PROGMEM uint8_t perc[] ={
0x00, 0x00, 0x00, 0x18, 0x24, 0x24, 0x18, 0x80, 0xC0, 0x60, 0x38, 0x1C, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x20, 0x38, 0x1C, 0x06, 0x03, 0x01, 0x18, 0x24, 0x24, 0x18, 0x00, 0x00, 0x00
};


static const PROGMEM uint8_t smile[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0xE8, 0xEC, 0xCE, 0x8E, 0x8E, 0x8C,
0x88, 0x80, 0x80, 0x00, 0x3C, 0x78, 0xF0, 0xC0, 0xC0, 0xDC, 0x58, 0x10, 0x00, 0xFE, 0xFE, 0xFE,
0x26, 0x6E, 0xFC, 0xF8, 0xD0, 0x80, 0x00, 0xFE, 0xFE, 0xFE, 0x6E, 0x6E, 0x6C, 0x48, 0x00, 0x00,
0x00, 0xFE, 0xFE, 0xFE, 0xCE, 0xCE, 0xDE, 0xFC, 0xF8, 0x30, 0x00, 0x00, 0xFE, 0xFE, 0xFE, 0x1E,
0x3C, 0x78, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0xF0, 0xF8, 0xFC, 0x9E, 0x0E, 0x0E, 0x0E, 0x9E, 0xFC,
0xF8, 0x70, 0x00, 0xE0, 0xE8, 0xEC, 0xCE, 0x8E, 0x2E, 0x6C, 0xE8, 0xC0, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03,
0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x02,
0x00, 0x03, 0x03, 0x03, 0x01, 0x01, 0x01, 0x03, 0x03, 0x02, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03,
0x03, 0x03, 0x03, 0x03, 0x01, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x01,
0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x03, 0x03, 0x03, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0,
0xFF, 0xFC, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80,
0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0xFC,
0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
0x7F, 0xFF, 0xFF, 0xFF, 0xFC, 0xF0, 0x10, 0x08, 0x04, 0x02, 0x02, 0x01, 0x01, 0x01, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x04, 0x04, 0x18, 0x30, 0xF8, 0xFE, 0xFF, 0xFF,
0xFF, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0x0F, 0xFF, 0x7F, 0xFF, 0x0C, 0x10, 0x30, 0x60, 0x60, 0xC0, 0xC0, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xC0, 0x60, 0x20, 0x30, 0x18, 0xFE, 0xFF, 0xBF, 0x1F, 0x07,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x03, 0x3E, 0x78, 0xF1, 0xF2, 0xE2, 0xE2, 0xC6, 0x04, 0x0D, 0x0F, 0x1E, 0x00,
0x00, 0x00, 0x1C, 0x0F, 0x0D, 0x0D, 0xC4, 0xE6, 0xE2, 0xF2, 0xF1, 0xF9, 0x7C, 0x1F, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x07, 0x1F, 0x00, 0x00, 0x06, 0x1E,
0x1E, 0x1E, 0x0E, 0x02, 0x00, 0x00, 0x1F, 0x07, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7E, 0x7E, 0x4A, 0x4A, 0x4A, 0x40, 0x00, 0x7E, 0x7E, 0x40, 0x40, 0x40, 0x40, 0x00, 0x7E,
0x7E, 0x4A, 0x4A, 0x4A, 0x40, 0x00, 0x3C, 0x7E, 0x62, 0x42, 0x42, 0x42, 0x00, 0x02, 0x7E, 0x7E,
0x02, 0x02, 0x02, 0x00, 0x7E, 0x7E, 0x26, 0x6E, 0x7C, 0x58, 0x00, 0x3C, 0x7E, 0x62, 0x62, 0x7E,
0x3E, 0x00, 0x7E, 0x7E, 0x18, 0x30, 0x7E, 0x7E, 0x00, 0x42, 0x7E, 0x7E, 0x00, 0x3C, 0x7E, 0x62,
0x42, 0x42, 0x42, 0x00, 0x5C, 0x5E, 0x5A, 0x7A, 0x7A, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x42, 0x7E, 0x7E, 0x00, 0x7E, 0x7E, 0x18, 0x30, 0x7E, 0x7E, 0x00, 0x3C, 0x7E, 0x62, 0x42,
0x42, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};


const PROGMEM uint8_t tick[16 * 16 / 8] =
{0x00,0x80,0xC0,0xE0,0xC0,0x80,0x00,0x80,0xC0,0xE0,0xF0,0xF8,0xFC,0x78,0x30,0x00,0x00,0x01,0x03,0x07,0x0F,0x1F,0x1F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00,0x00};

const PROGMEM uint8_t cross[16 * 16 / 8] =
{0x00,0x0C,0x1C,0x3C,0x78,0xF0,0xE0,0xC0,0xE0,0xF0,0x78,0x3C,0x1C,0x0C,0x00,0x00,0x00,0x30,0x38,0x3C,0x1E,0x0F,0x07,0x03,0x07,0x0F,0x1E,0x3C,0x38,0x30,0x00,0x00};


void setup()
{
  	lcd.begin();
	lcd.draw(smile, 128, 64);
	delay(1000);
        lcd.clear();
}

void loop()
{
DHT.read11(dht_dpin);	
lcd.setCursor(0, 0);
lcd.println(rtc.getDOWStr());
lcd.setCursor(50, 0);
lcd.println(rtc.getDateStr());
lcd.setFontSize(FONT_SIZE_MEDIUM);
lcd.setCursor(0, 2);
lcd.println(rtc.getTimeStr());
lcd.setFontSize(FONT_SIZE_SMALL);
delay(100);
 lcd.setCursor(0, 5);
lcd.print(" T=");
lcd.print(DHT.temperature);	
lcd.print(" Celsius");	
lcd.setCursor(0, 6);
lcd.print(" H=");
lcd.print(DHT.humidity);
lcd.print(" %");

}

 

leds
Offline
Зарегистрирован: 20.10.2014

Можно вот так:

#include <Arduino.h>
#include <Wire.h>
#include <MicroLCD.h>
#include <dht.h>
#include <DS1302.h>

#define dht_dpin A0 //no ; here. Set equal to channel sensor is on

DS1302 rtc(2, 3, 4);
dht DHT;
//LCD_SH1106 lcd; /* for SH1106 OLED module */
LCD_SSD1306 lcd; /* for SSD1306 OLED module */

int ledPin = 13;                 // Светодиод подключенный к вход/выходу 13

unsigned long lastTime = 0;

void setup()
{
	pinMode(ledPin, OUTPUT);      // устанавливает режим работы - выход
  	lcd.begin();
	lcd.draw(smile, 128, 64);
	delay(1000);
    lcd.clear();
	lastTime = millis();
}

void loop()
{
if (millis() - lastTime > 3600000) { // 3600 тысяч миллисекунд = 1 час
	lastTime = millis();
	digitalWrite(ledPin, HIGH);   // включает светодиод
	delay(1000);                  // ждет секунду
	digitalWrite(ledPin, LOW);    // выключает светодиод
}
DHT.read11(dht_dpin);	
lcd.setCursor(0, 0);
lcd.println(rtc.getDOWStr());
lcd.setCursor(50, 0);
lcd.println(rtc.getDateStr());
lcd.setFontSize(FONT_SIZE_MEDIUM);
lcd.setCursor(0, 2);
lcd.println(rtc.getTimeStr());
lcd.setFontSize(FONT_SIZE_SMALL);
delay(100);
 lcd.setCursor(0, 5);
lcd.print(" T=");
lcd.print(DHT.temperature);	
lcd.print(" Celsius");	
lcd.setCursor(0, 6);
lcd.print(" H=");
lcd.print(DHT.humidity);
lcd.print(" %");
}
 
jurafuxman
Offline
Зарегистрирован: 25.07.2014

Спасибо. попробую

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я так понимаю что надо что то делать в заданное время, а не через промежуток времени (несмотря на то, что часто это может значить одно и то же)

Вариант предложенный leds, предусматривает не использовать модуль часов, и не будет зависить от времени вобще. Т.е. через час после заливки скетча и каждый час.

и там ещё можно напоротся на переполнение millis и обнуление...

Я бы предпочёл читать время из модуля часов и после этого что то уже делать.

 

jurafuxman
Offline
Зарегистрирован: 25.07.2014

Вы правы hugoboss317. именно это мне и надо. я пробывал несколько вариантов из других скечей. но неполучается. я пока не силен в програмировании.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Можно попробовать сделать следущее:

Добавить в библиотеку функцию для чтения значений времени, но не для формирования массива символов, как это уже есть.

т.е. не 



getTime()

а, допустим (как назвать решаем сами):



getTimeD() 

и соответственно в файл cpp вставляем 



byte DS1302::getTimeD(uint8_t poss)  //считать время
{
	byte time;
	_burstRead();
	switch(poss)
	{
		case REG_SEC: time	= _decode(_burstArray[0]); break;
		case REG_MIN: time	= _decode(_burstArray[1]); break;
		case REG_HOUR:time  = _decodeH(_burstArray[2]);break;
		case REG_DATE:time  = _decode(_burstArray[3]); break;
		case REG_MON: time  = _decode(_burstArray[4]); break;
		case REG_DOW: time  = _burstArray[5]; break;
		case REG_YEAR:time  = _decode(_burstArray[6]); break;
	}
	return time;
}

где poss от 0 до 6 и прочитает секунды, минуты ..... год ( 0 -> секунды , 6 -> год)

а в файл .h нужно впихнуть прототип этой функции

byte    getTimeD(uint8_t poss);

сразу после 

Time	getTime();

Выглядить в итоге должно примерно так:

byte m, ch;

m = getTimeD(1); //присваеваем значение текущих минут
сh = getTimeD(2); // ...текущего часа
if(ch == 14 && m == 20) {} // делаем что надо (целую минуту)

 

jurafuxman
Offline
Зарегистрирован: 25.07.2014

я так понял добовлять надо в библиотеку часов. или в сам скеч?

hugoboss317
Offline
Зарегистрирован: 21.03.2013

jurafuxman пишет:

я так понял добовлять надо в библиотеку часов. или в сам скеч?

Часов конечно. .cpp и .h  это файлы библиотеки. На сколько я вижу, Вы используете DS1302

jurafuxman
Offline
Зарегистрирован: 25.07.2014

ok попробуем.