Hallo zusammen.
Gleich das nächste Problem.
Ich habe einen Nano mit einem GPS NEO6m, welches über Softwareserial an PIN 9 und 10 hängt. Hardwareserial brauche ich für die USB Serial Kommunikation. Das funktioniert jetzt.
Dann ist (u.a.) noch ein nRF24l01+ Funkmodul mit angeschlossen. Und das macht jetzt Probleme. Aus irgendeinem Grund kann ich keine Daten vom GPS bekommen, wenn das nRF24l01+ initialisiert ist. Habe es per Trail&Fail rausbekommen. Wenn ich die initialisierung des RF24 auskommentiere, dann geht das GPS.
Hat das Problem schon mal jemand gehabt?
Gibt es evtl. Probleme mit den Pins? RF24 (6,7…11,12,13) und NEO (9,10)?
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <SoftwareSerial.h>
#include <TinyGPS.h>
#include <DHT.h>
//definition
int Pin_RF_CE = 6;
int Pin_RF_CSN = 7;
[b]int Pin_GPS_TX = 9;
int Pin_GPS_RX = 10;[/b]
int Pin_DHT22 = 8;
int Pin_Relay_RPI = 5;
int Pin_Relay_Light = 4;
int Pin_Relay_Alarm = 3;
int Pin_empty = 2;
int Pin_PIR = 10;
int Pin_LRD = A0;
int Pin_Buzzer = A1;
int swtich_what = 0;
unsigned long ldr_timer = millis();
// TO DO
// Buzzer : D* -> Beep if unauthorized access is detected
// PIR
[b]// nRF24L01
String PiData;
//for nrf24 debug
int serial_putc( char c, FILE * ) {
Serial.write( c );
return c;
}
//for nrf24 debug
void printf_begin(void) {
fdevopen( &serial_putc, 0 );
}
RF24 radio(Pin_RF_CE, Pin_RF_CSN);
//we only need a write pipe, but am planning to use it later
const uint64_t pipes[2] = { 0xF0F0F0F0E1LL, 0xF0F0F0F0D2LL };
// here we can send up to 30 chars
char SendPayload[31] = "";
char receivePayload[32];
unsigned long dht_timer = millis();[/b]
[b]// GPS Neo 6m : VCC to 5V, GND to GND, RX to 10, TX to 9
//SoftwareSerial mySerial(Pin_GPS_RX, Pin_GPS_TX);
SoftwareSerial mySerial(Pin_GPS_RX, Pin_GPS_TX);
TinyGPS gps;
void gpsdump(TinyGPS &gps);
void printFloat(double f, int digits = 2);
unsigned long currentMillis = 0;[/b]
// LDR : D*
// Relay -> Light outside front : D*
// Relay -> Alarm : D*
// Relay -> Raspberry Pi : D*
// DHT 22 : 10kOhm (+ & D), D*
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(Pin_DHT22, DHTTYPE); //// Initialize DHT sensor for normal 16mhz Arduino
void gpsdump(TinyGPS &gps) {
long lat, lon;
float flat, flon;
unsigned long age, date, time, chars;
int year;
byte month, day, hour, minute, second, hundredths;
unsigned short sentences, failed;
// On Arduino, GPS characters may be lost during lengthy Serial.print()
// On Teensy, Serial prints to USB, which has large output buffering and
// runs very fast, so it's not necessary to worry about missing 4800
// baud GPS characters.
gps.f_get_position(&flat, &flon, &age);
Serial.print("Lat/Long(float): "); printFloat(flat, 5); Serial.print(", "); printFloat(flon, 5);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
gps.get_datetime(&date, &time, &age);
Serial.print("Date(ddmmyy): "); Serial.print(date); Serial.print(" Time(hhmmsscc): ");
Serial.print(time);
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
gps.crack_datetime(&year, &month, &day, &hour, &minute, &second, &hundredths, &age);
Serial.print("Date: "); Serial.print(static_cast<int>(month)); Serial.print("/");
Serial.print(static_cast<int>(day)); Serial.print("/"); Serial.print(year);
Serial.print(" Time: "); Serial.print(static_cast<int>(hour+8)); Serial.print(":"); //Serial.print("UTC +08:00 Malaysia");
Serial.print(static_cast<int>(minute)); Serial.print(":"); Serial.print(static_cast<int>(second));
Serial.print("."); Serial.print(static_cast<int>(hundredths)); Serial.print(" UTC +08:00 Malaysia");
Serial.print(" Fix age: "); Serial.print(age); Serial.println("ms.");
Serial.print("Alt(cm): "); Serial.print(gps.altitude()); Serial.print(" Course(10^-2 deg): ");
Serial.print(gps.course()); Serial.print(" Speed(10^-2 knots): "); Serial.println(gps.speed());
Serial.print("Alt(float): "); printFloat(gps.f_altitude()); Serial.print(" Course(float): ");
printFloat(gps.f_course()); Serial.println();
Serial.print("Speed(knots): "); printFloat(gps.f_speed_knots()); Serial.print(" (mph): ");
printFloat(gps.f_speed_mph());
Serial.print(" (mps): "); printFloat(gps.f_speed_mps()); Serial.print(" (kmph): ");
printFloat(gps.f_speed_kmph()); Serial.println();
gps.stats(&chars, &sentences, &failed);
Serial.print("Stats: characters: "); Serial.print(chars); Serial.print(" sentences: ");
Serial.print(sentences); Serial.print(" failed checksum: "); Serial.println(failed);
}
//_____________________________________________________________________________________________________
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(1000);
Serial.println("uBlox Neo 6M");
Serial.print("Testing TinyGPS library v. "); Serial.println(TinyGPS::library_version());
Serial.println();
[b]// printf_begin();
// //nRF24 configurations
// radio.begin();
// radio.enableDynamicPayloads();
// radio.setChannel(20);
// radio.setAutoAck(true);
// radio.enableAckPayload();
// radio.setRetries(15, 15);
// radio.setDataRate(RF24_250KBPS);
// radio.setPALevel(RF24_PA_LOW);
// radio.setCRCLength(RF24_CRC_8);
// radio.setPayloadSize(32);
// radio.openWritingPipe(pipes[0]);
// radio.openReadingPipe(1, pipes[1]);
// radio.startListening();
// radio.printDetails(); //for Debugging[/b]
dht.begin();
pinMode(Pin_Buzzer, OUTPUT);
pinMode(Pin_LRD, INPUT);
pinMode(Pin_DHT22, INPUT);
}
void loop() {
bool timeout = 0;
unsigned long send_time, rtt = 0;
bool newdata = false;
unsigned long start = millis();
//SERIAL RECEIVER
while (Serial.available() > 0) {
String serial_receive = Serial.readString();
Serial.println("Received Serial: " + serial_receive);
if ( serial_receive == "get_sensor_data" ) {
Serial.println("DHT|" + String(dht.readTemperature()) + "|" + String(dht.readHumidity()) );
delay(50);
Serial.println("LDR|" + String(get_LDR_value()));
delay(50);
}
else if ( serial_receive == "get_gps_data" ) {
[b] unsigned long start = millis();
Serial.println("Get GPS Data...");
while (millis() - start < 10000) {
if (mySerial.available()) {
char c = mySerial.read();
//Serial.print(c); // uncomment to see raw GPS data
if (gps.encode(c)) {
gpsdump(gps);
break;
}
}
}[/b]
}
}
// currentMillis = millis();
//
// //wait response
// radio.startListening();
// delay(20);
// while ( radio.available() && !timeout) {
// uint8_t len = radio.getDynamicPayloadSize();
// Serial.print("Received Len ");
// Serial.println(len);
// if (len == 0) {
// break;
// }
// radio.read( receivePayload, len);
//
// Serial.print("Received ");
// Serial.println(receivePayload);
// //Send data back
// radio.stopListening();
// delay(50);
// radio.write( receivePayload, strlen(receivePayload));
//
// String arduino_id = getValue(receivePayload, '|', 0);
// Serial.println(arduino_id);
// delay(20);
// if (arduino_id == "12") {
// swtich_what = atoi (getValue(receivePayload, '|', 1).c_str ()); //light_status - 1 = on, 0 = off, -1 = no change
// Serial.println(swtich_what);
//
// //HEATING FAN
//// if (swtich_what == 3) {
//// relay_heating_fan_status = atoi (getValue(receivePayload, '|', 2).c_str ()); //fan_status - 1 = on, 0 = off, -1 = no change
//// Serial.println(relay_heating_fan_status);
//// if (relay_heating_fan_status == 1) {
//// digitalWrite(relay_heating_fan, HIGH);
//// }
//// else if (relay_heating_fan_status == 0) {
//// digitalWrite(relay_heating_fan, LOW);
//// }
//// }
// }
// memset(receivePayload, 0, sizeof(receivePayload));
// delay(10);
// } // End while
}
(PS: Code gekürzt, da der Post sonst zu lang gewesen wäre. Die fetten Stellen sind die relevanten.)