• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Nie działający kod
#1
Witam,
Zrobiłem kod który obsługuje "capacitive touch switch" który zapala i gasi diody po wcisnięciu w jedną z dwóch blaszek. Wszystko ładnie działa ale chce dodać sobie różne tryby świecenia ( jak przyjdą mi diody RGB to będe się z tym bawił) postanowiłem sobie że po wcisnięciu dwóch blaszek i odczekaniu 5s diody mają się zacząć migać i aby kod przeszedł w tryb "menu, wybierania podświetleń" krótko mówiąc, nie działa. Nie wiem co jest nie tak. Prosze o pomoc dzięki Smile.
Kod:
#include <CapacitiveSensor.h>

CapacitiveSensor   cs_4_2 = CapacitiveSensor(4,2);        // 10M resistor between pins 4 & 2, pin 2 is sensor pin, add a wire and or foil if desired
CapacitiveSensor   cs_4_6 = CapacitiveSensor(4,6);        // 10M resistor between pins 4 & 6, pin 6 is sensor pin, add a wire and or foil
long timer = 0;
long activation = 5000;

boolean buttonsActive = false;
boolean longPressActive = false;

void setup()                    
{
  cs_4_2.set_CS_AutocaL_Millis(0xFFFFFFFF);  
  Serial.begin(9600);
  pinMode(13,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(11,OUTPUT);
}

void loop()                    
{
   long start = millis();
   long total1 =  cs_4_2.capacitiveSensor(30);
   long total2 =  cs_4_6.capacitiveSensor(30);

   Serial.print(millis() - start);        
   Serial.print("\t");                    

   Serial.print(total1);                  
   Serial.print("\t");
   Serial.print(total2);                  


   delay(10);                            

  if(total1 >= 30)
  {
   digitalWrite(13,HIGH);
  }
  else{
   digitalWrite(13,LOW);
  }  

   if(total2 >= 50)
  {
   digitalWrite(12,HIGH);
  }
  else{
   digitalWrite(12,LOW);
  }  


 if(total1 >= 30)
 if(total2 >= 50){
   if(buttonsActive == false){
      buttonsActive == true;
      timer = millis();
   }
   if ((millis() - timer > activation) && (longPressActive == false)){

       longPressActive = true;
       digitalWrite(13,HIGH);
       delay(10);
       digitalWrite(13,LOW);
       delay(10);
       
  }
   }else{
     if (buttonsActive == true) {

     if (longPressActive == true) {

       longPressActive = false;

     } else {

       digitalWrite(12,HIGH);
       delay(10);
       digitalWrite(12,LOW);
       delay(10);

     }

     buttonsActive = false;
     }
   }
   
}
 
Odpowiedź
#2
Tak na szybko.
Po pierwsze pętla
Kod:
if(total1 >= 30)
musi być zamknięta w klamry aż do linii 86.
W linii 69 masz taki warunek:
Kod:
if (buttonsActive == true) {

Ta pętla wykonuje się dopóki linia 59 nie zostanie spełniona:
Kod:
if ((millis() - timer > activation) && (longPressActive == false)){

W linii 84 nadajesz wartość
Kod:
buttonsActive = false;
, a jest to w pętli z linii 69.

To znaczy, że jeśli
Kod:
buttonsActive == true;
, to niech będzie
Kod:
buttonsActive == false;

I wtedy będąc nadal w pętli
Kod:
if(total1 >= 30){ if(total2 >= 50){
napotykasz na coś takiego:
Kod:
if(buttonsActive == false){
      buttonsActive == true;
      timer = millis();
   }

No i resetuje Ci się timer, więc nigdy warunek:
Kod:
millis() - timer > activation
nie zostanie spełniony.

A poza tym uważam, że ten kod jest do wyrzucenia, ponieważ łamie wszelkie zasady, nawet te gramatyczne z podstawówki.
Rządy księcia Chaosu. Nikt nawet pewnie nie chciał spojrzeć, bo ciężko się to czyta.
No i pisz komentarze, trudno odgadnąć co autor miał na myśli, a sądząc po tym co napisałeś, to pewnie Ty też nie wiesz co miałeś na myśli.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości