Close

Odpověď na: Osvětlení akvaria Led pásky

Úvodní stránka Fórum Vaše projekty Arduino Osvětlení akvaria Led pásky Odpověď na: Osvětlení akvaria Led pásky

#8955
Nasranek
Účastník

Minulý týden jsem dodělal a teď je už je i odzkoušen Led pásek/stmívač/teplota vody/hodiny/Displej Nokia 5110(čekám na 4×20 I2C displej pak předělám na něj).
Program má nějaké nedostatky – mám ho ve dvou verzích jedna vypíná/zapíná podsvícení displeje mechanicky (Pod světlení je rozpojované spínačem) tu tady dám, pod světlení přes tlačítko řešeno výstupem s Arduina, má tu nevýhodu – pří startu pásku nereaguje hned ale od 1-10 sekund protože Led postupně rozsvěcuje cca 42 minut a krok je po 10 sekundách.
Sériový výstup je vypnut(žere moc prostředků pro lokální proměnné)
budete potřebovat 2 knihovny a to tyto:

#include <DallasTemperature.h>
#include <Nokia_5110.h> //https://github.com/baghayi/Nokia_5110

const int pinCidlaDS = 2;//teplotní čidlo vody je připojeno k Digitálním pinu D2

OneWire oneWireDS(pinCidlaDS);

DallasTemperature senzoryDS(&oneWireDS);

//nastavení pinu pro displej, můžou být skoro všechny digitální, ale jeden pwm musíte nechat pro řízení mosfetu (pwm 11,10,9,6,5,3)
// BL - podsvícení rozpojit přes spínač jinak bude v kuse svítit ve verzi 1.3 je napojen na D10,ale zpožďuje
#define RST 4
#define CE 5
#define DC 6
#define DIN 7
#define CLK 8

Nokia_5110 lcd = Nokia_5110(RST, CE, DC, DIN, CLK);

#include <Wire.h>
#include <DS3231.h> //http://www.rinkydinkelectronics.com/library.php?id=73

DS3231  rtc(SDA, SCL);

#define DS3231_I2C_ADDRESS 0x68
// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val / 10 * 16) + (val % 10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val / 16 * 10) + (val % 16) );
}
int svetlo1 = 11;//pwm vystup
int sviti = 0;
int den = 0;

byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

void setup()
{
  rtc.begin();
  lcd.clear();//smaže obrazovku
  lcd.setContrast(30);//nastavení kontrastu je to individuální, mám jich několik a každý chce něco jiného ale je to v rozmezí 30-60

  Wire.begin();
  // Nastavení hodin a datumu po nastavení dát do poznámek v mění se jen to co jen odemknuto
  

  //rtc.setDOW(3);  // Den v tydnu- mozno napsat jako cislo nebo jako den -- rtc.setDOW(1)

  //rtc.setTime(17, 31, 20);     // Nastaveni Casu 12:00:00 (24hod format) po nastavení dát "//" a znovu nahrát jinak při resetu se znovu nastaví
  
  // rtc.setDate(21, 10, 2016);   // Nastaveni datumu den/mesic/rok
}

void readDS3231time(byte *second, byte *minute, byte *hour, byte *dayOfWeek, byte *dayOfMonth, byte *month, byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());

}
void displayTime()

{

  // příjem dat z DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);
  senzoryDS.requestTemperatures();//při stmívání nebo svítání obnovuje co 10 sekund jinak co 1 sekundu

  lcd.setCursor(0, 0);
  lcd.print ("Cas: ");
  lcd.print(rtc.getTimeStr(1));// v zavorce 1 bez sekund, prazdna ukaze sekundy,ale při startu LED skače o 11 a je to ...
  lcd.print(" hod.");
  lcd.setCursor(0, 2);                  // pokud máte teplotní čidlo napevno a nevypadává Vám není potřeba
  lcd.print("T. Vody:               "); //  já mám prototyp který nebude použit tak to řeším přepsáním
  lcd.setCursor(0, 2);
  lcd.print("T. Vody:  ");
  lcd.print(senzoryDS.getTempCByIndex(0));

  lcd.setCursor(0, 1);
  lcd.print("Dat. ");
  lcd.print(rtc.getDateStr());
  lcd.setCursor(0, 3); lcd.print("T. Okoli: ");
  lcd.print(rtc.getTemp()); //Hodiny real.času ds3231 mají v sobě teploměr - teplotni cidlo obnovuje co 64 sekund dá se to zkrátit, ale nebudu zbytečně zvětšovat program
  lcd.setCursor(0, 4); lcd.print(" ------------");

}
void loop()
{
  senzoryDS.requestTemperatures();
  pinMode(svetlo1, OUTPUT);
  displayTime();
  delay(1000);

  byte s, m, h, dvt, dvm, mesic, r;
  readDS3231time(&s, &m, &h, &dvt, &dvm, &mesic, &r);

  if (h >= 9 && h < 21) den = 1; // nastaveni intervalu sviceni
  else den = 0;
  for (byte brightness = 0; den == 1 && sviti == 0 && brightness <= 255; brightness ++) {
    displayTime();
    analogWrite(svetlo1, brightness);
    if (brightness == 255) sviti = 1;
    lcd.setCursor(0, 5);
    lcd.print("Stav Led:       ");
    lcd.setCursor(0, 5);
    lcd.print("Stav Led: ");
    lcd.print(brightness);
     delay(10000);

  }

  for (byte brightness = 255; den == 0 && sviti == 1 && brightness >= 0; brightness --) {
    displayTime();
    analogWrite(svetlo1, brightness);
    if (brightness == 0) sviti = 0;
    lcd.setCursor(0, 5);
    lcd.print("Stav Led:       ");
    lcd.setCursor(0, 5);
    lcd.print("Stav Led: ");
    lcd.print(brightness);
       delay(10000);
  }

}