Перестает работать через время помогите кто чем может.... Лучше мозгами)

vans
Offline
Зарегистрирован: 30.07.2014

Добрый день!

Я начинаюший и не могу разобраться в чем проблема.

Собрал скетч по частям из разных для своего супер кухонного поекта управление освещением с хлопками.

Включаю все работает... и с телефона и хлопки.. 

Как должно работать:

(с телефона все работет в любое время суток и с любым перерывом... это оставим в покое)

Хлопнул 3 раза загорелся диодик , хлопнул еще 2 свет включился или выключился взависимости от того был ли включен......

Проблема:

Но через 3-10 часов а может и пару дней на хлопки не реагирует , а с телефона все работает..

Помогите плиз в чем причина не могу понять ....

вот скетч

 

 
 
 
 
 
  #include <RemoteSwitch.h>
  #include <SPI.h>
  #include <boards.h>
  #include <ble_shield.h>
  #include <services.h>
  #include <Servo.h> 
  
       #define RF777T77 (9018, 9000, 8994, 8992)
  
       #define RF777T1 9018
       #define RF777T2 9000
       #define RF777T3 8994
       #define RF777T4 8992
       #define RF777ON 8995
       #define RF777OFF 9019
       
       
       #define RF777TT 1091899999
       
       
       
       
       #define PERIOD 264;
       
       
       #define PERIOD 264; //(294) period duration: - полученные из (монитор порта)
       #define PERIOD 265;
       #define PERIOD 266;
 
 
#define  INTERVAL  1000UL
 
#define SERVO_PIN          7
 
 
Servo myservo;
 
 
 
 
 static unsigned long previousMillis = 0; 
 
unsigned long eventTime=0;
 
int a=0;
int b=0;
int c=0;
int ledPin5 = 5;
int ledPin4 = 4;
int DIGITAL_OUT2_PIN = 1;
 
int sensorPin = A0;    // select the input pin for the KY036
int ledPin = 13;      // select the pin for the LED (also flashes on Arduino Uno)
int sensorValue = 0;  // variable to store the value coming from the sensor
int intMax = 0;        // Used to store both the baseline from A0 and the level of A0 when it tripped
int intClapCount = 0;  // The number of claps that have been detected in the timeframe
int intSensitivity = 3;  // The increase in value above the baseline from A0 required to register a clap
int intDropOffSense = 3;  // The decrease in A0 value from the new baseline required to register a clap has ended
int intClapDuration = 150;  // The number of program cycles allowed for the echo of the clap to drop off
int intIntervalDuration = 700;  // The number of program cycles allowed for the next clap to start (note: Program cycles is a very dirty way of timing an event and should be avoided)
int intIntervalCount = 0;   // The number of milliseconds to wait before detecting the level of sound after a clap
 
int counter = 0;
 
void setup() {
  
  ble_begin();
  
    Serial.begin(9600);  // I think this sets up the serial monitor 
                         // note; my original value of 115200 failed, but 9600 worked.
  pinMode(ledPin, OUTPUT);  // declare the ledPin as an OUTPUT:
  intMax = analogRead(sensorPin) ; // read the analog pin and use the value for the level of background noise
 
 pinMode(ledPin4, OUTPUT);     
 pinMode(ledPin5, OUTPUT);
 
 
pinMode(DIGITAL_OUT2_PIN, OUTPUT);
myservo.attach(SERVO_PIN);
}
 
 
 
void loop() {
  // Check if sufficient program cycles have sed to conclude counting a set of claps
  
/*  
    static unsigned long previousMillis = 0; 
   
   if(millis() - previousMillis > INTERVAL) {
    previousMillis = millis(); 
     digitalWrite(ledPin4,!digitalRead(ledPin4));
    
  }
  
  */
  
   static boolean analog_enabled = false;
  
  
   while(ble_available())
  {
    // read out command and data
    byte data0 = ble_read();
    byte data1 = ble_read();
    byte data2 = ble_read();
     
   
   if (data0 == 0x99)  // Command is to control digital out pin
    {
      if (data1 == 0x99)
        transmit(RF777T1);
      else
        transmit(RF777T1);
    } 
    
    if (data0 == 0x98)  // Command is to control digital out pin
    {
      if (data1 == 0x98)
        transmit(RF777T2);
      else
        transmit(RF777T2);
    }
    if (data0 == 0x97)  // Command is to control digital out pin
    
    {
      if (data1 == 0x97)
        transmit(RF777T3);
      else
        transmit(RF777T3);
    }
    
    if (data0 == 0x96)  // Command is to control digital out pin
    
    {
      if (data1 == 0x96)
        transmit(RF777T4);
      else
        transmit(RF777T4);
    }
  if (data0 == 0x95)  // Command is to control digital out pin
    
    {
      if (data1 == 0x95)
        transmit(RF777OFF),a=0;
      else
        transmit(RF777OFF),a=0;
    }
      if (data0 == 0x94)  // Command is to control digital out pin
    
    {
      if (data1 == 0x94)
        transmit(RF777ON),a=1;
      else
        transmit(RF777ON),a=1;
    }
 
    
    else if (data0 == 0xA0) // Command is to enable analog in reading
    {
      if (data1 == 0x01)
        analog_enabled = true;
      else
        analog_enabled = false;
    }
    
    else if (data0 == 0xA0) // Command is to enable analog in reading
    {
      if (data1 == 0x99)
        analog_enabled = true;
      else
        analog_enabled = false;
    }
    
    else if (data0 == 0xA0) // Command is to enable analog in reading
    {
      if (data1 == 0x98)
        analog_enabled = true;
      else
        analog_enabled = false;
    }
    else if (data0 == 0xA0) // Command is to enable analog in reading
    {
      if (data1 == 0x97)
        analog_enabled = true;
      else
        analog_enabled = false;
    }
    else if (data0 == 0xA0) // Command is to enable analog in reading
    {
      if (data1 == 0x96)
        analog_enabled = true;
      else
        analog_enabled = false;
    }
  
    else if (data0 == 0x03)  // Command is to control Servo pin
    {
      myservo.write(data1);
    }
    else if (data0 == 0x04)
    {
      analog_enabled = false;
 
    }
  }
  
   if (analog_enabled)  // if analog reading enabled
  {
    // Read and send out
 
    ble_write(0x0B);
 
 
  }
  
   ble_do_events();
  
  intIntervalCount +=1; // A program cycle has been counted
  if (intIntervalCount > intIntervalDuration)  // TRUE if enough cycles have been counted
    {
      if(intClapCount > 0)  // TRUE if any claps have been counted
      {
        PrintOutput(); // Sends the program control to the bit that outputs to the Serial Monitor
      }
      
      intClapCount = 0;  // Resets the number of claps to zero
      intIntervalCount = 0; // Starts counting program cycles from the beginning
                            // note, this value is also reset to zero after each clap is counted
      
//      Serial.println("New Interval");
    }
  sensorValue = analogRead(sensorPin);  // reads the value coming from A0 analog input
  if (sensorValue > (intMax + intSensitivity)) // Sharp increase in sound above the baseline
  {
    intMax = sensorValue;  // sets the new baseline to be the volume of the clap when it was detected
                           // note, this is not the maximum volume that the clap produced.
    delay(intClapDuration);    // Wait for echoes to fade
    sensorValue = analogRead(sensorPin);  // read A0 again after the clap sound has died off
                                          // note, otherwise you may be detecting talking or some other noise
    if(sensorValue < (intMax - intDropOffSense))   // Sharp decrease in sound down from the volume the clap was detected at 
    {
      NewClap(); // go and do everything that happens when a clap has been detected
    }
    intMax = analogRead(sensorPin) ;  // Set the baseline to be the current background level. 
                                      // This base line may be too high if there is still clap echoes being detected
                                      // A longer delay here may be appropriate.
  }
  
 
 // This just makes the Pin 13 indicator flash or go off when other things are going on.  
  digitalWrite(ledPin, HIGH);   // turn the ledPin on
  delay(1);          
  digitalWrite(ledPin, LOW);   // turn the ledPin off:   
  delay(0);                  
}
 
 
 
 void transmit(unsigned long rcode){
 
unsigned long code = rcode;
 
unsigned long period = PERIOD;
 
code |= (unsigned long)period << 23;
 
code |= 2L << 20; //(|= 4L) цифра перед (L), это (условное число), количества повторов посылаемого сигнала. (соответственно и паузы)
 
RemoteSwitch::sendTelegram(code, 2); // RF transmitter pin - пин радио передатчика
 
}
 
 
 
void PrintOutput()
 
 
 
 
  {   Serial.print(" Claps: "); // Prints the text in inverted commas to the Serial Monitor
      Serial.println(intClapCount);  // Prints the number of claps to the Serial Monitor and starts a new line
    
                                 // note, you can do this in one command if you concatenate the two phrases
 
 
 
 
 
 
 
 
    
  { if (digitalRead(ledPin4) == HIGH  && (intClapCount > 2 || intClapCount< 2)) 
 
  digitalWrite(ledPin4, LOW),digitalWrite(ledPin5, LOW),delay(2000);}
  
   
  
 if (digitalRead(ledPin5) == LOW  && (intClapCount==3)) eventTime=millis(),digitalWrite(ledPin4, HIGH);
 
       if(millis()-eventTime>3000)  digitalWrite(ledPin4, LOW);
  
 
 
 
 if (digitalRead(ledPin4) == HIGH  && (intClapCount==2)) eventTime=millis(),digitalWrite(ledPin5, HIGH);
 
        if(millis()-eventTime>5000)  digitalWrite(ledPin5, LOW);
 
 
   { if (digitalRead(ledPin5) == LOW  && (intClapCount > 3 || intClapCount< 3)) digitalWrite(ledPin4, LOW),delay(500);}
 
 
 
 if (digitalRead(ledPin5) ==  HIGH) /* && (intClapCount==2))*/ a=a+1;
 //if (e==1){digitalWrite(ledPin8, HIGH);} else {digitalWrite(ledPin8, LOW); e=0;}
 if (a==1 && digitalRead(ledPin5) ==  HIGH) transmit(RF777ON); //else {digitalWrite(ledPin4, LOW); a=0;}
 if (a==2 && digitalRead(ledPin5) ==  HIGH) transmit(RF777OFF);
 if (a>=2) a=0;
 
 /*
 
 
 
if(digitalRead(ledPin5) == HIGH  && (intClapCount==2)){counter++;}  // Command is to control digital out pin
    {
      if (counter==1)
        transmit(RF777ON);
        
        
else 
      // (a==1 ,intClapCount==3, counter==0)
        transmit(RF777OFF);
      //  transmit(RF777OFF);
      //  return ;
    
 
if (counter > 1) {counter=0;}
    }
 
 */
 if(digitalRead(ledPin5) == HIGH)   digitalWrite(ledPin4, LOW), digitalWrite(ledPin5, LOW) ;
  // if (counter==1) transmit(RF777ON); digitalWrite(ledPin5, LOW);
  }  
   
   
  
  ;  
   
   
void NewClap()
 
{
    intClapCount += 1;  // Adds another clap to the count of claps
    intIntervalCount = 0;  // Sets the cycle counter back to zero so that the program waits until the end of a set of claps before printing.
}
 
Leshiy
Offline
Зарегистрирован: 19.07.2014

А чем ловите хлопки? Как это что-то подключаете к дуине? Схему можно увидеть?

toly
Offline
Зарегистрирован: 17.05.2014

Варианты - заканчивается память, может что-то переполняется, какое-нибудь условие не правильно начинает работает из-за сравнения знаковое-беззнаковое...причем все это может происходить и в какой-то из библиотек, из-за бага или неправильного использования.

Попробуйте локализовать проблему, временно отключая часть функциональности и библиотеки...

Leshiy
Offline
Зарегистрирован: 19.07.2014

А как вообще лампочками управляете, по проводу, или какие блютузы с вайфаями используете? Как-то код дюже здоровый выходит для управления 4 состояниями люстры.

vans
Offline
Зарегистрирован: 30.07.2014

http://amperka.ru/collection/sensors/product/microphone

вот этот микрофон подключил 5В / земля / A0

Через блютуз с телефоном ..

Бог с ним здоровый) лиш бы работал))

Как сделать чтобы он перезагружался раз в час к примеру и сбрасывал на 0 забитое значение

Leshiy
Offline
Зарегистрирован: 19.07.2014

Купить розетку с таймером, настроить таймер на отключение каждый час на 1 минуту. Вставить в эту розетку БП, питающий ардуино.

vans
Offline
Зарегистрирован: 30.07.2014

Спасибо, но вариант не подходит. 

как программно все сбросить или перезагрузить через интервал времени?

Leshiy
Offline
Зарегистрирован: 19.07.2014

Есть один способ, но он требует 100% инициализации всех задействованных портов (не уверен, что только их). Если этого не сделать, то вылезут всякие бока. А так как код не ваш и вы не можете спрогнозировать какие проблемы появятся, то лучше розетку с таймером, а то как начнёт люстра жить своей жизнью. :)

Но если вы всё равно хотите это сделать, ищите в гугле "программный сброс ардуино" и имейте ввиду, что за последствия в виде пожаров и наводнений в вашей квартире я ответственности не несу. Равно как и за выход ардуины из строя.