Go Down

Topic: come dare un nome a un pezzo di codice (Read 888 times) previous topic - next topic

boschi

in questo codice hanno dato un nome a delle porzioni di codice, e io che non conosco altri linguaggi di programmazione non ho capito come abbia fatto. il codice è questo:

Code: [Select]
/*
RGB Led Lamp 1.0a
by Luca Soltoggio
15/03/2012

http://arduinoelettronica.wordpress.com/

*/

int rpin = 3;   // pin RED
int gpin = 5;   // pin GREEN
int bpin = 6;   // pin BLU
unsigned int r=0, g=0, b=0,bm=0;   // valori rgb e coefficiente divisore del blu
unsigned int valh=0, vals=0, valv=0;   // hue, saturation, value
unsigned int sensorValue;  // variabile che memorizza il valore dei potenziometri

const int analogInPin = A0;  // pin dei potenziometri
const int analogInPin2 = A1;
const int digitalInPin = 10;  // pin del deviatore
const int digitalInPin2= 11;

int red[]={255,255,135};  // array con i valori RGB della funzione "Bianco"
int green[]={157,255,158};
int blue[]={51,255,255};

boolean DIG1, DIG2;

long previousMillis = 0;

int i=0,j=0;
int dl=0;  // delay

void setup()
{
  pinMode(digitalInPin,INPUT);
  pinMode(digitalInPin2,INPUT);
}

void loop()
{
  DIG1=digitalRead(digitalInPin);
  DIG2=digitalRead(digitalInPin2);

  if (DIG1) {
    bm=1.1;
    HSV_Game();
  }
  else if (DIG2) {
    bm=1.9;
    RAINBOW_Game();
  }
  else {
    bm=2.4;
    LIGHT_Game();
  }

  analogWrite(rpin, r/1.09);  // ROSSO
  analogWrite(gpin, g/1);  // VERDE
  analogWrite(bpin, b/bm);  // BLUE
}

// funzione di armonizzazione dei valori analogici tramite media aritmetica
int SensorSmooth (int pin) {
  sensorValue=0;
  for (int i = 0; i<10; i++) {     sensorValue+= analogRead(pin);   }   return int ((float)sensorValue/10+0.5); } // prima funzione: selezione del colore e della luminosità tramite potenziometri void HSV_Game() {   valh = SensorSmooth(analogInPin);   vals = 255;   valv = SensorSmooth(analogInPin2);   valh = map(valh,0,1023,0,359);   valv = map(valv,0,1023,32,255);   hsv2rgb(valh,vals,valv,r,g,b); } // seconda funzione: selezione di bianco caldo, bianco neutro e bianco freddo, oltre alla luminosità void LIGHT_Game() {   valv = SensorSmooth(analogInPin2);   valv = map(valv,0,1023,16,255);   valh = SensorSmooth(analogInPin);   if (valh=742) valh=2;   if (valh>2) valh=1;
  r=red[valh]*valv/255;
  g=green[valh]*valv/255;
  b=blue[valh]*valv/255;
}

// terza funzione: selezione della velocità di rotazione tra tutti i colori e della luminosità
void RAINBOW_Game() {
  dl = SensorSmooth(analogInPin); // tempo di pausa
  dl = map(dl,0,1023,1,100);
  valv = SensorSmooth(analogInPin2);
  valv = map(valv,0,1023,64,255);
  unsigned long currentMillis = millis();
  switch (j) {
    case 0:
      r=255*valv/255;
      g=i*valv/255;
      b=0*valv/255;
      break;
    case 1:
      r=(255-i)*valv/255;
      g=255*valv/255;
      b=0*valv/255;
      break;
    case 2:
      r=0*valv/255;
      g=255*valv/255;
      b=i*valv/255;
      break;
    case 3:
      r=0*valv/255;
      g=(255-i)*valv/255;
      b=255*valv/255;
      break;
    case 4:
      r=i*valv/255;
      g=0*valv/255;
      b=255*valv/255;
      break;
    case 5:
      r=255*valv/255;
      g=0*valv/255;
      b=(255-i)*valv/255;
  }
  if (currentMillis-previousMillis > (long)(100-dl)) {  // usa millis invece che delay
    previousMillis=currentMillis;
    i=i+1;
    if (i==256) {
      i=1;
      j=j+1;
      if (j==6) j=0;
    }
  }
}

/* Funzione che trasforma HSV in RGB
(c) Elco Jacobs, E-atelier Industrial Design TU/e, July 2011

http://code.google.com/p/shiftpwm/source/browse/trunk/examples/ShiftPWM_Example1/hsv2rgb.cpp?r=3

*/
void hsv2rgb(int hue, int sat, int val, unsigned int& r, unsigned int& g, unsigned int& b)
{
    int H_accent = hue/60;
    int bottom = ((255 - sat) * val)>>8;
    int top = val;
    int rising  = ((top-bottom)  *(hue%60   )  )  /  60  +  bottom;
    int falling = ((top-bottom)  *(60-hue%60)  )  /  60  +  bottom;

    switch(H_accent) {
        case 0:
                r = top;
                g = rising;
                b = bottom;
        break;

        case 1:
                r = falling;
                g = top;
                b = bottom;
        break;

        case 2:
                r = bottom;
                g = top;
                b = rising;
        break;

        case 3:
                r = bottom;
                g = falling;
                b = top;
        break;

        case 4:
                r = rising;
                g = bottom;
                b = top;
        break;

        case 5:
                r = top;
                g = bottom;
                b = falling;
        break;
    }
}


ho tentato di fare un codice che richiamasse da un if unh blocco di codice, ma naturalmente non sono riuscito a farlo funzionare. il codice esempio è:

Quote



int led = 2; // i due led
int ledb =3;

int in = 7; //pin switch


void setup() {
pinMode(in, INPUT);
pinMode(led, OUTPUT);
pinMode(ledb, OUTPUT);
}

void loop() {               
  
 if(in == HIGH){void a};
 else if(in == LOW){void b};
 
}

void a(){
  
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
}

void b(){
  
   digitalWrite(ledb, HIGH);
  delay(300);
  digitalWrite(ledb, LOW);
  delay(300);
}



grazie delle eventuali risposte

mdr04

prova cosi
Code: [Select]

int led = 2; // i due led
int ledb =3;
int in = 7; //pin switch

void setup() {
pinMode(in, INPUT);
pinMode(led, OUTPUT);
pinMode(ledb, OUTPUT);
}

void loop() {               
if (in == HIGH){a();}
else if (in == LOW){b();}
}

void a(void){
  digitalWrite(led, HIGH);
  delay(300);
  digitalWrite(led, LOW);
  delay(300);
}

void b(void){
  digitalWrite(ledb, HIGH);
  delay(300);
  digitalWrite(ledb, LOW);
  delay(300);
}

nid69ita

#2
Aug 05, 2014, 05:26 pm Last Edit: Aug 05, 2014, 05:31 pm by nid69ita Reason: 1
Sbagli la chiamata nella loop(), per richiamare la porzione di codice basta il nome e 2 tonde vuote, poi punto e virgola:
Code: [Select]
void loop()
{ ...
  if( digitalRead(in) == HIGH)
 { a();          // chiamata a funzione senza parametri (void) e senza ritorno di valore (void)
 }
...
}


Cerca con google, "Tiziana Marsella programmare Arduino", ha scritto un ottimo PDF sulla programmazione C in Arduino. E' free.

Poi, OCCHIO che usare in da solo NON serve a nulla, devi usare il comando digitalRead(in) per leggere dal pin 7

Anche il tuo codice mettilo nei tag code, in quella forma si capisce poco. (html)
my name is IGOR, not AIGOR

leo72

@boschi:
la porzione di codice delimitata da un "nome" in realtà è una funzione che può essere richiamata da un altro punto del codice.
http://www.html.it/pag/15409/le-funzioni/

In altri linguaggi quelle porzioni di codice sono chiamate anche functions, procedures, routines ecc ma il succo non cambia: si tratta di creare un qualcosa di riutilizzabile da più punti del programma. Esse possono accettare parametri oppure no.

boschi

#4
Aug 05, 2014, 10:17 pm Last Edit: Aug 05, 2014, 10:28 pm by boschi Reason: 1
capisco, grazie mille dell aiuto che mi avete prontamente dato

@nid69ita grazie per il libro, lo sto gia inviando al kindle, e per il digital read...
gia, ero di fretta e l'ho dimenticato, un errore piccolo piccolo...
per il codice ho provato la funzione "copia per il forum" dell IDE, ma è meglio usare il tag code e il normale copia e incolla

Go Up