HI,
danke für die schnellen Antworten. Ich hatte die Details erstmal ausgespart, für den Fall das mein Vorhaben technisch eh nicht realisierbar ist.
Die Funkmodule
Momentan laufen ein Uno als Schloss, die Sensoren als Nano und Uno. Die angehängten Bilder zeigen die Verkabelung.
Das Schloss empfängt die Daten/Befehle der Sensoren. Später soll er dann noch einen Motor ansteuern. Das ist hier aber noch nicht drin, weil erstmal die Beleuchtung stimmen muss.
Pro angemeldeten Sensor soll eine Diode aufleuchten. Wenn die Anmeldezeit um ist oder der Button gedrückt wird, startet das Main-Programm. Ein Sensor sendet ein "AN" Signal, wenn ein bestimmter Abstand gemessen wird. Daraufhin schaltet das Schloss die entsprechende Zahl Dioden an. Diese ist von der Anzahl der angemeldeten Sensoren abhängig. Es sind 16 Dioden, Anzahl der Dioden die leuchten = 16/angemeldete Sensoren.
Der Sensor (Ultraschall Abstandssensor), später sollen vier davon laufen können. Ich möchte es aber variabel halten, so dass man 1-4 verwenden kann, ohne am Code was zu ändern. Daher der Anmeldeprozess. Ich habe auch einen Code, der per Funk den Sensoren ihre AN und AUS Daten mitteilt, da aber das Versenden & Empfangen nicht klappt wie es soll, ist der erstmal obsolet.
Code Schloss
#include <Adafruit_NeoPixel.h>
#include <VirtualWire.h>
#include "SensorModul.h"
#define PIN 6
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800);
unsigned long vorherigeMillis = 0;
long dauer = 2*60*1000; //erste Zahl sind die "Minuten" bis Anmeldezeit der Sensoren vorbei ist
bool open = false;
bool sensorenAngemeldet = false;
int anzahlSensoren = 0;
int tasterPin = 11;
SensorModul sensorModule[4];
const int transmit_pin = 5;
const int receive_pin = 12;
const int transmit_en_pin = 3;
void setup() {
strip.begin();
strip.show(); // Initialize all pixels to 'off'
pinMode(tasterPin,INPUT);
vw_set_tx_pin(transmit_pin);
vw_set_rx_pin(receive_pin);
vw_set_ptt_pin(transmit_en_pin);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(4000); // Bits per sec
vw_rx_start();
}
void loop() {
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if(!sensorenAngemeldet){
unsigned long aktuelleMillis = millis();
if(dauer > aktuelleMillis) {
sensorenRegistrieren();
wechselSignaleSenden();
}else{
sensorenAngemeldet = true;
ringIlluminieren();
}
if (digitalRead(tasterPin)==HIGH){
sensorenAngemeldet = true;
ringIlluminieren();
}
}else{
if (!open) {
vw_wait_rx();
if(vw_get_message(buf, &buflen)){
int value = (int) buf[0];
if(value%2 == 1){
sensorAn(value);
}
else{
sensorAus(value);
}
}
vw_send((uint8_t*)1,1);
vw_wait_tx();
}
ringIlluminieren();
}
}
void sensorAn(int anSignal){
for(int i=0;i<anzahlSensoren;i++){
if(anSignal == sensorModule[i].getAnSignal()){
sensorModule[i].setAngeschaltet(true);
break;
}
}
}
void sensorAus(int ausSignal){
for(int i=0;i<anzahlSensoren;i++){
if(ausSignal == sensorModule[i].getAusSignal()){
sensorModule[i].setAngeschaltet(false);
break;
}
}
}
void ringIlluminieren(){
for(int pos = 0; pos < anzahlSensoren; pos++){
int start = pos*(16/anzahlSensoren);
int ende = (start)+(16/anzahlSensoren);
for(int i = start; i<ende;i++){
if(sensorModule[pos].isAngeschaltet())
strip.setPixelColor(i, 0, 255, 255);
else
strip.setPixelColor(i, 0, 0, 0);
}
strip.setBrightness(20);
strip.show();
}
}
void sensorenRegistrieren(){
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) {
int value = (int) buf[0];
if(!isAngemeldet(value)){
switch(value){
case 10:
setSensorModule(11, 12, 13);
break;
case 20:
setSensorModule(21, 22, 23);
break;
case 30:
setSensorModule(31, 32, 33);
break;
case 40:
setSensorModule(41, 42, 43);
break;
}
}
}
}
void setSensorModule(int anSignal, int ausSignal, int wechselSignal){
SensorModul sensor(anSignal, ausSignal, wechselSignal);
anzahlSensoren++;
sensorModule[anzahlSensoren-1] = sensor;
for(int i = 0; i<anzahlSensoren; i++){ //eine Bestätigungslampe pro angemeldeten Sensor
strip.setPixelColor(i, 255, 0, 0);
strip.setBrightness(20);
strip.show();
}
}
bool isAngemeldet(int anSignal){
for(int i =0; i<anzahlSensoren; i++){
if(sensorModule[i].getAnSignal() == anSignal)
return true;
else
return false;
}
}
void wechselSignaleSenden(){
for(int i=0; i<anzahlSensoren; i++){
uint8_t wechselSignal = sensorModule[i].getWechselSignal();
vw_send(&wechselSignal,1);
vw_wait_tx();
}
}
Code vom Sensor
Adafruit_NeoPixel strip = Adafruit_NeoPixel(1, PIN, NEO_GRB + NEO_KHZ800);
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
int DistanceIn;
int DistanceCm;
//Funkmodul initialisieren
const int transmit_pin = 5;
const int receive_pin = 7;
const int transmit_en_pin = 3;
bool angemeldet = false;
bool anmeldungGesendet = false;
uint8_t anmeldeCode = 20;
uint8_t wechselCode = 23;
uint8_t anSignal = 21;
uint8_t ausSignal = 22;
bool statusAenderung = false;
bool aktiviert = false;
void setup() // Setup um den Arduino zu konfigurieren
{
vw_set_tx_pin(transmit_pin);
vw_set_rx_pin(receive_pin);
vw_set_ptt_pin(transmit_en_pin);
vw_set_ptt_inverted(true); // Required for DR3100
vw_setup(4000); // Bits per sec
vw_rx_start();
strip.begin();
strip.show(); // Initialize all pixels to 'off'
}
void loop() // Loop für die Messung der Werte, läuft endlos
{
if(!angemeldet){
pixelSteuerung(1);
if(!anmeldungGesendet){
vw_send(&anmeldeCode,1);
vw_wait_tx();
anmeldungGesendet = true;
}else{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if(vw_get_message(buf, &buflen)){
int value = (int) buf[0];
if(value==wechselCode){
angemeldet = true;
pixelSteuerung(0);
}
}
}
}else{
delay(100);
if(DistanceCm < 60 && !aktiviert){
aktiviert = true;
statusAenderung = true;
}
else if(DistanceCm > 60 && aktiviert){
aktiviert = false;
statusAenderung = true;
}
}
senden();
}
void senden(){
if(statusAenderung){
if(aktiviert){
pixelSteuerung(2);
vw_send(&anSignal,1);
vw_wait_tx();
}else{
pixelSteuerung(0);
vw_send(&ausSignal,1);
vw_wait_tx();
}
statusAenderung = false;
vw_wait_rx();
}
}
void pixelSteuerung(int farbe){
switch(farbe){
case 0:
strip.setPixelColor(0, 0, 0, 0); //aus
break;
case 1:
strip.setPixelColor(0, 255, 0, 0); //rot
break;
case 2:
strip.setPixelColor(0, 0, 255, 0); //grün
break;
}
strip.setBrightness(20);
strip.show();
}
Der Vollständigkeit halber noch die Header-Datei zu den SensorModul-Objekten
class SensorModul{
public:
SensorModul(int anSignal, int ausSignal, int wechselSignal);
SensorModul();
int getAnSignal();
int getAusSignal();
int getWechselSignal();
bool isAngeschaltet();
void setAngeschaltet(bool angeschaltet);
private:
int anSignal;
int ausSignal;
int wechselSignal;
bool angeschaltet;
};
Die Codes sind noch nicht optimiert. Hier und da kann man noch Methoden ergänzen um doppelten Code zu vermeiden. Entschuldigt bitte den Flickenteppich.
Nochmal danke für eure Zeit 