Перестает работать через время помогите кто чем может.... Лучше мозгами)
- Войдите на сайт для отправки комментариев
Ср, 30/07/2014 - 19:49
Добрый день!
Я начинаюший и не могу разобраться в чем проблема.
Собрал скетч по частям из разных для своего супер кухонного поекта управление освещением с хлопками.
Включаю все работает... и с телефона и хлопки..
Как должно работать:
(с телефона все работет в любое время суток и с любым перерывом... это оставим в покое)
Хлопнул 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.
}
А чем ловите хлопки? Как это что-то подключаете к дуине? Схему можно увидеть?
Варианты - заканчивается память, может что-то переполняется, какое-нибудь условие не правильно начинает работает из-за сравнения знаковое-беззнаковое...причем все это может происходить и в какой-то из библиотек, из-за бага или неправильного использования.
Попробуйте локализовать проблему, временно отключая часть функциональности и библиотеки...
А как вообще лампочками управляете, по проводу, или какие блютузы с вайфаями используете? Как-то код дюже здоровый выходит для управления 4 состояниями люстры.
http://amperka.ru/collection/sensors/product/microphone
вот этот микрофон подключил 5В / земля / A0
Через блютуз с телефоном ..
Бог с ним здоровый) лиш бы работал))
Как сделать чтобы он перезагружался раз в час к примеру и сбрасывал на 0 забитое значение
Купить розетку с таймером, настроить таймер на отключение каждый час на 1 минуту. Вставить в эту розетку БП, питающий ардуино.
Спасибо, но вариант не подходит.
как программно все сбросить или перезагрузить через интервал времени?
Есть один способ, но он требует 100% инициализации всех задействованных портов (не уверен, что только их). Если этого не сделать, то вылезут всякие бока. А так как код не ваш и вы не можете спрогнозировать какие проблемы появятся, то лучше розетку с таймером, а то как начнёт люстра жить своей жизнью. :)
Но если вы всё равно хотите это сделать, ищите в гугле "программный сброс ардуино" и имейте ввиду, что за последствия в виде пожаров и наводнений в вашей квартире я ответственности не несу. Равно как и за выход ардуины из строя.