Pro mini changement pin pour interrupt

Bonjour à tous,

J'ai un programme d'anémomètre Davis qui fonctionne, pour calculer la vitesse, avec une interruption, à l'origine sur la Pin D2 d'une arduino pro mini.

Mais voilà, j'ai utilisé un PCB tout fait (en l’occurrence celui du Thermomètre de Hbachetti) sans réfléchir et la pins D2 est occupée pour connecter IRQ de la NRF24L01 et la pin D3 pour le sensor DS18B20.

J'ai compris que seules ces Pins D2 et D3 sont utilisables pour les interruptions. Après test avec le programme simplifié ci dessous, seule le Pin D2 fonctionne pour le rendu de la vitesse.

Ma question : peut on déplacer l'interruption sur une autre pin que la D2, par exemple la D9 ?

Autre piste si pas possible : modifier le PCB (IRQ de la NRF24L01 doit il être connecté ?)

Merci pour votre aide

J'ai compris que seules ces Pins D2 et D3 sont utilisables pour les interruptions.

Ma question : peut on déplacer l'interruption sur une autre pin que la D2, par exemple la D9 ?

Si c'est D2 et D3 ce ne peut pas être D9 c'est toi même qui le dit.

Par contre tu peux déplacer la DS18B20 sur D9 et libérer D3.

Autre solution mais plus compliquée que déplacer la DS18B20 :
Dans un micro atmega328p (Uno, nano, mini-pro) absolument toutes les E/S peuvent être utilisées pour des interruptions sur les groupes d'E/S : les interruption PCINTX.
Utiliser les interruptions directes int0 (D2) et int1 (D3) est très facile, utiliser les PCINTX sur toutes les E/S est plus compliqué.
Si cela te tente d'en savoir plus sur les interruption sur les PORTS:
http://forum.arduino.cc/index.php?topic=100906.0

Bonjour 68tjs,

En fait D3 ne fonctionne pas pour moi. Seule D2 me donne une valeur de vitesse du vent.

Comme IRQ n'est pas utilisée par NRF24L01, j'ai coupé la liaison en grattant le PCB et j'ai utilisé D2.

Merci pour l'aide

Cela veut dire quoi : ne fonctionne pas pour moi ?

Théoriquement ça devrait marcher.
Il suffit d'utiliser attachInterrupt avec 3 en paramètre.

Enfin presque, comme ceci :

attachInterrupt(digitalPinToInterrupt(3), ISR, mode);

Bonjour à tous,

Voici mon programme test de la vitesse et la direction du vent (Je ne mets pas celui de la station météo car il faut que je le coupe en plusieurs morceaux!) :

//Capteur anémomètre-Girouette DAVIS
//Inspiré du site ci dessous
//http://cactus.io/hookups/weather/anemometer/davis/hookup-arduino-to-davis-anemometer-software
//Modifié par JMD car oubli ligne 39 "  attachInterrupt(digitalPinToInterrupt(WindSensorPin), isr_rotation, FALLING);"
//Plus quelques adaptations perso...

#include "TimerOne.h" // Timer Interrupt set to 2 second for read sensors 
#include <math.h>

#define WindSensorPin (2) // The pin location of the anemometer sensor 
#define WindVanePin (A1) // The pin the wind vane sensor is connected to 
#define VaneOffset 0; // define the anemometer offset from magnetic north 

int VaneValue; // raw analog value from wind vane
int Direction; // translated 0 - 360 direction
int CalDirection; // converted value with offset applied
int LastValue; // last direction value

volatile bool IsSampleRequired; // this is set true every 2.5s. Get wind speed
volatile unsigned int TimerCount; // used to determine 2.5sec timer count
volatile unsigned long rotations; // cup rotation counter used in interrupt routine
volatile unsigned long ContactBounceTime; // Timer to avoid contact bounce in isr

float WindSpeed; // speed miles per hour

void setup() {

  LastValue = 0;

  IsSampleRequired = false;

  TimerCount = 0;
  rotations = 0; // Set Rotations to 0 ready for calculations

  Serial.begin(115200);

  pinMode(WindSensorPin, INPUT);
  //  attachInterrupt(digitalPinToInterrupt(WindSensorPin), rotations, FALLING);
  attachInterrupt(digitalPinToInterrupt(WindSensorPin), isr_rotation, FALLING);
  Serial.println("Davis Anemometer Test");
  Serial.println("Speed (MPH)\tKilometers\tDirection\tStrength");

  // Setup the timer interupt
  Timer1.initialize(500000);// Timer interrupt every 2.5 seconds
  Timer1.attachInterrupt(isr_timer);
}

void loop() {

  getWindDirection();

  // Only update the display if change greater than 5 degrees.
  if (abs(CalDirection - LastValue) > 5) {
    LastValue = CalDirection;
  }

  if (IsSampleRequired) {
    // convert to mp/h using the formula V=P(2.25/T)for Davis Anemometer 
    // V = P(2.25/2.5) = P * 0.9
    WindSpeed = rotations * 0.9;
    rotations = 0; // Reset count for next sample

    IsSampleRequired = false;

    Serial.print(WindSpeed); Serial.print("\t\t");
    //Serial.print(getKnots(WindSpeed)); Serial.print("\t");
    Serial.print(getKilometers(WindSpeed)); Serial.print("\t");
    Serial.print(CalDirection);
    getHeading(CalDirection); Serial.print("\t\t");
    getWindStrength(WindSpeed);
  }
}

// isr handler for timer interrupt
void isr_timer() {

  TimerCount++;

  if (TimerCount == 6)
  {
    IsSampleRequired = true;
    TimerCount = 0;
  }
}

// This is the function that the interrupt calls to increment the rotation count
void isr_rotation() {

  if ((millis() - ContactBounceTime) > 15 ) { // debounce the switch contact.
    rotations++;
    ContactBounceTime = millis();
  }
}

// Convert MPH to Knots
float getKnots(float speed) {
  return speed * 0.868976;
}

// Convert MPH to Km/h
float getKilometers(float speed) {
  return speed * 1.60934;
}

// Get Wind Direction
void getWindDirection() {

  VaneValue = analogRead(WindVanePin);
  Direction = map(VaneValue, 0, 1023, 0, 359);
  CalDirection = Direction + VaneOffset;

  if (CalDirection > 360)
    CalDirection = CalDirection - 360;

  if (CalDirection < 0)
    CalDirection = CalDirection + 360;

}

// Converts compass direction to heading
void getHeading(int direction) {

  if (direction < 22)
    Serial.print(" N");
  else if (direction < 67)
    Serial.print(" NE");
  else if (direction < 112)
    Serial.print(" E");
  else if (direction < 157)
    Serial.print(" SE");
  else if (direction < 202)
    Serial.print(" S");
  else if (direction < 247)
    Serial.print(" SW");
  else if (direction < 292)
    Serial.print(" W");
  else if (direction < 337)
    Serial.print(" NW");
  else
    Serial.print(" N");
}

// converts wind speed to wind strength
void getWindStrength(float speed) {

  if (speed < 2)
    Serial.println("Calm");
  else if (speed >= 2 && speed < 4)
    Serial.println("Light Air");
  else if (speed >= 4 && speed < 8)
    Serial.println("Light Breeze");
  else if (speed >= 8 && speed < 13)
    Serial.println("Gentle Breeze");
  else if (speed >= 13 && speed < 18)
    Serial.println("Moderate Breeze");
  else if (speed >= 18 && speed < 25)
    Serial.println("Fresh Breeze");
  else if (speed >= 25 && speed < 31)
    Serial.println("Strong Breeze");
  else if (speed >= 31 && speed < 39)
    Serial.println("Near Gale");
  else
    Serial.println("RUN");
}

Avec le wind sensor du capteur Davis sur la Pin D2 ça fonctionne.

Si je le branche sur la pin D3 (en changeant bien sûr :"#define WindSensorPin (3")), ça ne fonctionne pas. Pas d’indication de vitesse du vent !

Rappel du matériel : Arduino pro mini + NRF24L01+ + capteur anémomètre Davis.

Pourtant, les interruptions sont bien sur les Pins D2 et D3, non ?

Oui. Étonnant ...