31-12-2017, 14:35
Jestem od kilku dni użytkownikiem arduino. Czytam i staram się coś nauczyć ale moja wiedza w C i jak działają niektóre moduły są bliskie zera. Potrzebuje pomocy. Chciałem dodać ustawianie zegara i temperatury z np. klawiszy lub encodera ale przerosło mnie znacznie. Kod jest pobrany z różnych przykładów. Może ktoś pomoże? Dosiego Roku 2018.
To co mam teraz:
To co mam teraz:
Kod:
#include <DS18B20.h>
#include <Wire.h>
#include <OneWire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
DS3231 clock;
#define TEMPERATURE_PRECISION 12 // rozdzielczosc czujnika
#include <EEPROM.h>
OneWire onewire(2); //ustawia pin podłączenia DS18B20
DS18B20 sensors(&onewire);;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Ustawienie adresu ukladu na 0x27
#define DS3231_I2C_ADDRESS 0x68
byte stopnie[8] = { //konfigurajca znaku stopnie
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
// 0x28, 0x60, 0xE0, 0xBE, 0x8, 0x0, 0x0, 0xA6
// 0x28, 0xD2, 0xD7, 0xE2, 0x8, 0x0, 0x0, 0xD0
byte address2[8] = {0x28, 0x60, 0xE0, 0xBE, 0x8, 0x0, 0x0, 0xA6};
byte address1[8] = {0x28, 0xD2, 0xD7, 0xE2, 0x08, 0x00, 0x00, 0xD0}; // wpisany adres DS18B20
// Konwersja liczby dziesiętnej do postaci binarnej
byte decToBcd(byte val){
return( (val/10*16) + (val%10) );
}
// Konwersja liczby binarnej do postaci dziesiętnej
byte bcdToDec(byte val){
return( (val/16*10) + (val%16) );
}
void setup(){
Wire.begin();
// Ustawienie czasu w momencie inicjacji układu: 6- piątek, 7-sobota, 1-niedziela
// DS3231 seconds, minutes, hours, day, date, month, year
// setDS3231time(03,26,23,6,29,12,17); //ustawienie czasu i daty na DS3231 (sekundy, minuty, godzina, nazwa dnia, dzień, miesiąć,)
// Inicjacja czujnika
sensors.begin();
sensors.request(address1);
sensors.request(address2);
lcd.begin(20,4);
lcd.backlight(); // załączenie podświetlenia
lcd.setCursor(0,0);
lcd.print("Dzien:");
lcd.setCursor(0,1);
lcd.print("Data :");
lcd.setCursor(0,2);
lcd.print("Czas :");
// lcd.setCursor(0,3);
// lcd.print("Temp.:");
lcd.createChar(0, stopnie);
delay(200);
}
/*
void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
// ustawienie czasu i daty w DS3231
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // określa, że następna wartość ma trafić do rejestru sekund
Wire.write(decToBcd(second)); // ustawienie sekund
Wire.write(decToBcd(minute)); // ustawienie minuty
Wire.write(decToBcd(hour)); // ustawienie godziny
Wire.write(decToBcd(dayOfWeek)); // ustawienie dnia tygodnia (1=niedziela, 7=sobota itd.)
Wire.write(decToBcd(dayOfMonth)); // ustawienie dnia (1-31)
Wire.write(decToBcd(month)); // ustawienie miesiąca
Wire.write(decToBcd(year)); // ustawienie roku (0-99)
Wire.endTransmission();
}
*/
void readDS3231time(
byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
Wire.beginTransmission(DS3231_I2C_ADDRESS);
Wire.write(0); // ustawia rejestr DS3231 na 00h
Wire.endTransmission();
Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
// żąda 7 bajtów danych od modułu DS3231 począwszy od rejestru 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(){
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
// retrieve data from DS3231
readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month,
&year);
// Przekazanie danych do wyświetlenie LCD
// CZAS
// Godziny
// podczas wyświetlania konwertuje wartość zmiennej typu bitowego do postaci dziesiętnej
// Serial.print(hour, DEC);
if (hour<10) {
lcd.setCursor(7,2);
lcd.print("0");
lcd.print(hour, DEC);
} else {
lcd.setCursor(7,2);
lcd.print(hour, DEC);
}
lcd.print(":");
// Minuty
if (minute<10) {
// Serial.print("0");
lcd.setCursor(10,2);
lcd.print("0");
lcd.print(minute, DEC);
} else {
lcd.setCursor(10,2);
lcd.print(minute, DEC);
}
lcd.print(":");
//Sekundy
if (second<10){
lcd.setCursor(13,2);
lcd.print("0");
lcd.print(second, DEC);
} else {
lcd.setCursor(13,2);
lcd.print(second, DEC);
// lcd.print("'");
}
// DATA
lcd.setCursor(7,1);
if (dayOfMonth<10){
lcd.setCursor(7,1);
lcd.print("0");
lcd.print(dayOfMonth, DEC);
} else {
lcd.setCursor(7,1);
lcd.print(dayOfMonth, DEC);
}
lcd.print(".");
// Miesiąc
if (month<10){
lcd.setCursor(10,1);
lcd.print("0");
lcd.print(month, DEC);
} else {
lcd.setCursor(10,1);
lcd.print(month, DEC);
}
lcd.print(".");
//Rok
lcd.print("20");
if (year<10){
lcd.setCursor(15,1);
lcd.print("0");
lcd.print(year, DEC);
} else {
lcd.setCursor(15,1);
lcd.print(year, DEC);
}
lcd.setCursor(7,0);
switch(dayOfWeek){
case 1:
lcd.print("Niedziela ");
break;
case 2:
lcd.print("Poniedzialek");
break;
case 3:
lcd.print("Wtorek ");
break;
case 4:
lcd.print("Sroda ");
break;
case 5:
lcd.print("Czwartek ");
break;
case 6:
lcd.print("Piatek ");
break;
case 7:
lcd.print("Sobota ");
break;
}
}
void loop()
{ if (sensors.available())
{
float temperature = sensors.readTemperature(address1);
float temperature2 = sensors.readTemperature(address2);
sensors.request(address1);
sensors.request(address2);
byte temperatura2;
displayTime(); // wyświetlanie czasu rzeczywistego
lcd.setCursor(0,3);
lcd.print("CWU:");
lcd.print((temperature),1);
lcd.print((char)0);
lcd.print("C ");
lcd.setCursor(11,3);
lcd.print("CO:");
lcd.print((temperature2),1);
lcd.print((char)0);
lcd.print("C");
// if (sensors.readTemperature(address2)>55){
// lcd.noBacklight();
// delay(1000);
// lcd.backlight();
// }
// mruga : po godzinie
delay(500);
lcd.setCursor(9,2);
lcd.print(" ");
delay(500);
}}