13-11-2017, 23:42
Obecnie mam to:
Mam jeszcze algorytm jak ma się zachowywać program sterujący, który nie będzie wyzwaniem dlatego go jeszcze nie wpisałem w program. Odczyt temperatury na wyświetlaczy zrobiłem co 10s ponieważ bazując na bibliotece dallas skazuje program na opóźnienia, których chcę uniknąć ale uznałem, iż użycie tej biblioteki będzie najlepszym rozwiązaniem dla tej aplikacji. Proszę wybaczyć bałagan w kodzie, ma szczątki prób implementacji menu i testowaniu innych elementów.
Kod:
//Biblioteki
#include <OneWire.h> //dodaj biblitekę LiquidCrystal.h
#include <DallasTemperature.h> //dodaj biblitekę LiquidCrystal.h
#include <LiquidCrystal_I2C.h>
#include "PinChangeInterrupt.h"
//Przypisanie Pinów
#define dmuchawa 9
#define pompa 10
#define podajnik 11
#define disconnected 12 //Przekaźnik nie używany, zostawiony do przyszłej rozbudowy
#define switch1 2
#define rotaryA 4
#define rotaryB 3
//Zmienne
boolean sw1pre = 1, sw1akt = 1;
int x = 0, xpre = 0, one_wire = 8, value=0; //x, y - pozycja kursora, z zmienne pomocnicze menuTransmisja 1-Wire (czujniki temperatury na pinie 8)
float t1,t3,t5; //t1 - temperatura nastawiona, t3 - temperatura pieca, t5 - temperatura w pokoju
unsigned long czas = millis();
unsigned long time = 0;
//Zainicjowanie Bibliotek
LiquidCrystal_I2C lcd(0x27, 20, 4);
OneWire oneWire(one_wire); //wywołujemy transmisję 1-Wire na pinie 10
DallasTemperature sensors(&oneWire); //informujemy Arduino, ze przy pomocy 1-Wire
//Utworzenie znaku kursora
byte cursor[8] = {
0b11000,
0b10100,
0b10010,
0b10001,
0b10001,
0b10010,
0b10100,
0b11000
};
void setup(void)
{
lcd.createChar(0, cursor); //Utworzenie znaku kursora
time = millis();
pinMode(disconnected, OUTPUT);
pinMode(dmuchawa, OUTPUT);
pinMode(pompa, OUTPUT);
pinMode(podajnik, OUTPUT);
pinMode(switch1, INPUT_PULLUP);
pinMode(rotaryA, INPUT_PULLUP);
pinMode(rotaryB, INPUT_PULLUP);
digitalWrite(dmuchawa, HIGH);
digitalWrite(pompa, HIGH);
digitalWrite(podajnik, HIGH);
digitalWrite(disconnected, HIGH);
sensors.begin(); //rozpocznij odczyt z czujnika
lcd.begin();
lcd.backlight();
Serial.begin(9600);
lcd.clear(); //wyczysc ekran
lcd.setCursor(1,0);
lcd.print("STEROWNIK PIECA CO");
lcd.setCursor(8,1);
lcd.print("V1.0");
lcd.setCursor(4,2);
for(x=0; x<=12; x++){
delay(800);
lcd.print("#");
}
x=0;
lcd.clear();
attachPCINT(digitalPinToPCINT(switch1), pressbutton, FALLING);
attachPCINT(digitalPinToPCINT(rotaryA), rotaryUP, RISING);
attachPCINT(digitalPinToPCINT(rotaryB), rotaryDW, RISING);
}
//Obrót Enkodera w Lewo
void rotaryDW(void) {
if ((millis() - time) > 50)
value--;
time = millis();
}
//Obrót Enkodera w Prawo
void rotaryUP(void) {
if ((millis() - time) > 50)
value++;
time = millis();
}
//Nacisnięcie przycisku Enkodera
void pressbutton(){
xpre = x;
x++;
value=0;
}
//Wyświetlanie aktualnej temperatury
void menu(){
if(xpre != x){
lcd.clear();
xpre = x;
}
lcd.setCursor(0,0);
lcd.print("Temp. Nast.:");
lcd.print(t1);
lcd.setCursor(0,1); //ustaw kursor w pozycji 0,0
lcd.print("Temp. Piec :"); //wyswietl "Temperatura: "
lcd.print(t3); //wyswietl wartosc z czujnika 0
lcd.write(byte(223)); //wyswietl znak stopnia
lcd.print("C");
lcd.setCursor(0,2); //ustaw kursor w pozycji 0,0
lcd.print("Temp. Pokoj:"); //wyswietl "Temperatura: "
lcd.print(t5); //wyswietl wartosc z czujnika 1
lcd.write(byte(223)); //wyswietl znak stopnia
lcd.print("C");
}
//Odczyt temperatury z czujników
void tempread(){
sensors.requestTemperatures(); //zazadaj odczyt temperatury z czujnika
t3 = sensors.getTempCByIndex(0);
t5 = sensors.getTempCByIndex(1);
}
void loop(void)
{
//Odczyt temeratury co 10s
if((millis()- czas)> 10000){
tempread();
czas = millis();
}
menu();
}