void loop, lampki schodowe
-
alankedzior
- Posts: 114
- Joined: Mon Jun 18, 2018 5:38 pm
Witam mam pytanie do bardziej zaawansowanych użytkowników, działa mi juz sterowanie przekażnikami, roletami, odczyty z czujników temperatury, lecz teraz chciałem jesszcze do mojego programu dołożyć obsługę lampek przy schodach, dwa czujniki jeden na dole jeden do góry i 9 lampek, które będą załączać się po wykryciu ruchu przez dany czujnik w nadanej sekwencji. Goły program działa mi bez zarzutu, lecz w połączeniu z suplą rozłącza mi cały czas serwer, podejrzewam że problem leży po stronie mojego programu, gdyż używam void loop. Jak to obejść chcę dołożyc do mojego arduino jeszcze m.in alarm i raczej potrzebuję void loop. Została mi jeszcze jedna kwestia dotycząca przycisku furtki, ale o tym problemie piszę w innym wątku. Pozdrawiam
-
shimano73
- Posts: 2174
- Joined: Sun Feb 28, 2016 12:27 pm
- Location: Orzesze
- Been thanked: 1 time
A pokazałbyś swój program ,podejrzewam ze ta twoja sekwencja potrzebuje zbyt dużo czasu na wykonanie , prawdopodobnie używasz „delay”
W elektronice jak nie wiadomo o co chodzi to zwykle chodzi o zasilanie
Wezmę udział w Supla Offline Party 2024
Wezmę udział w Supla Offline Party 2024
-
alankedzior
- Posts: 114
- Joined: Mon Jun 18, 2018 5:38 pm
Code: Select all
unsigned long czas;
int pin[9]={30,31,32,33,34,35,36,37,38};
int q = 0;
byte s = 0;
byte c = 0;
byte v = 0;
bool c_on = false;
bool c_off = false;
//LED delay
int tOn = 250; //czas wlaczania
int tOff = 100; //czas wylanczania
int offC = 200; //
void setup() {
Serial.begin(9600);
pinMode(26, INPUT); // czujnik dolny 0
pinMode(27, INPUT); // czujnik gorny 1
pinMode(30, OUTPUT); // lampka pierwsza dolna 1 2
pinMode(31, OUTPUT);
pinMode(32, OUTPUT);
pinMode(33, OUTPUT);
pinMode(34, OUTPUT);
pinMode(35, OUTPUT);
pinMode(36, OUTPUT);
pinMode(37, OUTPUT);
pinMode(38, OUTPUT); // lampka ostatnia górna 9 13
}
void loop() {
// z dołu
if (digitalRead(26) == LOW and s == 0)
{
c_on=true;
OnDown();
}
if (digitalRead(26) == HIGH and c_on == true)
{
s= 1;
c_on=false;
czas = millis()+30000;
}
if (digitalRead(26) == LOW and s == 1)
{
c=1;
}
if (digitalRead(26) == HIGH and c == 1)
{
OffDown();
}
if (digitalRead(26) == HIGH and s == 1)
{
if (millis() > czas )
{
OffCzas();
}
}
// z góry
if (digitalRead(27) == LOW and s == 0)
{
c_off=true;
OnUp();
}
if (digitalRead(27) == HIGH and c_off == true)
{
s= 1;
c_off=false;
czas = millis()+30000;
}
if (digitalRead(27) == LOW and s == 1)
{
v=1;
}
if (digitalRead(27) == HIGH and v == 1 )
{
OffUp();
}
if (digitalRead(27) == HIGH and s == 1)
{
if (millis() > czas )
{
OffCzas();
}
}
}
void OnUp(){
for( q = 0; q < 9; q++ ){
digitalWrite( pin[q], HIGH );delay(tOn);}
}
void OffUp(){
for( q = 9; q >= 0; q-- ){
digitalWrite( pin[q], LOW );delay(tOff);}
s = 0;
v = 0;
c = 0;
q = 0;
}
void OnDown(){
for( q = 9; q >= 0; q-- ){
digitalWrite( pin[q], HIGH );delay(tOn);}
}
void OffDown(){
for( q = 0; q < 9; q++ ){
digitalWrite( pin[q], LOW );delay(tOff);}
s = 0;
v = 0;
c = 0;
q = 0;
}
void OffCzas(){
digitalWrite(30, LOW );
digitalWrite(38, LOW );
delay(offC);
digitalWrite(31, LOW );
digitalWrite(37, LOW );
delay(offC);
digitalWrite(32, LOW );
digitalWrite(36, LOW );
delay(offC);
digitalWrite(33, LOW );
digitalWrite(35, LOW );
delay(offC);
digitalWrite(34, LOW );
delay(offC);
s = 0;
v = 0;
c = 0;
}
-
alankedzior
- Posts: 114
- Joined: Mon Jun 18, 2018 5:38 pm
to jest wycinek działania lampek schodowych, jak to ominąć ?
-
Espablo
- Posts: 1754
- Joined: Wed Jun 29, 2016 5:04 pm
- Location: Oświęcim
@shimano73 miał rację masz tam "w pierony" delay ów. Postaraj się to zrobić nie blokująco bez delay
Każde urządzenie elektryczne działa o wiele lepiej jeśli podłączysz je do prądu.

-
pzygmunt
- Posts: 20302
- Joined: Tue Jan 19, 2016 9:26 am
- Location: Paczków
- Been thanked: 59 times
Podziel sobie kod na sekcje obwarowane znacznikami czasowymi.
Przykład (pisany na kolanie więc nie wiem czy się skompiluje).
Przykład (pisany na kolanie więc nie wiem czy się skompiluje).
Code: Select all
#define SECTION_COUNT 3
unsigned long section_time[SECTION_COUNT];
void setup(){
for(int a=0;a<SECTION_COUNT;a++) {
section_time[a] = 0;
};
section_time[0] = millis()+1000;
}
void loop(){
unsigned long now = millis();
for(int a=0;a<SECTION_COUNT;a++) {
if ( section_time[a] != 0 && now >= section_time[a] ) {
section_time[a] = 0;
switch(a) {
case 0:
section_time[1] = now + 1000;
break;
case 1:
section_time[2] = now + 1000;
break;
case 2:
section_time[0] = now + 1000;
break;
};
};
};
}
SUPLA.... Nareszcie w domu.
