Hall zusammen, ich verwende eine Arduino Nano und habe versucht eine Alarmanlage für mein E-Bike zu bauen.
Leider mache ich anscheinend beim Auslesen der Karte was falsch, komme aber nicht drauf wo der Fehler liegt. Der Arduino wird Extern mit Strom versorgt.
Ich bitte euch um Hilfe
Danke für euere Hilfestellung
#include "SPI.h"
#include "Wire.h"
#include "MFRC522.h"
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);
const int MPU_addr=0x68;
const byte schalterbruecke=4;
const byte ledrot=6;
const byte ledgruen=5;
const byte ledblau=3;
const byte ledblitz=7;
const byte signalgeber=2;
const byte sirene=8;
const long maxalarmdauer=30000;
const float offsetmin=0.01;
const float offsetmax=1.99;
byte anhaenger_uid0=0;
byte anhaenger_uid1=0;
byte anhaenger_uid2=0;
byte anhaenger_uid3=0;
byte fehleingabe=0;
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
unsigned long letzteledblitzmillis=0;
unsigned long ledblitzintervall=300;
unsigned long letztesirenemillis=0;
unsigned long sireneintervall=1500;
float durchschnitt_acx=0;
float durchschnitt_acy=0;
float durchschnitt_acz=0;
float durchschnitt_tmp=0;
float durchschnitt_gyx=0;
float durchschnitt_gyy=0;
float durchschnitt_gyz=0;
float letzte_temperatur=0;
boolean erster_start=true;
boolean scharf=false;
boolean alarm_verlassen=false;
boolean alarmaktiv=false;
boolean ledblitzzustand=LOW;
boolean sirenezustand=LOW;
void setup()
{
Serial.begin(9600);
SPI.begin();
mfrc522.PCD_Init();
pinMode(schalterbruecke,OUTPUT);
pinMode(ledrot,OUTPUT);
pinMode(ledgruen,OUTPUT);
pinMode(ledblau,OUTPUT);
pinMode(ledblitz,OUTPUT);
pinMode(signalgeber,OUTPUT);
pinMode(sirene,OUTPUT);
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B);
Wire.write(0);
Wire.endTransmission(true);
}
void led_schalten(byte rotanteil, byte gruenanteil, byte blauanteil)
{
analogWrite(ledrot,rotanteil);
analogWrite(ledgruen,gruenanteil);
analogWrite(ledblau,blauanteil);
}
void ausgangsbewegungsdaten_setzen()
{
byte i=0;
durchschnitt_acx=0;
durchschnitt_acy=0;
durchschnitt_acz=0;
durchschnitt_tmp=0;
durchschnitt_gyx=0;
durchschnitt_gyy=0;
durchschnitt_gyz=0;
for (i=0; i<10; i++)
{
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);
AcX=Wire.read()<<8|Wire.read();
durchschnitt_acx=durchschnitt_acx+AcX;
AcY=Wire.read()<<8|Wire.read();
durchschnitt_acy=durchschnitt_acy+AcY;
AcZ=Wire.read()<<8|Wire.read();
durchschnitt_acz=durchschnitt_acz+AcZ;
Tmp=Wire.read()<<8|Wire.read();
durchschnitt_tmp=durchschnitt_tmp+(Tmp/340.00+36.53);
GyX=Wire.read()<<8|Wire.read();
durchschnitt_gyx=durchschnitt_gyx+GyX;
GyY=Wire.read()<<8|Wire.read();
durchschnitt_gyy=durchschnitt_gyy+GyY;
GyZ=Wire.read()<<8|Wire.read();
durchschnitt_gyz=durchschnitt_gyz+GyZ;
delay(333);
}
durchschnitt_acx=durchschnitt_acx/10;
durchschnitt_acy=durchschnitt_acy/10;
durchschnitt_acz=durchschnitt_acz/10;
durchschnitt_tmp=durchschnitt_tmp/10;
durchschnitt_gyx=durchschnitt_gyx/10;
durchschnitt_gyy=durchschnitt_gyy/10;
durchschnitt_gyz=durchschnitt_gyz/10;
letzte_temperatur=durchschnitt_tmp;
}
boolean alarm_notwendig()
{
boolean accelerationx_ungleich=false;
boolean accelerationy_ungleich=false;
boolean accelerationz_ungleich=false;
boolean gyrox_ungleich=false;
boolean gyroy_ungleich=false;
boolean gyroz_ungleich=false;
boolean temperature_ungleich=false;
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B);
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true);
AcX=Wire.read()<<8|Wire.read();
AcY=Wire.read()<<8|Wire.read();
AcZ=Wire.read()<<8|Wire.read();
Tmp=Wire.read()<<8|Wire.read();
GyX=Wire.read()<<8|Wire.read();
GyY=Wire.read()<<8|Wire.read();
GyZ=Wire.read()<<8|Wire.read();
if (GyX >= 0)
{
if ((GyX < (durchschnitt_gyx*offsetmin)) || (GyX > (durchschnitt_gyx*offsetmax)))
{
gyrox_ungleich=true;
}
else
{
gyrox_ungleich=false;
}
}
else
{
if ((GyX > (durchschnitt_gyx*offsetmin)) || (GyX < (durchschnitt_gyx*offsetmax)))
{
gyrox_ungleich=true;
}
else
{
gyrox_ungleich=false;
}
}
if (GyY >= 0)
{
if ((GyY < (durchschnitt_gyy*offsetmin)) || (GyY > (durchschnitt_gyy*offsetmax)))
{
gyroy_ungleich=true;
}
else
{
gyroy_ungleich=false;
}
}
else
{
if ((GyY > (durchschnitt_gyy*offsetmin)) || (GyY < (durchschnitt_gyy*offsetmax)))
{
gyroy_ungleich=true;
}
else
{
gyroy_ungleich=false;
}
}
if (GyZ >= 0)
{
if ((GyZ < (durchschnitt_gyz*offsetmin)) || (GyZ > (durchschnitt_gyz*offsetmax)))
{
gyroz_ungleich=true;
}
else
{
gyroz_ungleich=false;
}
}
else
{
if ((GyZ > (durchschnitt_gyz*offsetmin)) || (GyZ < (durchschnitt_gyz*offsetmax)))
{
gyroz_ungleich=true;
}
else
{
gyroz_ungleich=false;
}
}
if ((Tmp/340.00+36.53) < (letzte_temperatur-3))
{
letzte_temperatur=Tmp/340.00+36.53;
temperature_ungleich=true;
}
else
{
letzte_temperatur=Tmp/340.00+36.53;
temperature_ungleich=false;
}
if ((gyrox_ungleich) || (gyroy_ungleich) || (gyroz_ungleich))
{
return(true);
}
else
{
return(false);
}
}
void loop()
{
if (erster_start)
{
digitalWrite(schalterbruecke,HIGH);
led_schalten(0,0,255);
erster_start=false;
}
if (!mfrc522.PICC_IsNewCardPresent() )
{
if (scharf)
{
if (alarm_notwendig())
{
unsigned long alarmdauer=millis();
while (((millis()-alarmdauer) < maxalarmdauer) && (!alarm_verlassen))
{
if (mfrc522.PICC_IsNewCardPresent())
{
if (mfrc522.PICC_ReadCardSerial())
{
for (byte i=0; i=ledblitzintervall;)
{
letzteledblitzmillis=millis();
ledblitzzustand=!ledblitzzustand;
digitalWrite(ledblitz,ledblitzzustand);
}
if ((millis()-letztesirenemillis) > sireneintervall)
{
letztesirenemillis=millis();
sirenezustand=!sirenezustand;
digitalWrite(sirene,sirenezustand);
}
}
if (alarm_verlassen)
{
alarm_verlassen=false;
ledblitzzustand=false;
digitalWrite(ledblitz,ledblitzzustand);
sirenezustand=false;
digitalWrite(sirene,sirenezustand);
scharf=false;
digitalWrite(schalterbruecke,HIGH);
led_schalten(0,0,255);
digitalWrite(signalgeber,HIGH);
delay(300);
digitalWrite(signalgeber,LOW);
delay(100);
digitalWrite(signalgeber,HIGH);
delay(300);
digitalWrite(signalgeber,LOW);
ausgangsbewegungsdaten_setzen();
}
else
{
alarm_verlassen=false;
ledblitzzustand=false;
digitalWrite(ledblitz,ledblitzzustand);
sirenezustand=false;
digitalWrite(sirene,sirenezustand);
scharf=true;
digitalWrite(schalterbruecke,LOW);
led_schalten(0,255,0);
digitalWrite(signalgeber,HIGH);
delay(300);
digitalWrite(signalgeber,LOW);
delay(100);
digitalWrite(signalgeber,HIGH);
delay(300);
digitalWrite(signalgeber,LOW);
ausgangsbewegungsdaten_setzen();
led_schalten(0,0,0);
}
}
}
return;
}
if (!mfrc522.PICC_ReadCardSerial())
{
return;
}
for (byte i=0; i < mfrc522.uid.size; i++)
{
switch(i)
{
case 0: anhaenger_uid0=mfrc522.uid.uidByte[i]; break;
case 1: anhaenger_uid1=mfrc522.uid.uidByte[i]; break;
case 2: anhaenger_uid2=mfrc522.uid.uidByte[i]; break;
case 3: anhaenger_uid3=mfrc522.uid.uidByte[i]; break;
default: break;
}
}
if (fehleingabe<=5)
{
if (anhaenger_uid0==2423090)
{
fehleingabe=0;
digitalWrite(signalgeber,HIGH);
delay(300);
digitalWrite(signalgeber,LOW);
delay(100);
digitalWrite(signalgeber,HIGH);
delay(300);
digitalWrite(signalgeber,LOW);
if (!scharf)
{
scharf=true;
digitalWrite(schalterbruecke,LOW);
led_schalten(0,255,0);
ausgangsbewegungsdaten_setzen();
}
else
{
scharf=false;
digitalWrite(schalterbruecke,HIGH);
led_schalten(0,0,255);
delay(3000);
}
led_schalten(0,0,0);
}
else
{
fehleingabe++;
led_schalten(255,0,0);
digitalWrite(signalgeber,HIGH);
delay(1000);
digitalWrite(signalgeber,LOW);
delay(3000);
led_schalten(255,0,0);
}
}
else
{
fehleingabe=0;
led_schalten(255,0,0);
digitalWrite(signalgeber,HIGH);
delay(1000);
digitalWrite(signalgeber,LOW);
delay(1000);
digitalWrite(signalgeber,HIGH);
delay(1000);
digitalWrite(signalgeber,LOW);
delay(15000);
led_schalten(255,0,0);
}
}
}
}