krycha88 wrote: Mon Nov 04, 2019 8:49 pm
wrobel111 wrote: Mon Nov 04, 2019 8:44 pm
Witam,
termostat mam zainstalowany w łazience a chciałbym aby czujnik temperatury był w pokoju. Nie uśmiecha mi się ciągnięcie przewodów do salonu. Wymyśliłem więc że aby
termostat nadal działał przy braku internetu wykorzystam do komunikacji moduły nrf24l01. Czy w związku z tym poza inicjalizacją starczy zrobić zmiany w funkcji get_temperature() i przypisywać wartość temperatury zmiennej t ?
dokładnie tak. Ustaw zmienną t przed CheckTermostat
W końcu udało mi się znaleźć czas i po początkowych niepowodzeniach (musiałem przeanalizować po kolei poszczególne funkcje) udało mi się zrobić działający kod. Teraz pewnie przydało by się go bardziej sparametryzować, np. dodać w gui miejsce na wpisanie adresów nadajnika i odbiornika oraz przełączanie pomiędzy radiem a lokalnym ds-em.
Code: Select all
double get_temperature(int channelNumber, double last_val) {
double t = -275;
int i = channelNumber - channelNumberDS18B20;
if ( sensor[i].getDeviceCount() > 0 ) {
if ( ds18b20[i].address == "FFFFFFFFFFFFFFFF" ) return -275;
if ( millis() - ds18b20[i].lastTemperatureRequest < 0) {
ds18b20[i].lastTemperatureRequest = millis();
}
if (ds18b20[i].TemperatureRequestInProgress == false) {
sensor[i].requestTemperaturesByAddress(ds18b20[i].deviceAddress);
ds18b20[i].TemperatureRequestInProgress = true;
}
if ( millis() - ds18b20[i].lastTemperatureRequest > 1000) {
if ( ds18b20[i].type == 0 ) {
sensor[i].requestTemperatures();
t = sensor[i].getTempCByIndex(0);
} else {
t = sensor[i].getTempC(ds18b20[i].deviceAddress);
}
if (t == -127) t = -275;
ds18b20[i].lastTemperatureRequest = millis();
ds18b20[i].TemperatureRequestInProgress = false;
}
}
if(termometr_radiowy == true && channelNumber == 5 ) {
float data; //zmienna data typu FLOAT
if(Mirf.dataReady()) { // Warunek wykonywany tylko, gdy coś zostanie odebrane
Mirf.getData((byte *) &data); // Odbiór zmiennej data przy pomocy modułu nRF24L01
Serial.println(data); // Wystawienie zmiennej na UART
t = data;
}
}
//THERMOSTAT
CheckTermostat(i, t, 0);
return t;
}
Fragment w funkcji setup()
Code: Select all
/*
* Konfiguracja linii dołączonych do modułu nRF24L01:
*
* MISO: 12
* MOSI: 13
* SCK: 14
* CE: 3
* CSN: 15
*
*/
Mirf.csnPin = 15; // Konfiguracja pinu CSN biblioteki MIRF inaczej, niż domyślnie
Mirf.cePin = 3; // Konfiguracja pinu CE biblioteki MIRF inaczej, niż domyślnie
Mirf.spi = &MirfHardwareSpi; // Wykorzystanie SPI do komunikacji pryz użyciu modułów nRF24L01
Mirf.init(); // Inicjalizacja modułu MIRF
Mirf.setTADDR((byte *)"67890"); // ustawienie adresu do nadawania
Mirf.setRADDR((byte *)"12345"); // Ustawienie adresu do odbioru
Mirf.payload = sizeof(float); // Maksymalny przesył przez moduły radiowe ustawiony na wielkośc zmiennej FLOAT (4 bajty)
Mirf.config(); // Konfiguracja biblioteki MIRF