Arduino räkna slag med tilt ball switch

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Zephyrlius
Inlägg: 14
Blev medlem: 30 juni 2015, 10:08:08

Arduino räkna slag med tilt ball switch

Inlägg av Zephyrlius »

Behöver kunna räkna slag med en enkel fattigmansaccelerometer.

Den ska ju kunna stå i både high o low när den börjar och räkna upp 1 när man antingen går från low till high eller från high till low.

Programmeringskunskaperna sviktar känner jag, kanske finns ett enkelt sätt att göra detta på?

tips?
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Arduino räkna slag med tilt ball switch

Inlägg av BEEP »

Så här någonting kanske?

Kod: Markera allt

new_switch_state = current_switch_state;
if(new_switch_state != prev_switch_state){
  switch_count++;
  prev_switch_state = new_switch_state;
}
Jonas_H
Inlägg: 48
Blev medlem: 28 september 2011, 17:51:07

Re: Arduino räkna slag med tilt ball switch

Inlägg av Jonas_H »

Fast det där räknar på både upp och nedåtgående, men vi ville bara räkna en gång per slag. Så något i den här stilen kanske?

Kod: Markera allt

while(1) {
        state = get_switch_state();
        if (state == 1) && (old_state == 0) {
                count++;
        }
        old_state = state;
}
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Arduino räkna slag med tilt ball switch

Inlägg av BEEP »

Jag tror inte att din kod fungerar?

"men vi ville bara räkna en gång per slag"
Okej, jag får väl fortsätta med mina irrfäder :)

Kod: Markera allt

start_state = GetSwitchState();
while(1){
  new_state = GetSwitchState();
  if( (new_state != start_state) && (new_state != old_state) ){ 
    count++;
  }
  old_state = new_state;     
}
Jonas_H
Inlägg: 48
Blev medlem: 28 september 2011, 17:51:07

Re: Arduino räkna slag med tilt ball switch

Inlägg av Jonas_H »

Jag ville bara förmedla en idé, så jag har inte testkört det. Man behöver ju sätta upp variabler och så också, typ såhär:

Kod: Markera allt

uint8_t  state;
uint8_t  old_state = 1;
uint16_t count     = 0;

while(1) {
        state = get_switch_state();
        if ((state == 1) && (old_state == 0)) {
                count++;
        }
        old_state = state;
}
Men jag tycker att koden fungerar även när jag kollar på den igen (fortfarande inte testkört). Din kod är ju i princip samma, men du jämför new_state med variabeln start_state som aldrig ändras istället för konstanten 1 som jag gör. Båda uppfyller funktionen att inte räkna två gånger per cykel.
Jonas_H
Inlägg: 48
Blev medlem: 28 september 2011, 17:51:07

Re: Arduino räkna slag med tilt ball switch

Inlägg av Jonas_H »

Nu när jag tittar igen ser jag hur vi tänkt olika. Du har tänkt:
"(uteslut hälften av fallen) och (förändring)"

Jag har tänkt:
"räkna vid stigande flank"

En smaksak kanske, men jag klarar mig med en variabel färre. :)
Zephyrlius
Inlägg: 14
Blev medlem: 30 juni 2015, 10:08:08

Re: Arduino räkna slag med tilt ball switch

Inlägg av Zephyrlius »

Såhär ser min kod ut nu. jag använder en tryckknapp istället för tilt ball switch och försöker testa den med Arduino men även när knappen inte är inkopplad rullar detta skript igenom villkoret och sista lampan tänds.

Förtydligande av vad jag vill göra:
Denna mackapär ska räkna slag förs ska en led vara tänd sen efter x slag tänds nästa o den innan slocknar sen efter y slag tänd den sista leden och den andra slocknar.


const int strokecounter = 2; // the number of the pushbutton pin
const int ledgreen = 13; // the number of the green LED
const int ledblue = 12; // the number of the blue LED
const int ledred = 11; // the number of the red LED

int counter = 0; //counter
int counterstate = 0; //Buttonstate

uint8_t state;
uint8_t old_state = 1;
uint16_t count = 0;

void setup()
{
pinMode(ledgreen, OUTPUT); // initialize the green LED as an output
pinMode(ledblue, OUTPUT); // initialize the blue LED as an output
pinMode(ledred, OUTPUT); // initialize the red LED as an output
pinMode(strokecounter, INPUT); // initialize the pushbutton pin as an input

digitalWrite(ledred, HIGH); //Red on
}

void loop()
{
while(1) {
state = digitalRead(strokecounter);


if ((state == 1) && (old_state == 0))
{
count++;
}
old_state = state;

if (count == 10)
{
digitalWrite (ledred,LOW);
digitalWrite (ledblue,HIGH);
}

if (count == 20)
{
digitalWrite (ledblue, LOW);
digitalWrite (ledgreen, HIGH);
}

}
}
Jonas_H
Inlägg: 48
Blev medlem: 28 september 2011, 17:51:07

Re: Arduino räkna slag med tilt ball switch

Inlägg av Jonas_H »

Nu har jag aldrig använt Arduino, så jag vet inte om pinMode() ser till att pullup är aktivt för inputs. Du har heller inte beskrivit så mycket om din krets, men jag gissar att din ingång är helt flytande och att den räknar brus istället. Slå på den inbyggda pullupen eller sätt ett ~10k motstånd till VCC eller GND beroende på vad som är lämpligt.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Arduino räkna slag med tilt ball switch

Inlägg av BEEP »

Det behövs också ett filter för ta bort kontaktstuds.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Arduino räkna slag med tilt ball switch

Inlägg av BEEP »

Har lagt till en kodrad.

Kod: Markera allt

start_state = GetSwitchState();
old_state = start_state; //<----------
while(1){
  new_state = GetSwitchState();
  if( (new_state != start_state) && (new_state != old_state) ){
    count++;
  }
  old_state = new_state;     
}
Skriv svar