Выкладываю скетч часов с термометром от andycat (arduino.ru) , может кто нибудь обработает (у меня пока со временем туговато). Там есть управление яркостью, функция showLedBuf().
Код: Выделить всё
#include <RCSwitch.h>
#include <Wire.h>
#include <RTClib.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif
#define PB2_HIGH sbi(PORTB,PB2);
#define PB2_LOW cbi(PORTB,PB2);
#define PB3_HIGH sbi(PORTB,PB3);
#define PB3_LOW cbi(PORTB,PB3);
#define PB4_HIGH sbi(PORTB,PB4);
#define PB4_LOW cbi(PORTB,PB4);
#define RX_PIN 2 // green
// GND blue +5V yellow
#define DS_TPN 8 // DS18B20 grey
// GND black +5V white
OneWire oneWire(DS_TPN);
DallasTemperature sensors(&oneWire);
#define FOTORES A1 // grey
// GND yellow +5V maroon
#define RTC_SDA A4 // - red
#define RTC_SCL A5 // - black
// GND white +5V grey
RTC_DS1307 RTC;
#define LED_SCLK 10 // - blue PB2
#define LED_RCLK 11 // - green PB3
#define LED_DIO 12 // - maroon PB4
// GND yellow +5V orange
#define CYCLE_GET_TIME 60
#define CYCLE_SHOW 4
#define CYCLE_GET_TEMP 243
#define BMP_SCK 4 // - green
#define BMP_MISO 5 // - yellow
#define BMP_MOSI 6 // - orange
#define BMP_CS 7 // - red
// GND blue +5V maroon
//Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
byte LED_0F[33] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E, 0xC2, 0x89, 0xF9, 0xF1, 0xC3, 0xA9, 0xC0, 0x8C, 0x98, 0x92, 0xC1, 0x91, 0xFE, 0xBF, 0xFF, 0x9C, 0xAB};
// 0123456789AbCdEFGHIJLnOPqSUY_- (null) (degree) (mm)
byte LED_NU[8] = {16, 32, 64, 128, 1, 2, 4, 8};
byte LED_BUF[8] = {30, 30, 30, 30, 30, 30, 30, 30};
byte LED_PWM = 3; // level light 7 = MAX 0 = MIN
byte dd = 99; // day
byte mm = 99; // month
byte yh = 99; // high year
byte yl = 99; // low year
byte ho = 99; // hour
byte mi = 99; // minute
float tt = 99; // temp
float pr = 99; // pressure
unsigned long lu = 0; // last time get street temp
byte streettemp = 99; // street temp 0..60
word mas_str_temp[10];
byte med_str_pos = 0;
byte med_str_cnt = 0;
boolean minus_str_temp = false;
unsigned long timerSec = 0;
byte timerGetTime = 37;
byte timerShow = 0;
byte timerGetTemp = 242;
byte flShow = 0; // 0 time and temp 1 date 2 street temp 3 press
RCSwitch mySwitch = RCSwitch();
void setup() {
// put your setup code here, to run once:
// OFF unused pins
pinMode(0, OUTPUT); digitalWrite(0, LOW);
pinMode(1, OUTPUT); digitalWrite(1, LOW);
pinMode(3, OUTPUT); digitalWrite(3, LOW);
pinMode(10, OUTPUT); digitalWrite(10, LOW);
pinMode(13, OUTPUT); digitalWrite(13, LOW);
pinMode(A0, OUTPUT); digitalWrite(A0, LOW);
pinMode(A2, OUTPUT); digitalWrite(A2, LOW);
pinMode(A3, OUTPUT); digitalWrite(A3, LOW);
pinMode(A6, OUTPUT); digitalWrite(A6, LOW);
pinMode(A7, OUTPUT); digitalWrite(A7, LOW);
//--
pinMode(LED_SCLK, OUTPUT);
pinMode(LED_RCLK, OUTPUT);
pinMode(LED_DIO, OUTPUT);
sensors.begin();
Wire.begin();
if (! RTC.begin()) {
while (1);
}
if (! RTC.isrunning()) {
// following line sets the RTC to the date & time this sketch was compiled
// RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
// This line sets the RTC with an explicit date & time, for example to set
// January 21, 2014 at 3am you would call:
// rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
}
//delay(2000);
//RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));
bmp.begin();
mySwitch.enableReceive(0); // Receiver on inerrupt 0 => that is pin 2 // иницилизация.Используется вывод м/к с прерыванием под номером 0.
}
byte addPoint(byte inByte) {
byte outByte = (inByte << 1);
outByte = (outByte >> 1);
return outByte;
}
void showLedBuf() {
for (byte lp = 0; lp <= LED_PWM; ++lp) {
for (byte i = 0; i <= 7; i++) {
PB3_LOW;
for (byte j = 0; j <= 7; j++) {
if (bitRead(LED_BUF[i], (7 - j))) {
PB4_HIGH;
} else {
PB4_LOW;
}
PB2_HIGH;
PB2_LOW;
}
for (byte j = 0; j <= 7; j++) {
if (bitRead(LED_NU[i], (7 - j))) {
PB4_HIGH;
} else {
PB4_LOW;
}
PB2_HIGH;
PB2_LOW;
}
PB3_HIGH;
}
}
for (byte lp = 0; lp < (7 - LED_PWM); ++lp) {
PB3_LOW;
PB4_HIGH;
for (byte j = 0; j <= 15; j++) {
PB2_HIGH;
PB2_LOW;
}
PB3_HIGH;
delayMicroseconds(350);
}
}
void loop() {
// put your main code here, to run repeatedly:
// receive street temp
if (mySwitch.available()) {
unsigned long receivedCode = mySwitch.getReceivedValue();
mySwitch.resetAvailable();
if ((receivedCode >= 11500UL) && (receivedCode <= 14750UL)) {
receivedCode -= 11500;
if (((receivedCode >= 2000UL) && (receivedCode <= 2600UL)) || ((receivedCode >= 0UL) && (receivedCode <= 400UL))) {
if ((receivedCode <= 400UL)) {
receivedCode = 2000UL - receivedCode;
}
lu = millis();
// correct temp
if (receivedCode <= 1900UL) {
receivedCode -= 12UL; // 1.2 degree
} else {
if (receivedCode <= 1950UL) {
receivedCode -= 8UL; // 0.8 degree
}
else {
if (receivedCode <= 1999UL) {
receivedCode -= 5UL; // 0.5 degree
}
}
}
// --
mas_str_temp[med_str_pos] = (word)(receivedCode);
if ((++med_str_pos) >= 10) {
med_str_pos = 0;
}
if ((++med_str_cnt) >= 10) {
med_str_cnt = 10;
}
word sum_temp = 0;
for (int i = 0; i < med_str_cnt; ++i) {
sum_temp += mas_str_temp[i];
}
sum_temp /= med_str_cnt;
if (sum_temp < 2000) {
minus_str_temp = true;
sum_temp = 2000 - sum_temp;
} else {
minus_str_temp = false;
sum_temp -= 2000;
}
sum_temp /= 10;
streettemp = (byte)(sum_temp);
}
}
}
if ((millis() - timerSec) >= 1000UL) {
timerSec = millis();
//++timerGetTime; ++timerShow; ++timerGetTemp;
if ((++timerGetTime) >= CYCLE_GET_TIME) {
timerGetTime = 0;
// get time and date
DateTime now = RTC.now();
dd = now.day();
mm = now.month();
yh = (now.year()) / 100;
yl = (now.year()) % 100;
ho = now.hour();
mi = now.minute();
}
if ((++timerShow) >= CYCLE_SHOW) {
timerShow = 0;
switch (flShow) {
case 1 : {
// show date
if ((dd >= 1) && (dd <= 31)) {
if (dd < 10) {
LED_BUF[0] = LED_0F[30]; LED_BUF[1] = LED_0F[(dd % 10)];
} else {
LED_BUF[0] = LED_0F[(dd / 10)]; LED_BUF[1] = LED_0F[(dd % 10)];
}
} else {
LED_BUF[0] = LED_0F[30]; LED_BUF[1] = LED_0F[30];
}
LED_BUF[1] = addPoint(LED_BUF[1]);
if ((mm >= 1) && (mm <= 12)) {
if (mm < 10) {
LED_BUF[2] = LED_0F[0]; LED_BUF[3] = LED_0F[(mm % 10)];
} else {
LED_BUF[2] = LED_0F[(mm / 10)]; LED_BUF[3] = LED_0F[(mm % 10)];
}
} else {
LED_BUF[2] = LED_0F[30]; LED_BUF[3] = LED_0F[30];
}
LED_BUF[3] = addPoint(LED_BUF[3]);
if ((yh >= 20) && (yh <= 29) && (yl >= 00) && (yl <= 99)) {
LED_BUF[4] = LED_0F[(yh / 10)]; LED_BUF[5] = LED_0F[(yh % 10)];
if (yl < 10) {
LED_BUF[6] = LED_0F[0]; LED_BUF[7] = LED_0F[(yl % 10)];
} else {
LED_BUF[6] = LED_0F[(yl / 10)]; LED_BUF[7] = LED_0F[(yl % 10)];
}
} else {
LED_BUF[4] = LED_0F[30]; LED_BUF[5] = LED_0F[30]; LED_BUF[6] = LED_0F[30]; LED_BUF[7] = LED_0F[30];
}
++flShow;
break;
}
case 2 : {
unsigned long cplu = timerSec - lu;
if (((cplu) <= 10800000UL) && (streettemp < 99)) { // MAX 3 hour
LED_BUF[3] = LED_0F[31];
LED_BUF[4] = LED_0F[30];
LED_BUF[5] = LED_0F[30];
LED_BUF[6] = LED_0F[30];
LED_BUF[7] = LED_0F[30];
if (minus_str_temp) {
LED_BUF[0] = LED_0F[29];
} else {
LED_BUF[0] = LED_0F[30];
}
if (streettemp < 10) {
LED_BUF[1] = LED_0F[30]; LED_BUF[2] = LED_0F[(streettemp % 10)];
} else {
LED_BUF[1] = LED_0F[(streettemp / 10)]; LED_BUF[2] = LED_0F[(streettemp % 10)];
}
++flShow;
// culculate and show delay last data from device
unsigned long j = cplu / 600000UL; // 1 point = 10 sec (10000UL). if need 10 minute = 600000UL
j = constrain(j, 0UL, 8UL);
for (unsigned long i = 1UL; i <= j; ++i) {
LED_BUF[8 - i] = addPoint(LED_BUF[8 - i]);
}
// -
break;
} else {
++flShow;
}
// show street temp
}
case 3 : {
// show press
if ((pr >= 600) && (pr <= 900)) {
LED_BUF[0] = LED_0F[30]; LED_BUF[1] = LED_0F[30]; LED_BUF[5] = LED_0F[30]; LED_BUF[6] = LED_0F[32]; LED_BUF[7] = LED_0F[32];
int hp = int(pr);
LED_BUF[2] = LED_0F[(hp / 100)];
byte pd = hp % 100;
LED_BUF[3] = LED_0F[(pd / 10)]; LED_BUF[4] = LED_0F[(pd % 10)];
flShow = 0;
break;
} else {
LED_BUF[0] = LED_0F[30]; LED_BUF[1] = LED_0F[30]; LED_BUF[2] = LED_0F[30]; LED_BUF[3] = LED_0F[30];
LED_BUF[4] = LED_0F[30]; LED_BUF[5] = LED_0F[30]; LED_BUF[6] = LED_0F[30]; LED_BUF[7] = LED_0F[30];
flShow = 0;
}
}
default : {
// show time and temp
if ((ho >= 0) && (ho <= 23)) {
if (ho < 10) {
LED_BUF[0] = LED_0F[30]; LED_BUF[1] = LED_0F[(ho % 10)];
} else {
LED_BUF[0] = LED_0F[(ho / 10)]; LED_BUF[1] = LED_0F[(ho % 10)];
}
} else {
LED_BUF[0] = LED_0F[30]; LED_BUF[1] = LED_0F[30];
}
LED_BUF[1] = addPoint(LED_BUF[1]);
if ((mi >= 0) && (mi <= 59)) {
if (mi < 10) {
LED_BUF[2] = LED_0F[0]; LED_BUF[3] = LED_0F[(mi % 10)];
} else {
LED_BUF[2] = LED_0F[(mi / 10)]; LED_BUF[3] = LED_0F[(mi % 10)];
}
} else {
LED_BUF[2] = LED_0F[30]; LED_BUF[3] = LED_0F[30];
}
// show temp
if ((tt >= (-30)) && (tt <= 40)) {
byte ta;
if (tt < 0) {
LED_BUF[4] = LED_0F[29]; ta = abs(tt);
} else {
LED_BUF[4] = LED_0F[30]; ta = tt;
}
if (ta < 10) {
LED_BUF[5] = LED_0F[30]; LED_BUF[6] = LED_0F[(ta % 10)];
} else {
LED_BUF[5] = LED_0F[(ta / 10)]; LED_BUF[6] = LED_0F[(ta % 10)];
}
LED_BUF[7] = LED_0F[31];
} else {
LED_BUF[4] = LED_0F[30]; LED_BUF[5] = LED_0F[30]; LED_BUF[6] = LED_0F[30]; LED_BUF[7] = LED_0F[30];
}
++flShow;
}
}
}
if ((++timerGetTemp) >= CYCLE_GET_TEMP) {
timerGetTemp = 0;
// get temp and bar
sensors.requestTemperatures(); tt = sensors.getTempCByIndex(0);
if (tt == 0.00) {
tt = 99;
}
// get bmp280
pr = (bmp.readPressure() / 133.322);
}
}
// set display light
word ll = analogRead(FOTORES);
LED_PWM = map(ll, 0, 1023, 0, 7);
// show info
showLedBuf();
//--- end loop
}