Lite Arduinobekymmer...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
ochkl0620
Inlägg: 4852
Blev medlem: 9 maj 2010, 23:34:56
Skype: challe.claesson
Ort: Näsåker Västernorrland
Kontakt:

Lite Arduinobekymmer...

Inlägg av ochkl0620 »

Jag skulle behöva lite hjälp med en kod som tänder och släcker en lysdiod mha en återfjädrande knapp och arduino.
Koden finns klar från nätet men problemet är att jag vill ha 3 ingångar och 3 utgångar istället för 1. Finns det någon som kan tänkas hjälpa mig med det? :)

Kod: Markera allt

/* switch
 *
 * Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
 * press), the output pin is toggled from LOW to HIGH or HIGH to LOW.  There's
 * a minimum delay between toggles to debounce the circuit (i.e. to ignore
 * noise).  
 *
 * David A. Mellis
 * 21 November 2006
 */
 
int inPin = 2;         // the number of the input pin
int outPin = 13;       // the number of the output pin
 
int state = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin
 
// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers
 
void setup()
{
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
}
 
void loop()
{
  reading = digitalRead(inPin);
 
  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;
 
    time = millis();    
  }
 
  digitalWrite(outPin, state);
 
  previous = reading;
}
LarryXz
Inlägg: 670
Blev medlem: 13 mars 2013, 20:31:08
Ort: Norra Uppland

Re: Lite Arduinobekymmer...

Inlägg av LarryXz »

Vill du ha 3 ingångar som styr 3 utgångar oberoende av varandra?
Användarvisningsbild
ochkl0620
Inlägg: 4852
Blev medlem: 9 maj 2010, 23:34:56
Skype: challe.claesson
Ort: Näsåker Västernorrland
Kontakt:

Re: Lite Arduinobekymmer...

Inlägg av ochkl0620 »

Precis! Lite luddigt formulerat, Klockan var mycket. :-P
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Lite Arduinobekymmer...

Inlägg av jesse »

Det finns säkert betydligt smidigare sätt att göra det på om man ska läsa fler än en pinne åt gången, men om man bara vill konvertera den kod som du har så är det kanske enklast att indexera alla variabler och loopa igenom dem så att man gör samma sak för var och en. Om nu millis() är en funktion somhämtar nån slags "systemtid" i Arduino skulle man kunna göra så här:

Kod: Markera allt

/* switch
 *
 * Each time the input pin goes from LOW to HIGH (e.g. because of a push-button
 * press), the output pin is toggled from LOW to HIGH or HIGH to LOW.  There's
 * a minimum delay between toggles to debounce the circuit (i.e. to ignore
 * noise).  
 *
 * David A. Mellis
 * 21 November 2006
 *
 * Modified by ___ to handle more than one pin (2014)
 *
 */
#define PINS 3         // 

int inPin[PINS];        // the number of the input pin
int outPin[PINS];      // the number of the output pin
 
int state[PINS];       // the current state of the output pin
int reading[PINS];    // the current reading from the input pin
int previous[PINS];   // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time[PINS];        // the last time the output pin was toggled

int inPin[0] = 2;         // the number of the input pin
int inPin[1] = 2;         // the number of the input pin
int inPin[2] = 2;         // the number of the input pin

int outPin[0] = 13;       // the number of the output pin
int outPin[1] = 13;       // the number of the output pin
int outPin[2] = 13;       // the number of the output pin
 
int state[0] = HIGH;      // the current state of the output pin
int state[1] = HIGH;      // the current state of the output pin
int state[2] = HIGH;      // the current state of the output pin

int previous[0] = LOW;    // the previous reading from the input pin
int previous[1] = LOW;    // the previous reading from the input pin
int previous[2] = LOW;    // the previous reading from the input pin

long debounce = 200;   // the debounce time, increase if the output flickers
 
void setup()
{
for (int i = 0; i < PINS; i++)
   {
      pinMode(inPin[i], INPUT);
      pinMode(outPin[i], OUTPUT);
   }
}
 
void loop()
{
   for (int i = 0; i < PINS; i++)
      {
     reading = digitalRead(inPin);
 
     // if the input just went from LOW and HIGH and we've waited long enough
     // to ignore any noise on the circuit, toggle the output pin and remember
     // the time
     if (reading[i] == HIGH && previous[i] == LOW && millis() - time[i] > debounce) {
       if (state[i] == HIGH)
         state[i] = LOW;
       else
         state[i] = HIGH;
    
       time[i] = millis();    
     }
 
     digitalWrite(outPin[i], state[i]);
 
     previous[i] = reading[i];
   }
}
Koden är oerhört klumpig som den är om man gör så här rakt av, men teoretiskt kan det ju vara intressant att studera om du vill lära dig att jobba med arrayer.

För att förstå att ett gäng variabler hör ihop med ett objekt kan man samla dem i en struct. Sedan gör man en array av structen. Det blir mer överskådligt. Till exempel:
typedef struct
{
int inPin; // the number of the input pin
int outPin; // the number of the output pin

int state; // the current state of the output pin
int reading; // the current reading from the input pin
int previous; // the previous reading from the input pin
long time; // the last time the output pin was toggled
} pinStruct;

pinStruct pin[PINS];

pin.inPin[0] = 2;
pin.inPin[1] = 3;
... osv ...
Mer om Array och Struct kan du hitta här: wiki - C_syntax
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Lite Arduinobekymmer...

Inlägg av jesse »

Koden finns klar från nätet...
Du tjänar enormt mycket i kunskap om du försöker lära dig att programmera så här pass enkla saker själv! Läs på lite om C-programmering i allmänhet och om Arduino-kod i synnerhet. Då får du en mycket stabilare grund att stå på när du ska göra något nästa gång. Det blir inte lika mycket "magi" kring koden.
LarryXz
Inlägg: 670
Blev medlem: 13 mars 2013, 20:31:08
Ort: Norra Uppland

Re: Lite Arduinobekymmer...

Inlägg av LarryXz »

Det absolut bästa för dig är nog om du utgår från din kod och provar dig fram. Hur tror du att du ska göra för att lägga till en in och utgång till? Prova dig fram genom att ändra i koden och se vad som händer.

Kod: Markera allt

//Number of pins
int pins = 3;

//Array holding the input pins
int inPins[pins] = {2, 3, 4};
//Array holding the output pins
int outPins[pins] = {13, 12, 11};

//2D Array holding every input pins current and previous state
int states[pins][2] = 
{
	{0, 0},//Pin1
	{0, 0},//Pin2
	{0, 0} //Pin3
};

//The current reading from the input pin
int reading;

//When was the button last pressed?
long time[pins] = {0, 0, 0};
//To avoid flicker
long debounce = 200;
 
void setup()
{
	//Set the inputs and outputs
	for(int i = 0; i < pins; i++)
	{
		pinMode(inPins[i], INPUT);
		pinMode(outPins[i], OUTPUT);
	}
}
 
void loop()
{
	for(int i = 0; i < pins; i++)
	{
		//Read the current state of the input
		reading = digitalRead(inPins[i]);
		
		//IF current reading is HIGH AND previous is LOW AND it has taken some time since last buttonpress
		if(reading == HIGH && states[i][1] == LOW && millis() - time[i] > debounce) 
		{
			//Toggle the state
			states[i][0] = !states[i][0];
			//Set new time (when was the button last pressed)
			time[i] = millis();
			//Write the current state on the current pin
			digitalWrite(outPins[i], states[i][0]); 
		}
		//Set current state as the previous state for the next reading on this pin
		states[i][1] = reading;
	}
}
Användarvisningsbild
ochkl0620
Inlägg: 4852
Blev medlem: 9 maj 2010, 23:34:56
Skype: challe.claesson
Ort: Näsåker Västernorrland
Kontakt:

Re: Lite Arduinobekymmer...

Inlägg av ochkl0620 »

Alltså.... grejen är att jag VILL verkligen lära mig men har så förbannat svårt att fatta!
Har ganska stora koncentrationssvårigheter pga stress och ADD. Ska även utredas för ADHD i höst. Jag KAN lära mig men det tar sin tid, vilket är bristvara ;) Men men, Vad jag än gör i koden så vägrar den kompilera.
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Lite Arduinobekymmer...

Inlägg av Klas-Kenny »

Angående att lära sig, är det syntaxen eller själva tankegången som är problemet? Eller båda?

Om det är syntaxen som är det stora problemet, leta upp någon bra nybörjarguide och försök lära dig efter den.

Om det är själva tankegången kring hur man lägger upp ett program, börja med att rita flödesscheman, steg för steg av allt som programmet ska göra, så är det lättare att dela upp stegen i kod sedan.
Användarvisningsbild
ochkl0620
Inlägg: 4852
Blev medlem: 9 maj 2010, 23:34:56
Skype: challe.claesson
Ort: Näsåker Västernorrland
Kontakt:

Re: Lite Arduinobekymmer...

Inlägg av ochkl0620 »

Det är både och.
Problemet är att alt är på engelska. Jag jobbar som fan på engelskan men det tar sin tid.
Sen hittar jag ingen stans vad alla jävla krumilurer gör för nytta i koden. */ { () ,... Men om vi säger såhär...
Den som kan detta, vad vill du ha för att fixa detta åt mig?
Användarvisningsbild
Klas-Kenny
Inlägg: 11841
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Lite Arduinobekymmer...

Inlägg av Klas-Kenny »

Jag vill minnas att jag sett Arduino-böcker på svenska, kanske kunde det vara något? Eller för programmeringen i sig, finns många C-böcker på svenska som går att låna på närmsta bibliotek.

Här har du större delen av alla krumelurer i C och C++. :) http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B
Dock på engelska, men men.

De du nämner, *\ är avslutet på en flerradig kommentar. Om du vill lägga till förklarande text eller så i din kod, som inte gör någonting alls mer än hjälper dig eller någon annan som läser koden sedan, så använder du detta. Kommentaren börjar med en /* och slutar med en */, allt där emellan är kommentar.
Du kan även kommentera med //, då är resten utav raden du skriver på en kommentar.

Måsvingarna { och } talar om var ett "block" börjar och slutar. Tex. i en if-sats, så skriver du alltid if( vad som ska kollas ) { Här är koden som if-satsen ska utföra, inom måsvingarna }.

Parenteser ( och ) kan ligga på lite olika sätt, men oftast så talar det om att allt inom parenteserna är någon typ utav argument till en funktion, eller för en if-sats, while-loop eller liknande.
Så du skriver ju alltid funktion( argument1, argument2 ); Som exempel, om du skriver en funktion som adderar två tal så kan du ju ha tex. för att addera 5+7 så kör du add( 5, 7 ); där 5 och 7 alltså är argumenten till funktionen. Sen så ibland så står det ju bara () utan något emellan, det är för att ALLA funktioner måste ha parenteserna efter sig. Ska funktionen inte ta några argument så skrivs inget mellan parenteserna, men de måste vara där. Se det som ett sätt att skilja mellan variabler och funktioner i koden, ser du () efter namnet vet du att det är en funktion och inte en variabel.

Sen så kan du även använda parenteserna likt i matematik för att gruppera saker, antingen bara för läsbarhetens skull eller även för att bestämma prioriteringsordning i utförande.
Du kan ju tex. skriva att variabel = (7 + 5) * 3; för att det ska bli 12*3 snarare än 7+15.



Men ett annat bra sätt för att lösa problemet är ju att göra så här, gör ditt bästa för att få till någonting alls!
När du kör fast, eller har skrivit något du tycker borde fungera men inte ens vill kompilera eller liknande, posta koden här så kommer du garanterat få bra svar på vad du gjort för fel, och du får lära dig av dina egna misstag. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Lite Arduinobekymmer...

Inlägg av sodjan »

> Vad jag än gör i koden...

Som till exempel vadå?

> ...så vägrar den kompilera.

Problemet är att sådana kommentarer är komplett värdelösa om
man inte har koden som kompilerades *och* felmeddelanderna.
Det finns oändligt många saker som gör kompilatorn missnöjd... :-)
Användarvisningsbild
ochkl0620
Inlägg: 4852
Blev medlem: 9 maj 2010, 23:34:56
Skype: challe.claesson
Ort: Näsåker Västernorrland
Kontakt:

Re: Lite Arduinobekymmer...

Inlägg av ochkl0620 »

Ok. Nu har jag hållit på över 6 timmar utan en minsta gnutta framgång.
Jag kommer nog få köpa 3st Atmega 328.
svanted
Inlägg: 5280
Blev medlem: 30 augusti 2010, 21:20:38
Ort: Umeå

Re: Lite Arduinobekymmer...

Inlägg av svanted »

har du kopplat så att exemplet med en knapp fungerade?

om du gör tre loopar, en för varje knapp och utgång..
alla är likadana som den du har men med inPin1 outPin1, inPin2 outPin2 o.s.v. i var sin loop
loopar som du döper loop1, loop2, loop3...
Användarvisningsbild
ochkl0620
Inlägg: 4852
Blev medlem: 9 maj 2010, 23:34:56
Skype: challe.claesson
Ort: Näsåker Västernorrland
Kontakt:

Re: Lite Arduinobekymmer...

Inlägg av ochkl0620 »

Ja det fungerar perfekt med en knapp :)
Nu har jag fått lite krubb i kistan, barnen sover o jag har också fått ett par Carlsberg!
Detta resulterade i lite mer lugn och ro vilket hjälpte avsevärt. Jag fick lite hjälp igår att modda koden men det ville sig inte riktigt med jag spann vidare på lösningen och fick till det rätt bra. Jag har nu 3 separata kanaler. Men ett problem kvarstår, man måste "spamma" knappen rätt fort ca 4 ggr innan leden tänds eller släcks. Vad kan detta bero på? Detta problemet fanns inte innan.

Kod: Markera allt

int inPin0 = 2;        
int inPin1 = 3;  
int inPin2 = 4;  
 
int outPin0 = 5;      
int outPin1 = 6;    
int outPin2 = 7;    
 
int state0 = HIGH;
int reading0;  
int previous0 = LOW;
 
int state1 = HIGH;
int reading1;  
int previous1 = LOW;
 
int state2 = HIGH;
int reading2;  
int previous2 = LOW;
 
long time = 0;        
long debounce = 200;  
 
void setup()
{
  pinMode(inPin0, INPUT);
  pinMode(inPin1, INPUT);
  pinMode(inPin2, INPUT);
 
  pinMode(outPin0, OUTPUT);
  pinMode(outPin1, OUTPUT);
  pinMode(outPin2, OUTPUT);
}
 
void loop()
{
  reading0 = digitalRead(inPin0);
  reading1 = digitalRead(inPin1);
  reading2 = digitalRead(inPin2);
 
 
 
  if (reading0 == HIGH && previous0 == LOW && millis() - time > debounce) {
    if (state0 == HIGH)
      state0 = LOW;
    else
      state0 = HIGH;
 
{  
       if (reading1 == HIGH && previous1 == LOW && millis() - time > debounce) {
    if (state1 == HIGH)
      state1 = LOW;
    else
      state1 = HIGH;
       }
       
      {
       if (reading2 == HIGH && previous2 == LOW && millis() - time > debounce) {
    if (state2 == HIGH)
      state2 = LOW;
    else
      state2 = HIGH;
 
    time = millis();    
  }
 
  digitalWrite(outPin0, state0);
  digitalWrite(outPin1, state1);
  digitalWrite(outPin2, state2);
 
 
     }
   }
 }
}
ElectricNooB
Inlägg: 600
Blev medlem: 26 juli 2011, 20:58:06

Re: Lite Arduinobekymmer...

Inlägg av ElectricNooB »

Du måste nog kolla lite på dina "{" och "}".
Skriv svar