Sida 1 av 1

Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 20 maj 2015, 19:05:04
av xenonfire
Vill bygga en klocka som räknar sekunder med resetfunktion.
Har en neopixelring med 60 led och en Trinket.
Varje diod motsvarar 1 sekund.
När jag startar programmet skall tiden börja räkna, men när jag triggar en input så skall räknaren resetas och börja räkna om från noll.

Vet inte hur jag skall göra för att kunna göra en reset på klockan.
Jag misstänker att delay bör bytas ut mot något annat kommande för att inte störa resetknappen.



// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

#include <Adafruit_NeoPixel.h>
#include <avr/power.h>

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN 1

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 60

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 1000; // delay for half a second

void setup() {
// This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
// End of trinket special code

pixels.begin(); // This initializes the NeoPixel library.
}

void loop() {



// For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.


for(int i=0;i<NUMPIXELS;i++)

{

// pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
pixels.setPixelColor(i, pixels.Color(50,0,0)); // Moderately bright green color.

pixels.show(); // This sends the updated pixel color to the hardware.

delay(delayval); // Delay for a period of time (in milliseconds).



}
}

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 20 maj 2015, 22:31:05
av Premix
Du får sätta variabeln i till 0, dock så får du först deklarera den utanför din for loop, globalt antar jag

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 20 maj 2015, 22:42:35
av xenonfire
Jag skulle vilja använda "millis" så att klockan räknar hela tiden och när man gör en ingång hög så skall klockan resetas.

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 22 maj 2015, 11:39:34
av hanzibal
Är det inte onödigt att göra pixels.show() för varje led? Vore väl bättre att pytsa ut alla pixlar som skall sättas på en gång, dvs efter for-loopen eller har jag missat nåt?

...samt även förlägga fördröjningen utanför for-loopen då alltså.

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 22 maj 2015, 15:33:23
av Wedge
Det finns ju en resetingång på kortet.
Kan du leva med att bootloadern tar några ögonblick på sig att starta din applikation så är det väl bara att koppla in din signal där och brutal-resetta!

Fast funktionen är lite dåligt specad.
Vad ska hända när din resetinput aktiveras... startar tidräkningen om på flanken, eller hålls räknaren på noll så länge signalen är aktiv?
Vad ska hända efter 60 sekunder när alla LEDar är tända?

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 22 maj 2015, 20:47:58
av xenonfire
Att invänta att bootloadern skall starta upp funkar tyvärr inte.

Det skall bli en klocka med sekundvisare som grafiskt visar sekunder på en urtavla men man skall enkelt kunna nollställa sekundvisaren med hjälp av en tryckknapp.

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 22 maj 2015, 20:58:55
av Premix
Ok, din delay är 1000ms nu. Vilket gör att du nu kollar knappen max en gång i sekunden.
Testa att använda en interrupt på din pinne eller gör en loop där du kör en delay på 10ms 100 gånger och kollar pinnen varje loop.

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 22 maj 2015, 21:03:09
av xenonfire
Låter ju bättre att använda interrupt istället.
Man kanske även skulle kunna använda millis på något sätt.

Vet bara inte hur jag skall börja...*hmm

Re: Programmeringshjälp, Arduino + Neopixel, tidtagning

Postat: 24 maj 2015, 23:02:14
av slo
Du börjar med att läsa Arduino exemplen:
http://www.arduino.cc/en/Tutorial/BlinkWithoutDelay
och
http://www.arduino.cc/en/Reference/AttachInterrupt

ifall du vill kan du även köra Atmegans interna timers för att inte behöva polla millis()
http://playground.arduino.cc/Code/Timer1

och i korta drag skulle programmet vara

Kod: Markera allt

counter = 0
lastCounter = 0

setup:
   konfigurera alla interrupts
 
interruptButton:
   counter = 0

interruptTimer:
   counter = counter +1 
   if counter > 59:
      counter = 0 

loop:
  if lastCounter != counter:
     uppdatera alla leddar
     lastCounter = counter
  
  delay