Ještě jsem zkoušel jiné verze RF24 knihovny a buď je to stejné nebo to nejde zkompilovat vůbec (aktuálně používám verzi 1.1.7
Občas se po restartu něco zobrazí na LCD "vypnuto" nebo nějaká divná hatmatilka místo teploty a po nějakém čase se jednou pošle i teplota, ale je to dost nahodilé... snaha by tedy byla...
Základna:
Kód: Vybrať všetko
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#define button 4
LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display
RF24 radio(7, 8); // CNS, CE
byte stupen[8] = { 0x6,0x9,0x9,0x6,0x0,0x0,0x0 }; //znak stupne
byte teplomer[8] = { 0x4,0xa,0xa,0xe,0xe,0x1f,0x1f,0xe }; //znak teplomer
//byte antena[8] = { 0x1f,0x15,0xe,0x4,0x4,0x4,0x4,0x4 }; //znak antena
//byte xantena[8] = { 0x1f,0x15,0xe,0x5,0x6,0x4,0xc,0x14 }; //preskrtla antena
boolean buttonState = 0;
const byte addresses[][6] = {"00001", "00002"};
int kanal1 = 111;
int kanal2 = 112;
//unsigned long time = millis();
void setup(void) {
Serial.begin(9600);
lcd.init();
lcd.backlight();
pinMode(button, INPUT);
radio.begin();
radio.setDataRate(RF24_1MBPS); // nastavení rychlosti komunikace - možnosti jsou RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
radio.setPALevel(RF24_PA_LOW); // nastavení výkonu nRF modulu - možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX, pro HIGH a MAX je nutný externí 3,3V zdroj
}
void loop() {
delay(15);
radio.setChannel(kanal1);
//nastaveno na příjem
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002
radio.startListening();
if ( radio.available()) {
float temperature = 0;
radio.read(&temperature, sizeof(temperature));
Serial.print("Temperature : ");
Serial.println(temperature);
lcd.createChar(0, stupen); //odeslání definice 1. znaku (znak 0)
lcd.createChar(1, teplomer); //odeslání definice 1. znaku (znak 0)
//lcd.createChar(2, antena); //odeslání definice 1. znaku (znak 0)
//lcd.createChar(3, xantena); //odeslání definice 1. znaku (znak 0)
lcd.setCursor (0,0 );
lcd.write(byte(1)); //zobrazí znak teplomeru (znak 0)
lcd.setCursor(1,0);
lcd.print(temperature,1);
lcd.setCursor(5, 0);
lcd.write(byte(0)); //zobrazí znak stupne (znak 0
lcd.setCursor(6,0);
lcd.print("C");
// lcd.setCursor (8,0 );
// lcd.write(byte(2)); //zobrazí znak anteny (znak 0)
//time = millis(); //srovnání hodnot time a millis
// if(millis()-time > 60000) { //uběhlo 15 sec od posledního odeslání teploty nebo od zapnutí? a radio je nedostupne?
// lcd.setCursor (8,0 );
//lcd.print(byte(3));
}
delay(15);
radio.setChannel(kanal2);
//nastaveno na příjem
radio.openWritingPipe(addresses[1]); // 00002
radio.openReadingPipe(1, addresses[0]); // 00001
radio.startListening();
if ( radio.available()) {
char text[32] = "";
radio.read(&text, sizeof(text));
lcd.setCursor (0,1 );
lcd.print(text);
char textt[32] = "";
radio.read(&textt, sizeof(textt));
lcd.setCursor (0,1 );
lcd.print(textt);
delay(15);
//nastaveno na vysílání
radio.openWritingPipe(addresses[0]); // 00001
radio.openReadingPipe(0, addresses[1]); // 00002
radio.stopListening();
buttonState = digitalRead(button);
radio.write(&buttonState, sizeof(buttonState));
}
}
Přijímač s relátkem:
Kód: Vybrať všetko
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#define rele 6
boolean buttonState = 0;
RF24 radio(7, 8); //CNS, CE
const byte addresses[][6] = {"00001", "00002"};
int kanal2 = 112;
void setup() {
pinMode(6, OUTPUT);
radio.begin();
radio.setDataRate(RF24_1MBPS); //nastavení rychlosti komunikace - možnosti jsou RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
radio.setPALevel(RF24_PA_LOW); //nastavení výkonu nRF modulu - možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX, pro HIGH a MAX je nutný externí 3,3V zdroj
radio.setChannel(kanal2);
}
void loop() {
delay(15);
//nastaveno na vysílání
radio.openWritingPipe(addresses[0]); // 00001
radio.openReadingPipe(0, addresses[1]); // 00002
radio.stopListening();
if (buttonState == HIGH) {
const char text[] = "Zapnuto";
radio.write(&text, sizeof(text));
}
else {
const char textt[] = "Vypnuto";
radio.write(&textt, sizeof(textt));
}
delay(15);
//nastaveno na příjem
radio.openWritingPipe(addresses[1]); // 00002
radio.openReadingPipe(1, addresses[0]); // 00001
radio.startListening();
while (!radio.available());
radio.read(&buttonState, sizeof(buttonState));
if (buttonState == HIGH) {
digitalWrite(rele, HIGH);
}
else {
digitalWrite(rele, LOW);
}
}
Vysílač teploty (je to nepřehledné díky deep sleepu) jinak teplota se na sériovém monitoru normálně zobrazuje jak má:
Kód: Vybrať všetko
#include <avr/sleep.h>
#include <avr/power.h>
#include <avr/wdt.h>
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 4
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
RF24 radio(7, 8); // CNS, CE
const byte addresses[][6] = {"00001", "00002"};
int kanal1 = 111;
// zde se bude ukládat zda přišel impuls z watchdog timeru
// hodnota 1 simuluje impuls po zapnutí, aby jsme nečekali
volatile int impuls_z_wdt=1;
// zde se ukládají impulsy
volatile int citac_impulsu= 2;
// zde nastavíme potřebný počet impulsů
// podle nastavení WDT viz níže je jeden impuls 8 sekund
volatile int impulsu_ke_spusteni = 5;
/* klíčové slovo volatile říká kompilítoru jak má zacházet z proměnou
načte proměné z paměti RAM a ne z paměťového registru. Vzhledem k
spánkovému režimu budou tyto hodnoty určitě poté přesné.
*/
// impuls z WATCHDOG TIMERU /////////////////
ISR(WDT_vect)
{
//když je proměnná impuls_z_wdt na 0
if(impuls_z_wdt == 0)
{
// zapiš do proměnné 1
impuls_z_wdt=1;
}
}
void enterSleep(void)
{
//nastavení nejúspornějšího módu
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// spánkový režim je povolený
sleep_enable();
// spuštění režimu spánku
sleep_mode();
// tady bude program pokračovat když se probud
// spánek zakázán
sleep_disable();
//znovu zapojení všech funkcí
power_all_enable();
}
void setup()
{
Serial.begin(9600);
sensors.begin();
radio.begin();
radio.setDataRate(RF24_1MBPS); // nastavení rychlosti komunikace - možnosti jsou RF24_250KBPS, RF24_1MBPS, RF24_2MBPS
radio.setPALevel(RF24_PA_LOW); // nastavení výkonu nRF modulu - možnosti jsou RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH and RF24_PA_MAX, pro HIGH a MAX je nutný externí 3,3V zdroj
radio.setChannel(kanal1);
//nastaveno na vysílání
radio.openWritingPipe(addresses[0]); // 00001
radio.openReadingPipe(0, addresses[1]); // 00002
radio.stopListening();
// nastavení WATCHDOG TIMERU
MCUSR &= ~(1<<WDRF); // neřešte
WDTCSR |= (1<<WDCE) | (1<<WDE); // neřešte
// nastavení času impulsu
WDTCSR = 1<<WDP0 | 1<<WDP3; // 8 sekund, WDTCSR = B0110 --> 1 sekunda
WDTCSR |= _BV(WDIE); //neřešte
}
void loop()
{
//když je impuls z WATCHDOG TIMERU a zároveň i potřebný jejich počet
if ((impuls_z_wdt == 1) & (impulsu_ke_spusteni == citac_impulsu))
{
///////////////////////////////////////////////////////////////
// zde je ukázkový kód, upravte si sami podle potřeby
sensors.requestTemperatures();
sensors.setResolution(12); //nastaveni presnosti mereni teploty moznosti 9 bits 0.5°C 93.75 ms - 10 bits 0.25°C 187.5 ms - 11 bits 0.125°C 375 ms - 12 bits 0.0625°C 750 ms
float temperature = sensors.getTempCByIndex(0);
Serial.print ( temperature );
radio.write(&temperature, sizeof(temperature));
// konec ukázkového kódu, který se v nastaveném intervalu
// bude provádět
//////////////////////////////////////////////////////////////
citac_impulsu = 0;// vynuluj čítač
impuls_z_wdt = 0; // vynuluj impuls
enterSleep();// znovu do spánku
}
else
{
enterSleep();//znovu do spánku
}
citac_impulsu++; // inpuls se přičte i když nic neproběhlo
}