<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
		<id>http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Penant</id>
		<title>troyesGEII - Contributions de l’utilisateur [fr]</title>
		<link rel="self" type="application/atom+xml" href="http://wikigeii.iut-troyes.univ-reims.fr//api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Penant"/>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Sp%C3%A9cial:Contributions/Penant"/>
		<updated>2026-05-12T13:47:39Z</updated>
		<subtitle>Contributions de l’utilisateur</subtitle>
		<generator>MediaWiki 1.30.1</generator>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20972</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20972"/>
				<updated>2026-05-07T15:38:16Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer2 → PWM moteur 1 kHz + duty variable&lt;br /&gt;
Timer1 → comptage des impulsions&lt;br /&gt;
&lt;br /&gt;
T1 = PD5 = Arduino D5&lt;br /&gt;
&lt;br /&gt;
Programme fait avec ChatGpt on peut mettre le programme de l'ISR dans le Main&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP    10000UL&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // T1 entrée&lt;br /&gt;
    //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
    TCCR1A = 0x00;&lt;br /&gt;
    TCCR1B = 0x00;&lt;br /&gt;
&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    OCR1A = 1;&lt;br /&gt;
&lt;br /&gt;
    TIMSK1 = (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
    // compteur externe sur front montant T1&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI)&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = DUTY_MAX;   // 100 %&lt;br /&gt;
    }&lt;br /&gt;
    else if (position &amp;lt; POS_STOP)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
        OCR2B = DUTY_MAX -&lt;br /&gt;
                ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) /&lt;br /&gt;
                (POS_STOP - POS_RALENTI);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
        OCR2B = 0;          // arrêt moteur&lt;br /&gt;
&lt;br /&gt;
        TCCR1B = 0x00;      // stop compteur Timer1&lt;br /&gt;
        TIMSK1 = 0x00;      // désactive interruption&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    OCR1A = TCNT1 + 1;      // prochaine impulsion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    timer2_pwm_init();&lt;br /&gt;
    timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programmes permettant de lire ou d’écrire dans plusieurs registres : Il faut deux câbles USB un sur le Master, l'autre sur le Slave sinon le moteur &amp;quot;broute&amp;quot; et la communication I2C ne fonctionne pas.&lt;br /&gt;
7526 100 %&lt;br /&gt;
7669 100 %&lt;br /&gt;
7812 100 %&lt;br /&gt;
7955 99 %&lt;br /&gt;
8098 92 %&lt;br /&gt;
8242 86 %&lt;br /&gt;
8386 79 %&lt;br /&gt;
8529 73 %&lt;br /&gt;
8673 66 %&lt;br /&gt;
8816 60 %&lt;br /&gt;
8959 53 %&lt;br /&gt;
9101 47 %&lt;br /&gt;
9236 41 %&lt;br /&gt;
9367 35 %&lt;br /&gt;
9493 30 %&lt;br /&gt;
9616 24 %&lt;br /&gt;
9734 19 %&lt;br /&gt;
9850 14 %&lt;br /&gt;
9960 0 %&lt;br /&gt;
10059 0 %&lt;br /&gt;
10122 0 %&lt;br /&gt;
10148 0 %&lt;br /&gt;
10149 0 %&lt;br /&gt;
10149 0 %&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
// Programme du Slave&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
#define NB_REGS 6&lt;br /&gt;
&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP 10000UL&lt;br /&gt;
&lt;br /&gt;
#define DUTY_MAX 249&lt;br /&gt;
#define DUTY_MIN 25&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t regs[NB_REGS] = { 1, 2, 3, 4, 5, 6 };&lt;br /&gt;
volatile uint8_t reg_index = 0;&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
  timer2_pwm_init();&lt;br /&gt;
  timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
   // Start the I2C Bus as Slave on address&lt;br /&gt;
  Wire.begin(SLAVE_ADDR);&lt;br /&gt;
  // fonction à exécuter lors de la réception des données envoyées par le master&lt;br /&gt;
  Wire.onReceive(receiveEvent);&lt;br /&gt;
  Wire.onRequest(requestEvent);  &lt;br /&gt;
&lt;br /&gt;
  sei();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI) {&lt;br /&gt;
      OCR2B = DUTY_MAX;  // 100 %&lt;br /&gt;
    } else if (position &amp;lt; POS_STOP) {&lt;br /&gt;
      uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
      OCR2B = DUTY_MAX - ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) / (POS_STOP - POS_RALENTI);&lt;br /&gt;
    } else {&lt;br /&gt;
      TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
      OCR2B = 0;  // arrêt moteur&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    regs[0] = TCNT1H;&lt;br /&gt;
    regs[1] = TCNT1L;&lt;br /&gt;
    regs[2] = OCR2B;&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void receiveEvent(int howMany) {&lt;br /&gt;
  if (howMany &amp;lt; 1) return;&lt;br /&gt;
&lt;br /&gt;
  uint8_t reg = Wire.read();&lt;br /&gt;
&lt;br /&gt;
  if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
    reg_index = reg;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si le maître envoie une valeur après l'adresse registre&lt;br /&gt;
  if (howMany &amp;gt;= 2) {&lt;br /&gt;
    uint8_t value = Wire.read();&lt;br /&gt;
&lt;br /&gt;
    if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
      regs[reg] = value;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void requestEvent() {&lt;br /&gt;
  if (reg_index &amp;lt; NB_REGS) {&lt;br /&gt;
    Wire.write(regs[reg_index]);&lt;br /&gt;
  } else {&lt;br /&gt;
    Wire.write(0xFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void) {&lt;br /&gt;
  DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);  // T1 entrée&lt;br /&gt;
  //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
&lt;br /&gt;
  // compteur externe sur front montant T1&lt;br /&gt;
  TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init(void) {&lt;br /&gt;
  // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
  DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
  // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
  // OC2B non-inversé&lt;br /&gt;
  TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
  TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
  TCNT2 = 0;&lt;br /&gt;
  OCR2A = 248;  // TOP → 1 kHz&lt;br /&gt;
  //OCR2B = 125;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Programme du Master&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Adafruit_RGBLCDShield.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utility/Adafruit_MCP23017.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
&lt;br /&gt;
void writeRegister(uint8_t reg, uint8_t value) {&lt;br /&gt;
  Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
  Wire.write(reg);&lt;br /&gt;
  Wire.write(value);&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t readRegister(uint8_t reg) {&lt;br /&gt;
  Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
  Wire.write(reg);&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
&lt;br /&gt;
  Wire.requestFrom(SLAVE_ADDR, 1);&lt;br /&gt;
&lt;br /&gt;
  if (Wire.available()) {&lt;br /&gt;
    return Wire.read();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  //init();            // obligatoire pour Arduino&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  _delay_ms(500);&lt;br /&gt;
  /*&lt;br /&gt;
    // Écriture registres&lt;br /&gt;
    writeRegister(0, 10);&lt;br /&gt;
    writeRegister(1, 20);&lt;br /&gt;
    writeRegister(2, 30);&lt;br /&gt;
    writeRegister(3, 40);&lt;br /&gt;
    writeRegister(4, 50);&lt;br /&gt;
    writeRegister(5, 60);&lt;br /&gt;
*/&lt;br /&gt;
  sei();&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  &lt;br /&gt;
  while (1) {&lt;br /&gt;
    uint16_t position = readRegister(0) * 256 + readRegister(1);&lt;br /&gt;
    lcd.setCursor(0, 0);&lt;br /&gt;
    lcd.print(&amp;quot;Position :&amp;quot;);&lt;br /&gt;
    lcd.print((position / 10000) % 10);&lt;br /&gt;
    lcd.print((position / 1000) % 10);&lt;br /&gt;
    lcd.print((position / 100) % 10);&lt;br /&gt;
    lcd.print((position / 10) % 10);&lt;br /&gt;
    lcd.print(position % 10);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    uint8_t duty = readRegister(2) * 100.0 / 248.0;  // 248 slave OCR2A fréquence 1000Hz&lt;br /&gt;
    lcd.setCursor(0, 1);&lt;br /&gt;
    lcd.print(&amp;quot;Duty :&amp;quot;);&lt;br /&gt;
    lcd.print((duty / 100) % 10);&lt;br /&gt;
    lcd.print((duty / 10) % 10);&lt;br /&gt;
    lcd.print(duty % 10);&lt;br /&gt;
    lcd.print(&amp;quot; %&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Serial.print(position);&lt;br /&gt;
    Serial.print(&amp;quot; &amp;quot;);&lt;br /&gt;
    Serial.print(duty);&lt;br /&gt;
    Serial.println(&amp;quot; %&amp;quot;);&lt;br /&gt;
    _delay_ms(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20971</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20971"/>
				<updated>2026-05-07T15:26:29Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer2 → PWM moteur 1 kHz + duty variable&lt;br /&gt;
Timer1 → comptage des impulsions&lt;br /&gt;
&lt;br /&gt;
T1 = PD5 = Arduino D5&lt;br /&gt;
&lt;br /&gt;
Programme fait avec ChatGpt on peut mettre le programme de l'ISR dans le Main&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP    10000UL&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // T1 entrée&lt;br /&gt;
    //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
    TCCR1A = 0x00;&lt;br /&gt;
    TCCR1B = 0x00;&lt;br /&gt;
&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    OCR1A = 1;&lt;br /&gt;
&lt;br /&gt;
    TIMSK1 = (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
    // compteur externe sur front montant T1&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI)&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = DUTY_MAX;   // 100 %&lt;br /&gt;
    }&lt;br /&gt;
    else if (position &amp;lt; POS_STOP)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
        OCR2B = DUTY_MAX -&lt;br /&gt;
                ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) /&lt;br /&gt;
                (POS_STOP - POS_RALENTI);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
        OCR2B = 0;          // arrêt moteur&lt;br /&gt;
&lt;br /&gt;
        TCCR1B = 0x00;      // stop compteur Timer1&lt;br /&gt;
        TIMSK1 = 0x00;      // désactive interruption&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    OCR1A = TCNT1 + 1;      // prochaine impulsion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    timer2_pwm_init();&lt;br /&gt;
    timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programmes permettant de lire ou d’écrire dans plusieurs registres : Il faut deux câbles USB un sur le Master, l'autre sur le Slave sinon le moteur &amp;quot;broute&amp;quot; et la communication I2C ne fonctionne pas.&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
// Programme du Slave&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
#define NB_REGS 6&lt;br /&gt;
&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP 10000UL&lt;br /&gt;
&lt;br /&gt;
#define DUTY_MAX 249&lt;br /&gt;
#define DUTY_MIN 25&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t regs[NB_REGS] = { 1, 2, 3, 4, 5, 6 };&lt;br /&gt;
volatile uint8_t reg_index = 0;&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
  timer2_pwm_init();&lt;br /&gt;
  timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
   // Start the I2C Bus as Slave on address&lt;br /&gt;
  Wire.begin(SLAVE_ADDR);&lt;br /&gt;
  // fonction à exécuter lors de la réception des données envoyées par le master&lt;br /&gt;
  Wire.onReceive(receiveEvent);&lt;br /&gt;
  Wire.onRequest(requestEvent);  &lt;br /&gt;
&lt;br /&gt;
  sei();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI) {&lt;br /&gt;
      OCR2B = DUTY_MAX;  // 100 %&lt;br /&gt;
    } else if (position &amp;lt; POS_STOP) {&lt;br /&gt;
      uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
      OCR2B = DUTY_MAX - ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) / (POS_STOP - POS_RALENTI);&lt;br /&gt;
    } else {&lt;br /&gt;
      TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
      OCR2B = 0;  // arrêt moteur&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    regs[0] = TCNT1H;&lt;br /&gt;
    regs[1] = TCNT1L;&lt;br /&gt;
    regs[2] = OCR2B;&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void receiveEvent(int howMany) {&lt;br /&gt;
  if (howMany &amp;lt; 1) return;&lt;br /&gt;
&lt;br /&gt;
  uint8_t reg = Wire.read();&lt;br /&gt;
&lt;br /&gt;
  if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
    reg_index = reg;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si le maître envoie une valeur après l'adresse registre&lt;br /&gt;
  if (howMany &amp;gt;= 2) {&lt;br /&gt;
    uint8_t value = Wire.read();&lt;br /&gt;
&lt;br /&gt;
    if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
      regs[reg] = value;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void requestEvent() {&lt;br /&gt;
  if (reg_index &amp;lt; NB_REGS) {&lt;br /&gt;
    Wire.write(regs[reg_index]);&lt;br /&gt;
  } else {&lt;br /&gt;
    Wire.write(0xFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void) {&lt;br /&gt;
  DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);  // T1 entrée&lt;br /&gt;
  //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
&lt;br /&gt;
  // compteur externe sur front montant T1&lt;br /&gt;
  TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init(void) {&lt;br /&gt;
  // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
  DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
  // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
  // OC2B non-inversé&lt;br /&gt;
  TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
  TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
  TCNT2 = 0;&lt;br /&gt;
  OCR2A = 248;  // TOP → 1 kHz&lt;br /&gt;
  //OCR2B = 125;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Programme du Master&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Adafruit_RGBLCDShield.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utility/Adafruit_MCP23017.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
&lt;br /&gt;
void writeRegister(uint8_t reg, uint8_t value) {&lt;br /&gt;
  Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
  Wire.write(reg);&lt;br /&gt;
  Wire.write(value);&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t readRegister(uint8_t reg) {&lt;br /&gt;
  Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
  Wire.write(reg);&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
&lt;br /&gt;
  Wire.requestFrom(SLAVE_ADDR, 1);&lt;br /&gt;
&lt;br /&gt;
  if (Wire.available()) {&lt;br /&gt;
    return Wire.read();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  //init();            // obligatoire pour Arduino&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  _delay_ms(500);&lt;br /&gt;
  /*&lt;br /&gt;
    // Écriture registres&lt;br /&gt;
    writeRegister(0, 10);&lt;br /&gt;
    writeRegister(1, 20);&lt;br /&gt;
    writeRegister(2, 30);&lt;br /&gt;
    writeRegister(3, 40);&lt;br /&gt;
    writeRegister(4, 50);&lt;br /&gt;
    writeRegister(5, 60);&lt;br /&gt;
*/&lt;br /&gt;
  sei();&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  &lt;br /&gt;
  while (1) {&lt;br /&gt;
    uint16_t position = readRegister(0) * 256 + readRegister(1);&lt;br /&gt;
    lcd.setCursor(0, 0);&lt;br /&gt;
    lcd.print(&amp;quot;Position :&amp;quot;);&lt;br /&gt;
    lcd.print((position / 10000) % 10);&lt;br /&gt;
    lcd.print((position / 1000) % 10);&lt;br /&gt;
    lcd.print((position / 100) % 10);&lt;br /&gt;
    lcd.print((position / 10) % 10);&lt;br /&gt;
    lcd.print(position % 10);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    uint8_t duty = readRegister(2) * 100.0 / 248.0;  // 248 slave OCR2A fréquence 1000Hz&lt;br /&gt;
    lcd.setCursor(0, 1);&lt;br /&gt;
    lcd.print(&amp;quot;Duty :&amp;quot;);&lt;br /&gt;
    lcd.print((duty / 100) % 10);&lt;br /&gt;
    lcd.print((duty / 10) % 10);&lt;br /&gt;
    lcd.print(duty % 10);&lt;br /&gt;
    lcd.print(&amp;quot; %&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Serial.print(position);&lt;br /&gt;
    Serial.print(&amp;quot; &amp;quot;);&lt;br /&gt;
    Serial.print(duty);&lt;br /&gt;
    Serial.println(&amp;quot; %&amp;quot;);&lt;br /&gt;
    _delay_ms(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20970</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20970"/>
				<updated>2026-05-07T15:26:01Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer2 → PWM moteur 1 kHz + duty variable&lt;br /&gt;
Timer1 → comptage des impulsions&lt;br /&gt;
&lt;br /&gt;
T1 = PD5 = Arduino D5&lt;br /&gt;
&lt;br /&gt;
Programme fait avec ChatGpt on peut mettre le programme de l'ISR dans le Main&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP    10000UL&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // T1 entrée&lt;br /&gt;
    //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
    TCCR1A = 0x00;&lt;br /&gt;
    TCCR1B = 0x00;&lt;br /&gt;
&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    OCR1A = 1;&lt;br /&gt;
&lt;br /&gt;
    TIMSK1 = (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
    // compteur externe sur front montant T1&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI)&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = DUTY_MAX;   // 100 %&lt;br /&gt;
    }&lt;br /&gt;
    else if (position &amp;lt; POS_STOP)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
        OCR2B = DUTY_MAX -&lt;br /&gt;
                ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) /&lt;br /&gt;
                (POS_STOP - POS_RALENTI);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
        OCR2B = 0;          // arrêt moteur&lt;br /&gt;
&lt;br /&gt;
        TCCR1B = 0x00;      // stop compteur Timer1&lt;br /&gt;
        TIMSK1 = 0x00;      // désactive interruption&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    OCR1A = TCNT1 + 1;      // prochaine impulsion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    timer2_pwm_init();&lt;br /&gt;
    timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programmes permettant de lire ou d’écrire dans plusieurs registres : Il faut deux câbles USB un sur le Master, l'autre sur le Slave sinon le moteur &amp;quot;broute&amp;quot; et la communication I2C nefonctionne pas.&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
// Programme du Slave&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
#define NB_REGS 6&lt;br /&gt;
&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP 10000UL&lt;br /&gt;
&lt;br /&gt;
#define DUTY_MAX 249&lt;br /&gt;
#define DUTY_MIN 25&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t regs[NB_REGS] = { 1, 2, 3, 4, 5, 6 };&lt;br /&gt;
volatile uint8_t reg_index = 0;&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
&lt;br /&gt;
  timer2_pwm_init();&lt;br /&gt;
  timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
   // Start the I2C Bus as Slave on address&lt;br /&gt;
  Wire.begin(SLAVE_ADDR);&lt;br /&gt;
  // fonction à exécuter lors de la réception des données envoyées par le master&lt;br /&gt;
  Wire.onReceive(receiveEvent);&lt;br /&gt;
  Wire.onRequest(requestEvent);  &lt;br /&gt;
&lt;br /&gt;
  sei();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI) {&lt;br /&gt;
      OCR2B = DUTY_MAX;  // 100 %&lt;br /&gt;
    } else if (position &amp;lt; POS_STOP) {&lt;br /&gt;
      uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
      OCR2B = DUTY_MAX - ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) / (POS_STOP - POS_RALENTI);&lt;br /&gt;
    } else {&lt;br /&gt;
      TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
      OCR2B = 0;  // arrêt moteur&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    regs[0] = TCNT1H;&lt;br /&gt;
    regs[1] = TCNT1L;&lt;br /&gt;
    regs[2] = OCR2B;&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void receiveEvent(int howMany) {&lt;br /&gt;
  if (howMany &amp;lt; 1) return;&lt;br /&gt;
&lt;br /&gt;
  uint8_t reg = Wire.read();&lt;br /&gt;
&lt;br /&gt;
  if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
    reg_index = reg;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si le maître envoie une valeur après l'adresse registre&lt;br /&gt;
  if (howMany &amp;gt;= 2) {&lt;br /&gt;
    uint8_t value = Wire.read();&lt;br /&gt;
&lt;br /&gt;
    if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
      regs[reg] = value;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void requestEvent() {&lt;br /&gt;
  if (reg_index &amp;lt; NB_REGS) {&lt;br /&gt;
    Wire.write(regs[reg_index]);&lt;br /&gt;
  } else {&lt;br /&gt;
    Wire.write(0xFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void) {&lt;br /&gt;
  DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);  // T1 entrée&lt;br /&gt;
  //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
  TCNT1 = 0;&lt;br /&gt;
&lt;br /&gt;
  // compteur externe sur front montant T1&lt;br /&gt;
  TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init(void) {&lt;br /&gt;
  // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
  DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
  // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
  // OC2B non-inversé&lt;br /&gt;
  TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
  TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
  TCNT2 = 0;&lt;br /&gt;
  OCR2A = 248;  // TOP → 1 kHz&lt;br /&gt;
  //OCR2B = 125;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Programme du Master&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Adafruit_RGBLCDShield.h&amp;gt;&lt;br /&gt;
#include &amp;lt;utility/Adafruit_MCP23017.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
&lt;br /&gt;
void writeRegister(uint8_t reg, uint8_t value) {&lt;br /&gt;
  Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
  Wire.write(reg);&lt;br /&gt;
  Wire.write(value);&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t readRegister(uint8_t reg) {&lt;br /&gt;
  Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
  Wire.write(reg);&lt;br /&gt;
  Wire.endTransmission();&lt;br /&gt;
&lt;br /&gt;
  Wire.requestFrom(SLAVE_ADDR, 1);&lt;br /&gt;
&lt;br /&gt;
  if (Wire.available()) {&lt;br /&gt;
    return Wire.read();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void) {&lt;br /&gt;
  //init();            // obligatoire pour Arduino&lt;br /&gt;
  Wire.begin();&lt;br /&gt;
&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
  _delay_ms(500);&lt;br /&gt;
  /*&lt;br /&gt;
    // Écriture registres&lt;br /&gt;
    writeRegister(0, 10);&lt;br /&gt;
    writeRegister(1, 20);&lt;br /&gt;
    writeRegister(2, 30);&lt;br /&gt;
    writeRegister(3, 40);&lt;br /&gt;
    writeRegister(4, 50);&lt;br /&gt;
    writeRegister(5, 60);&lt;br /&gt;
*/&lt;br /&gt;
  sei();&lt;br /&gt;
  lcd.begin(16, 2);&lt;br /&gt;
  &lt;br /&gt;
  while (1) {&lt;br /&gt;
    uint16_t position = readRegister(0) * 256 + readRegister(1);&lt;br /&gt;
    lcd.setCursor(0, 0);&lt;br /&gt;
    lcd.print(&amp;quot;Position :&amp;quot;);&lt;br /&gt;
    lcd.print((position / 10000) % 10);&lt;br /&gt;
    lcd.print((position / 1000) % 10);&lt;br /&gt;
    lcd.print((position / 100) % 10);&lt;br /&gt;
    lcd.print((position / 10) % 10);&lt;br /&gt;
    lcd.print(position % 10);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    uint8_t duty = readRegister(2) * 100.0 / 248.0;  // 248 slave OCR2A fréquence 1000Hz&lt;br /&gt;
    lcd.setCursor(0, 1);&lt;br /&gt;
    lcd.print(&amp;quot;Duty :&amp;quot;);&lt;br /&gt;
    lcd.print((duty / 100) % 10);&lt;br /&gt;
    lcd.print((duty / 10) % 10);&lt;br /&gt;
    lcd.print(duty % 10);&lt;br /&gt;
    lcd.print(&amp;quot; %&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    Serial.print(position);&lt;br /&gt;
    Serial.print(&amp;quot; &amp;quot;);&lt;br /&gt;
    Serial.print(duty);&lt;br /&gt;
    Serial.println(&amp;quot; %&amp;quot;);&lt;br /&gt;
    _delay_ms(10);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20969</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20969"/>
				<updated>2026-05-06T08:12:33Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer2 → PWM moteur 1 kHz + duty variable&lt;br /&gt;
Timer1 → comptage des impulsions&lt;br /&gt;
&lt;br /&gt;
T1 = PD5 = Arduino D5&lt;br /&gt;
&lt;br /&gt;
Programme fait avec ChatGpt on peut mettre le programme de l'ISR dans le Main&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP    10000UL&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // T1 entrée&lt;br /&gt;
    //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
    TCCR1A = 0x00;&lt;br /&gt;
    TCCR1B = 0x00;&lt;br /&gt;
&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    OCR1A = 1;&lt;br /&gt;
&lt;br /&gt;
    TIMSK1 = (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
    // compteur externe sur front montant T1&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI)&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = DUTY_MAX;   // 100 %&lt;br /&gt;
    }&lt;br /&gt;
    else if (position &amp;lt; POS_STOP)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
        OCR2B = DUTY_MAX -&lt;br /&gt;
                ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) /&lt;br /&gt;
                (POS_STOP - POS_RALENTI);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
        OCR2B = 0;          // arrêt moteur&lt;br /&gt;
&lt;br /&gt;
        TCCR1B = 0x00;      // stop compteur Timer1&lt;br /&gt;
        TIMSK1 = 0x00;      // désactive interruption&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    OCR1A = TCNT1 + 1;      // prochaine impulsion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    timer2_pwm_init();&lt;br /&gt;
    timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programmes permettant de lire ou d’écrire dans plusieurs registres : il faudra les adapter avec TCNT1.&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
// Programme du Slave&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
#define NB_REGS 6&lt;br /&gt;
&lt;br /&gt;
volatile uint8_t regs[NB_REGS] = { 1, 2, 3, 4, 5, 6 };&lt;br /&gt;
volatile uint8_t reg_index = 0;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
int main() {&lt;br /&gt;
  // Start the I2C Bus as Slave on address&lt;br /&gt;
  Wire.begin(SLAVE_ADDR);&lt;br /&gt;
  // fonction à exécuter lors de la réception des données envoyées par le master&lt;br /&gt;
  Wire.onReceive(receiveEvent);&lt;br /&gt;
  Wire.onRequest(requestEvent);&lt;br /&gt;
  sei();&lt;br /&gt;
  while (1) {&lt;br /&gt;
    _delay_ms(1);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void receiveEvent(int howMany) {&lt;br /&gt;
  if (howMany &amp;lt; 1) return;&lt;br /&gt;
&lt;br /&gt;
  uint8_t reg = Wire.read();&lt;br /&gt;
&lt;br /&gt;
  if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
    reg_index = reg;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  // Si le maître envoie une valeur après l'adresse registre&lt;br /&gt;
  if (howMany &amp;gt;= 2) {&lt;br /&gt;
    uint8_t value = Wire.read();&lt;br /&gt;
&lt;br /&gt;
    if (reg &amp;lt; NB_REGS) {&lt;br /&gt;
      regs[reg] = value;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void requestEvent() {&lt;br /&gt;
  if (reg_index &amp;lt; NB_REGS) {&lt;br /&gt;
    Wire.write(regs[reg_index]);&lt;br /&gt;
  } else {&lt;br /&gt;
    Wire.write(0xFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Programme du Master&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;Wire.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define SLAVE_ADDR 0x10&lt;br /&gt;
&lt;br /&gt;
void writeRegister(uint8_t reg, uint8_t value)&lt;br /&gt;
{&lt;br /&gt;
    Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
    Wire.write(reg);&lt;br /&gt;
    Wire.write(value);&lt;br /&gt;
    Wire.endTransmission();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint8_t readRegister(uint8_t reg)&lt;br /&gt;
{&lt;br /&gt;
    Wire.beginTransmission(SLAVE_ADDR);&lt;br /&gt;
    Wire.write(reg);&lt;br /&gt;
    Wire.endTransmission(); &lt;br /&gt;
&lt;br /&gt;
    Wire.requestFrom(SLAVE_ADDR, 1);&lt;br /&gt;
&lt;br /&gt;
    if (Wire.available())&lt;br /&gt;
    {&lt;br /&gt;
        return Wire.read();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0xFF;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    init();            // obligatoire pour Arduino&lt;br /&gt;
    Wire.begin();&lt;br /&gt;
&lt;br /&gt;
    Serial.begin(9600);&lt;br /&gt;
&lt;br /&gt;
    _delay_ms(500);&lt;br /&gt;
/*&lt;br /&gt;
    // Écriture registres&lt;br /&gt;
    writeRegister(0, 10);&lt;br /&gt;
    writeRegister(1, 20);&lt;br /&gt;
    writeRegister(2, 30);&lt;br /&gt;
    writeRegister(3, 40);&lt;br /&gt;
    writeRegister(4, 50);&lt;br /&gt;
    writeRegister(5, 60);&lt;br /&gt;
*/&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
        for (uint8_t i = 0; i &amp;lt; 6; i++)&lt;br /&gt;
        {&lt;br /&gt;
            uint8_t value = readRegister(i);&lt;br /&gt;
&lt;br /&gt;
            Serial.print(&amp;quot;Reg &amp;quot;);&lt;br /&gt;
            Serial.print(i);&lt;br /&gt;
            Serial.print(&amp;quot; = &amp;quot;);&lt;br /&gt;
            Serial.println(value);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        Serial.println(&amp;quot;----&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        _delay_ms(1000);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20968</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20968"/>
				<updated>2026-05-06T06:49:37Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer2 → PWM moteur 1 kHz + duty variable&lt;br /&gt;
Timer1 → comptage des impulsions&lt;br /&gt;
&lt;br /&gt;
T1 = PD5 = Arduino D5&lt;br /&gt;
&lt;br /&gt;
Programme fait avec ChatGpt on peut mettre le programme de l'ISR dans le Main&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP    10000UL&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // T1 entrée&lt;br /&gt;
    //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
    TCCR1A = 0x00;&lt;br /&gt;
    TCCR1B = 0x00;&lt;br /&gt;
&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    OCR1A = 1;&lt;br /&gt;
&lt;br /&gt;
    TIMSK1 = (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
    // compteur externe sur front montant T1&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI)&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = DUTY_MAX;   // 100 %&lt;br /&gt;
    }&lt;br /&gt;
    else if (position &amp;lt; POS_STOP)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
        OCR2B = DUTY_MAX -&lt;br /&gt;
                ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) /&lt;br /&gt;
                (POS_STOP - POS_RALENTI);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        TCCR2A &amp;amp;= ~(1 &amp;lt;&amp;lt; COM2B1);&lt;br /&gt;
        OCR2B = 0;          // arrêt moteur&lt;br /&gt;
&lt;br /&gt;
        TCCR1B = 0x00;      // stop compteur Timer1&lt;br /&gt;
        TIMSK1 = 0x00;      // désactive interruption&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    OCR1A = TCNT1 + 1;      // prochaine impulsion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    timer2_pwm_init();&lt;br /&gt;
    timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20967</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20967"/>
				<updated>2026-05-06T06:43:12Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer2 → PWM moteur 1 kHz + duty variable&lt;br /&gt;
Timer1 → comptage des impulsions&lt;br /&gt;
&lt;br /&gt;
T1 = PD5 = Arduino D5&lt;br /&gt;
&lt;br /&gt;
Programme fait avec ChatGpt on peut mettre le programme de l'ISR dans le Main&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP    10000UL&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // T1 entrée&lt;br /&gt;
    //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
    TCCR1A = 0x00;&lt;br /&gt;
    TCCR1B = 0x00;&lt;br /&gt;
&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    OCR1A = 1;&lt;br /&gt;
&lt;br /&gt;
    TIMSK1 = (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
    // compteur externe sur front montant T1&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI)&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = DUTY_MAX;   // 100 %&lt;br /&gt;
    }&lt;br /&gt;
    else if (position &amp;lt; POS_STOP)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
        OCR2B = DUTY_MAX -&lt;br /&gt;
                ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) /&lt;br /&gt;
                (POS_STOP - POS_RALENTI);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = 0;          // arrêt moteur&lt;br /&gt;
&lt;br /&gt;
        TCCR1B = 0x00;      // stop compteur Timer1&lt;br /&gt;
        TIMSK1 = 0x00;      // désactive interruption&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    OCR1A = TCNT1 + 1;      // prochaine impulsion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    timer2_pwm_init();&lt;br /&gt;
    timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20966</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20966"/>
				<updated>2026-05-06T06:38:19Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Timer2 → PWM moteur 1 kHz + duty variable&lt;br /&gt;
Timer1 → comptage des impulsions&lt;br /&gt;
&lt;br /&gt;
T1 = PD5 = Arduino D5&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
#define POS_RALENTI 8000UL&lt;br /&gt;
#define POS_STOP    10000UL&lt;br /&gt;
&lt;br /&gt;
volatile uint16_t position = 0;&lt;br /&gt;
&lt;br /&gt;
void timer1_counter_init(void)&lt;br /&gt;
{&lt;br /&gt;
    DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD5);   // T1 entrée&lt;br /&gt;
    //PORTD |= (1 &amp;lt;&amp;lt; PD5);   // pull-up si besoin&lt;br /&gt;
&lt;br /&gt;
    TCCR1A = 0x00;&lt;br /&gt;
    TCCR1B = 0x00;&lt;br /&gt;
&lt;br /&gt;
    TCNT1 = 0;&lt;br /&gt;
    OCR1A = 1;&lt;br /&gt;
&lt;br /&gt;
    TIMSK1 = (1 &amp;lt;&amp;lt; OCIE1A);&lt;br /&gt;
&lt;br /&gt;
    // compteur externe sur front montant T1&lt;br /&gt;
    TCCR1B = (1 &amp;lt;&amp;lt; CS12) | (1 &amp;lt;&amp;lt; CS11) | (1 &amp;lt;&amp;lt; CS10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
    position = TCNT1;&lt;br /&gt;
&lt;br /&gt;
    if (position &amp;lt; POS_RALENTI)&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = DUTY_MAX;   // 100 %&lt;br /&gt;
    }&lt;br /&gt;
    else if (position &amp;lt; POS_STOP)&lt;br /&gt;
    {&lt;br /&gt;
        uint16_t x = position - POS_RALENTI;&lt;br /&gt;
&lt;br /&gt;
        OCR2B = DUTY_MAX -&lt;br /&gt;
                ((uint32_t)x * (DUTY_MAX - DUTY_MIN)) /&lt;br /&gt;
                (POS_STOP - POS_RALENTI);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        OCR2B = 0;          // arrêt moteur&lt;br /&gt;
&lt;br /&gt;
        TCCR1B = 0x00;      // stop compteur Timer1&lt;br /&gt;
        TIMSK1 = 0x00;      // désactive interruption&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    OCR1A = TCNT1 + 1;      // prochaine impulsion&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
    timer2_pwm_init();&lt;br /&gt;
    timer1_counter_init();&lt;br /&gt;
&lt;br /&gt;
    sei();&lt;br /&gt;
&lt;br /&gt;
    while (1)&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20965</id>
		<title>Cours:InfoS2 positionnementMoteur corrige</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS2_positionnementMoteur_corrige&amp;diff=20965"/>
				<updated>2026-05-06T06:26:44Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : Page créée avec « &amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;  &amp;lt;source lang=cpp&amp;gt;  void timer2_pwm_init_1kHz_50(void) {     // OC2B = PD3 = Arduino D3 en sortie     DDRD |= (1 &amp;lt;&amp;lt; PD3);      //... »&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void timer2_pwm_init_1kHz_50(void)&lt;br /&gt;
{&lt;br /&gt;
    // OC2B = PD3 = Arduino D3 en sortie&lt;br /&gt;
    DDRD |= (1 &amp;lt;&amp;lt; PD3);&lt;br /&gt;
&lt;br /&gt;
    // Mode Fast PWM avec TOP = OCR2A&lt;br /&gt;
    // OC2B non-inversé&lt;br /&gt;
    TCCR2A = (1 &amp;lt;&amp;lt; COM2B1) | (1 &amp;lt;&amp;lt; WGM21) | (1 &amp;lt;&amp;lt; WGM20);&lt;br /&gt;
    TCCR2B = (1 &amp;lt;&amp;lt; WGM22) | (1 &amp;lt;&amp;lt; CS22);  // prescaler = 64&lt;br /&gt;
&lt;br /&gt;
    TCNT2 = 0;&lt;br /&gt;
&lt;br /&gt;
    OCR2A = 249;   // TOP → 1 kHz&lt;br /&gt;
    OCR2B = 125;   // 50 % duty&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_ampliAudio&amp;diff=20879</id>
		<title>Cours:TPS 2103 tp ampliAudio</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_ampliAudio&amp;diff=20879"/>
				<updated>2026-03-10T12:19:56Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Configuration de la PLL de l'atmega32u4 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;{{Rouge|!! Attention, utiliser un programmateur AVR avec les cartes leonardo !!!}}&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_ampliAudio_Corrige|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Matériel}}=&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons :&lt;br /&gt;
*1 carte arduino Leonardo ([https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdf#page=414 ATmega32U4])&lt;br /&gt;
*1 plaque à essais&lt;br /&gt;
*1 résistance 39k&lt;br /&gt;
*3 condensateur&lt;br /&gt;
**1n&lt;br /&gt;
**10n&lt;br /&gt;
**100n&lt;br /&gt;
*fils M-M&lt;br /&gt;
*1 oscilloscope&lt;br /&gt;
*1 sonde de tension&lt;br /&gt;
*1 ampli audio&lt;br /&gt;
&lt;br /&gt;
=PWM du TIMER4 d'un atmega32u4=&lt;br /&gt;
&lt;br /&gt;
==Configuration de la PLL de l'atmega32u4==&lt;br /&gt;
&lt;br /&gt;
La gestion de l'horloge de l'atmega32u4 est plus complexe que les µcontroleurs que nous utilisons habituellement.&lt;br /&gt;
&lt;br /&gt;
La fréquence d'horloge du CPU est ici de 16MHz.&lt;br /&gt;
&lt;br /&gt;
Cependant, il existe dans le µcontrôleur différentes horloges dont les fréquences sont gérées par un module PLL (Phase-Locked Loop) boucle à verrouillage de phase.&lt;br /&gt;
&lt;br /&gt;
Ceci est documenté dans les pages 27 à 42 de la datasheet officielle.&lt;br /&gt;
&lt;br /&gt;
Nous ne nous intéresserons pas à cette partie, on utilisera juste le code suivant qui permettra d'avoir une fréquence de {{Rouge|64MHz}} pour l'horloge du Timer4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
PLLCSR |= (1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PINDIV);&lt;br /&gt;
PLLFRQ =0;&lt;br /&gt;
PLLFRQ |= (1&amp;lt;&amp;lt;PDIV3)|(1&amp;lt;&amp;lt;PDIV1)|(1&amp;lt;&amp;lt;PLLTM1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mode PWM Timer4==&lt;br /&gt;
&lt;br /&gt;
On va utiliser la sortie OC4A sur la broche PC7. Cela correspond dans la numérotation arduino à la broche n°13 de la carte.&lt;br /&gt;
&lt;br /&gt;
Il est à noter qu'une led est déjà connectée sur cette broche : c'est une led orange sérigraphiée L sur la carte arduino Leonardo.&lt;br /&gt;
&lt;br /&gt;
===PWM rapide sur broche OC4A===&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compléter votre programme en configurant le registre TCCR4A afin de :}}&lt;br /&gt;
* activer le mode PWM sur la sortie OC4A (bit PWM4A)&lt;br /&gt;
* faire en sorte que la sortie soit à l'état 1 tant que la valeur du timer est inférieure à la valeur de comparaison (bits COM4xx)&lt;br /&gt;
&lt;br /&gt;
===Prédiviseur===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir la fréquence de MLI la plus grand possible.&lt;br /&gt;
&lt;br /&gt;
{{Todo|Choisir le prédiviseur le plus adapté (p168) et modifier en conséquence votre programme}}&lt;br /&gt;
&lt;br /&gt;
==Fréquence de la MLI==&lt;br /&gt;
&lt;br /&gt;
La fréquence de la MLI dépend bien évidemment de la fréquence de l'horloge du Timer (64MHz ici) de la valeur du prédiviseur (définie précédemment) mais également de la valeur maximum que peut prendre le compteur du TIMER (cf p.153 Fast PWM mode)&lt;br /&gt;
&lt;br /&gt;
Comme détaillé dans le tableau 15-18 p171, la valeur maximum du Timer (notée TOP) doit être définie dans le registre OCR4C.&lt;br /&gt;
&lt;br /&gt;
{{Todo|Calculer la valeur de OCR4C (rappel valeur maximum 255) pour obtenir une fréquence de MLI de 250kHz.}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Modifier le programme}}&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&lt;br /&gt;
{{Question|Vérifier le fonctionnement du mode PWM :}}&lt;br /&gt;
*Il faudra utiliser un oscilloscope !&lt;br /&gt;
*Incrémenter le rapport cyclique toutes les 500µs par exemple&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Génération de signal et MLI=&lt;br /&gt;
&lt;br /&gt;
==Filtrage==&lt;br /&gt;
&lt;br /&gt;
On souhaite mettre en place un filtre passe bas passif du 1er ordre dont la fréquence de coupure sera de l'ordre de 4kHz (beaucoup plus petite que la fréquence de la mli).&lt;br /&gt;
&lt;br /&gt;
La résistance utilisée aura pour valeur 39k.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir le condensateur adapté, câbler sur plaque à essais, et visualiser le signal après filtrage en conservant le programme précédent.}}&lt;br /&gt;
&lt;br /&gt;
==Sinusoïde==&lt;br /&gt;
&lt;br /&gt;
On souhaite désormais générer un signal sinusoïdal.&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de faire varier le rapport cyclique régulièrement de sorte à ce que le signal filtré soit de forme sinusoïdal.&lt;br /&gt;
&lt;br /&gt;
{{Todo|On va utiliser un tableur pour calculer les valeurs successives du rapport cyclique (donc de OCR4A) :}}&lt;br /&gt;
*Faire une colonne pour les valeur d'angle variant de 0° à 350° tous les 10°&lt;br /&gt;
*Calculer alors {{Rouge|Amplitude x sin(angle) + offset}}&lt;br /&gt;
**la valeur doit être entre 0 et 255 ( valeur de OCR4A)&lt;br /&gt;
**la sinusoïde tracée sur le tableur doit avoir une amplitude maximale ( entre 0 et 255)&lt;br /&gt;
**l'offset permet d'avoir une valeur toujours positive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre programme en :}}&lt;br /&gt;
*déclarant un tableau contenant les valeurs précalculées dans le tableur&lt;br /&gt;
*modifiant le rapport cyclique toutes les 500µs grâce au tableau&lt;br /&gt;
&lt;br /&gt;
{{Todo|Vérifier que vous obtenez bien une sinusoïde après filtrage}}&lt;br /&gt;
&lt;br /&gt;
=Suppression du &amp;quot;delay&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
On souhaite utiliser un Timer pour modifier régulièrement la valeur du rapport cyclique. Le principe sera le suivant :&lt;br /&gt;
&lt;br /&gt;
*On utilise le Timer1 (16 bits)&lt;br /&gt;
*On place le timer en mode CTC (datasheet p133)&lt;br /&gt;
*On prendre la valeur 1 comme prédiviseur (datasheet p134)&lt;br /&gt;
*Choisir la valeur de OCR1A pour avoir une sinusoïde à 440&lt;br /&gt;
*On autorise l'interruption de comparaison OCIE1A (p137)&lt;br /&gt;
*La routine d'interruption sera de la forme suivante :&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  // déclarer une variable static sur 8 bits qui sera la valeur d'angle (entre 0 et 35)&lt;br /&gt;
  ...&lt;br /&gt;
  // changer la valeur du rapport cyclique en utilisant le tableau&lt;br /&gt;
  OCR4A = ...;&lt;br /&gt;
  // incrémenter la valeur de l'angle, en ne dépassant pas 35 !&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez utiliser ce fichier :&lt;br /&gt;
&lt;br /&gt;
 *** [[Media:CalculTimer.ods|{{Rouge|feuille de calcul pour les TIMERS}}]] ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications et valider le fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Modification du volume=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez éventuellement modifier le volume en modifiant l'amplitude du signal.&lt;br /&gt;
&lt;br /&gt;
On utilise une entrée analogique qui servira à modifier les valeurs du rapport cyclique.&lt;br /&gt;
&lt;br /&gt;
=Musique !=&lt;br /&gt;
&lt;br /&gt;
La musique suivante est encodée à une fréquence d'échantillonnage de 40kHz.&lt;br /&gt;
&lt;br /&gt;
Le tableau est déclaré dans la mémoire programme en utilisant le mot clé [https://www.arduino.cc/reference/en/language/variables/utilities/progmem/ PROGMEM].&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme qui joue en boucle cette musique}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Constatez l'espace mémoire disponible lors de la compilation}}&lt;br /&gt;
&lt;br /&gt;
Rque :&lt;br /&gt;
*Vous pour utiliser le logiciel [http://highlowtech.org/?p=1963  EncodeAudio] pour créer un tableau de valeur.&lt;br /&gt;
** dans un terminal : /usr/local/bin/EncodeAudio-linux/EncodeAudio&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
const uint8_t musique[] PROGMEM=&lt;br /&gt;
{125, 124, 126, 126, 128, 128, 130, 129, 130, 130, 131, 129, 130, 128, 129, 128, 126, 125, 125, 123, 124, 122, 123, 122, 124, 123, 125, 125, 126, 128, 128, 130, 131, 130, 131, 131, 130, 131, 129, 129, 126, 126, 124, 125, 123, 123, 122, 123, 123, 122, 124, 123, 125, 125, 128, 128, 130, 131, 131, 132, 131, 132, 130, 131, 130, 128, 128, 125, 124, 123, 122, 122, 121, 122, 121, 123, 122, 125, 125, 128, 128, 131, 132, 132, 133, 132, 133, 133, 131, 131, 129, 128, 126, 123, 123, 121, 119, 119, 118, 119, 121, 122, 123, 125, 126, 129, 131, 133, 133, 136, 137, 136, 137, 134, 132, 132, 129, 126, 124, 121, 119, 116, 116, 115, 116, 115, 118, 119, 123, 125, 130, 132, 138, 139, 144, 145, 147, 147, 147, 145, 141, 138, 132, 128, 121, 116, 110, 103, 99, 95, 92, 91, 89, 92, 93, 99, 103, 110, 117, 126, 133, 144, 151, 160, 164, 171, 176, 178, 179, 179, 177, 174, 170, 162, 157, 148, 142, 133, 126, 118, 113, 106, 101, 95, 93, 89, 88, 87, 88, 87, 89, 91, 91, 94, 95, 96, 100, 100, 102, 104, 104, 108, 109, 109, 113, 114, 117, 119, 121, 124, 126, 130, 133, 134, 138, 140, 140, 142, 142, 145, 145, 145, 144, 144, 142, 142, 142, 140, 141, 140, 141, 141, 144, 145, 146, 147, 149, 151, 152, 154, 154, 155, 154, 155, 153, 152, 149, 146, 145, 140, 138, 134, 131, 128, 123, 122, 118, 118, 116, 116, 116, 115, 116, 117, 118, 117, 119, 118, 119, 118, 116, 116, 113, 111, 108, 106, 101, 99, 95, 93, 89, 89, 87, 87, 86, 88, 89, 93, 95, 100, 103, 107, 113, 115, 121, 123, 128, 130, 133, 136, 136, 137, 137, 138, 137, 136, 137, 134, 136, 136, 134, 137, 138, 138, 141, 144, 145, 148, 152, 154, 157, 160, 163, 164, 167, 167, 169, 168, 168, 167, 166, 162, 161, 157, 155, 152, 148, 146, 141, 140, 138, 134, 133, 131, 130, 128, 126, 124, 124, 122, 122, 119, 119, 117, 116, 114, 113, 109, 108, 104, 103, 99, 98, 94, 93, 91, 88, 87, 85, 85, 85, 84, 85, 85, 85, 86, 87, 89, 91, 92, 93, 95, 96, 99, 100, 102, 102, 104, 106, 106, 108, 108, 110, 111, 110, 113, 114, 116, 116, 119, 122, 124, 125, 130, 132, 137, 140, 144, 147, 152, 154, 159, 162, 166, 169, 171, 175, 176, 179, 179, 182, 182, 184, 183, 183, 184, 183, 183, 182, 179, 178, 176, 175, 171, 170, 167, 163, 160, 156, 151, 147, 141, 138, 132, 129, 123, 118, 113, 109, 104, 102, 98, 95, 93, 89, 89, 88, 86, 87, 86, 87, 86, 87, 87, 88, 87, 88, 87, 88, 87, 86, 86, 85, 84, 84, 81, 83, 83, 81, 83, 84, 84, 87, 88, 92, 95, 99, 101, 106, 108, 113, 117, 119, 124, 126, 130, 133, 134, 138, 139, 142, 144, 146, 146, 149, 149, 153, 154, 157, 157, 161, 162, 166, 167, 170, 172, 174, 176, 177, 177, 179, 178, 179, 178, 178, 177, 175, 175, 171, 171, 169, 166, 164, 161, 160, 156, 155, 153, 151, 148, 146, 144, 139, 137, 133, 131, 126, 123, 118, 115, 109, 107, 101, 99, 93, 91, 86, 85, 80, 79, 77, 77, 76, 73, 74, 74, 73, 74, 74, 76, 76, 78, 78, 79, 80, 80, 83, 83, 84, 84, 87, 88, 88, 92, 93, 96, 98, 102, 104, 109, 111, 116, 119, 124, 128, 133, 136, 141, 145, 147, 152, 154, 159, 161, 163, 167, 167, 170, 171, 174, 174, 176, 177, 177, 178, 178, 179, 179, 178, 179, 178, 179, 177, 177, 175, 175, 174, 171, 170, 167, 167, 164, 161, 160, 156, 154, 151, 149, 145, 144, 140, 137, 134, 130, 129, 125, 121, 118, 113, 110, 106, 102, 99, 94, 91, 86, 84, 80, 76, 73, 70, 69, 66, 63, 63, 61, 61, 61, 59, 62, 61, 64, 65, 66, 70, 72, 74, 78, 81, 84, 88, 91, 95, 99, 103, 106, 110, 113, 117, 119, 124, 125, 130, 132, 136, 139, 140, 145, 147, 151, 154, 156, 160, 163, 167, 170, 171, 176, 178, 182, 183, 186, 186, 190, 189, 191, 190, 191, 191, 190, 187, 186, 184, 182, 179, 177, 174, 171, 167, 166, 161, 160, 156, 153, 151, 146, 145, 140, 138, 133, 131, 126, 124, 118, 115, 111, 106, 103, 99, 93, 91, 85, 83, 78, 77, 72, 71, 70, 68, 66, 64, 65, 64, 63, 64, 64, 65, 66, 68, 66, 69, 69, 72, 72, 74, 77, 79, 80, 85, 86, 91, 94, 98, 103, 107, 113, 116, 122, 126, 131, 137, 140, 145, 149, 152, 156, 159, 163, 164, 168, 170, 171, 175, 175, 178, 178, 182, 182, 185, 185, 187, 189, 189, 191, 190, 192, 190, 191, 189, 189, 186, 183, 181, 176, 174, 169, 166, 162, 156, 154, 149, 145, 141, 138, 133, 131, 128, 125, 122, 119, 115, 113, 109, 107, 102, 100, 95, 92, 88, 84, 80, 77, 72, 69, 66, 63, 62, 58, 58, 58, 58, 58, 59, 61, 63, 64, 68, 69, 72, 74, 77, 80, 81, 85, 86, 87, 91, 92, 95, 98, 99, 102, 104, 109, 111, 117, 121, 126, 131, 137, 142, 147, 154, 159, 164, 169, 172, 178, 181, 184, 185, 189, 189, 191, 190, 191, 191, 190, 191, 190, 190, 190, 189, 187, 189, 186, 187, 185, 184, 184, 182, 181, 177, 175, 171, 169, 164, 159, 155, 151, 146, 139, 136, 129, 125, 121, 116, 110, 108, 103, 101, 96, 95, 93, 88, 87, 84, 83, 80, 77, 73, 72, 68, 66, 64, 61, 59, 56, 56, 54, 54, 53, 55, 54, 57, 59, 62, 64, 69, 71, 77, 80, 85, 88, 94, 96, 101, 107, 109, 114, 116, 122, 125, 128, 132, 134, 139, 144, 147, 152, 155, 159, 164, 168, 171, 176, 179, 184, 185, 190, 191, 193, 194, 194, 196, 194, 196, 193, 193, 191, 191, 189, 187, 185, 184, 182, 181, 178, 176, 175, 171, 170, 167, 164, 160, 157, 154, 148, 145, 139, 134, 129, 122, 117, 110, 106, 99, 95, 88, 85, 80, 78, 74, 71, 70, 66, 66, 65, 63, 64, 63, 64, 62, 63, 63, 62, 63, 62, 63, 63, 64, 63, 65, 65, 68, 69, 72, 73, 78, 80, 85, 89, 93, 99, 102, 109, 113, 119, 124, 130, 134, 138, 144, 147, 152, 155, 160, 162, 167, 168, 172, 174, 178, 179, 183, 184, 189, 189, 192, 193, 196, 196, 198, 198, 199, 199, 198, 196, 196, 193, 192, 189, 186, 183, 181, 176, 174, 169, 167, 163, 157, 155, 152, 147, 144, 139, 136, 131, 128, 123, 119, 115, 110, 103, 100, 94, 91, 85, 81, 77, 71, 69, 64, 62, 59, 56, 56, 54, 53, 54, 53, 54, 54, 56, 56, 59, 59, 63, 65, 68, 70, 72, 73, 77, 79, 80, 85, 86, 91, 92, 96, 100, 103, 108, 111, 117, 121, 128, 132, 138, 142, 147, 153, 159, 163, 168, 172, 176, 179, 183, 185, 189, 190, 192, 194, 194, 196, 197, 196, 197, 197, 196, 196, 194, 194, 192, 192, 190, 189, 186, 185, 182, 181, 177, 176, 171, 169, 166, 160, 157, 153, 147, 144, 137, 133, 128, 123, 117, 111, 108, 101, 98, 92, 88, 83, 80, 74, 72, 70, 66, 64, 62, 58, 58, 57, 56, 56, 54, 55, 54, 56, 56, 58, 58, 61, 62, 64, 65, 70, 71, 74, 77, 81, 83, 87, 91, 95, 98, 102, 106, 110, 114, 118, 122, 128, 131, 136, 140, 144, 149, 154, 157, 162, 166, 171, 174, 178, 182, 185, 189, 190, 193, 194, 197, 198, 198, 199, 199, 198, 199, 197, 197, 194, 192, 191, 187, 186, 184, 179, 178, 175, 171, 169, 166, 161, 159, 154, 152, 147, 145, 140, 136, 132, 126, 123, 118, 114, 108, 104, 99, 95, 91, 85, 83, 78, 73, 71, 66, 65, 63, 59, 58, 56, 56, 55, 56, 56, 56, 57, 57, 59, 61, 62, 65, 65, 69, 71, 73, 77, 78, 83, 85, 88, 91, 95, 98, 102, 106, 110, 113, 118, 121, 126, 131, 134, 139, 142, 148, 152, 156, 160, 164, 168, 172, 176, 178, 182, 184, 187, 190, 190, 193, 194, 193, 196, 194, 196, 194, 193, 193, 191, 190, 187, 186, 183, 182, 178, 176, 172, 170, 167, 164, 160, 157, 153, 151, 146, 144, 138, 136, 131, 126, 123, 118, 113, 110, 104, 101, 98, 92, 89, 85, 83, 78, 76, 73, 71, 68, 68, 64, 64, 63, 63, 62, 63, 62, 63, 63, 65, 65, 68, 68, 70, 71, 73, 76, 77, 80, 84, 86, 88, 92, 94, 100, 102, 107, 110, 115, 118, 124, 126, 132, 136, 140, 144, 149, 153, 156, 161, 163, 168, 170, 172, 176, 177, 181, 182, 185, 185, 187, 187, 190, 189, 191, 190, 190, 190, 189, 186, 186, 183, 183, 179, 177, 176, 172, 169, 167, 162, 160, 155, 153, 148, 146, 142, 137, 134, 130, 128, 122, 119, 116, 111, 108, 103, 101, 98, 93, 91, 86, 84, 81, 78, 77, 74, 71, 71, 69, 69, 66, 68, 66, 68, 69, 69, 70, 71, 72, 74, 76, 78, 79, 81, 84, 85, 87, 89, 92, 95, 96, 101, 102, 107, 110, 113, 117, 119, 124, 129, 131, 137, 139, 144, 147, 152, 155, 160, 163, 166, 169, 172, 174, 177, 178, 181, 183, 183, 185, 185, 186, 185, 186, 186, 186, 185, 183, 183, 181, 181, 177, 176, 172, 171, 168, 167, 163, 159, 156, 153, 151, 146, 144, 138, 136, 132, 128, 125, 121, 118, 115, 110, 108, 103, 101, 96, 94, 89, 88, 84, 83, 80, 77, 76, 72, 72, 71, 69, 70, 69, 70, 70, 69, 71, 71, 73, 76, 76, 79, 79, 83, 84, 87, 89, 92, 93, 96, 98, 101, 102, 106, 109, 110, 115, 117, 122, 125, 129, 131, 137, 139, 145, 147, 152, 155, 160, 162, 166, 168, 171, 172, 176, 176, 179, 179, 181, 181, 182, 182, 181, 182, 179, 181, 178, 179, 177, 177, 176, 174, 174, 170, 170, 168, 164, 163, 160, 157, 154, 152, 148, 142, 140, 136, 132, 129, 123, 121, 117, 111, 109, 104, 102, 99, 96, 93, 91, 87, 86, 84, 83, 79, 79, 78, 76, 76, 73, 73, 72, 73, 73, 73, 73, 73, 76, 77, 77, 79, 80, 84, 86, 87, 91, 93, 96, 100, 101, 106, 107, 111, 113, 117, 118, 122, 125, 128, 131, 133, 136, 140, 142, 146, 148, 153, 156, 159, 161, 166, 167, 170, 172, 174, 177, 177, 179, 179, 181, 181, 181, 181, 178, 179, 177, 176, 175, 172, 171, 169, 168, 164, 162, 162, 159, 157, 155, 152, 151, 146, 145, 140, 139, 134, 132, 128, 125, 119, 117, 113, 110, 107, 102, 100, 95, 93, 89, 88, 85, 84, 80, 80, 78, 78, 77, 77, 77, 76, 77, 77, 78, 77, 79, 79, 80, 80, 83, 85, 85, 87, 89, 91, 94, 95, 99, 100, 104, 106, 110, 113, 115, 119, 122, 126, 129, 131, 136, 137, 141, 144, 146, 149, 151, 155, 157, 159, 162, 164, 166, 168, 168, 171, 171, 174, 174, 176, 176, 177, 176, 177, 176, 176, 174, 174, 172, 171, 169, 168, 164, 163, 160, 157, 155, 152, 149, 146, 145, 141, 138, 136, 133, 129, 128, 123, 121, 117, 115, 113, 108, 106, 102, 101, 98, 94, 93, 89, 88, 85, 84, 81, 81, 79, 79, 79, 77, 78, 77, 79, 78, 80, 80, 83, 83, 85, 85, 87, 88, 89, 93, 94, 98, 99, 102, 104, 106, 109, 111, 115, 117, 122, 123, 128, 131, 134, 138, 140, 144, 147, 149, 153, 155, 159, 161, 162, 166, 167, 169, 169, 171, 172, 171, 174, 174, 172, 174, 172, 172, 172, 170, 170, 169, 167, 167, 164, 164, 161, 161, 159, 155, 154, 151, 149, 146, 145, 142, 138, 137, 133, 131, 128, 124, 122, 118, 116, 113, 110, 107, 103, 102, 99, 96, 93, 92, 89, 88, 85, 85, 83, 83, 80, 81, 81, 80, 81, 80, 81, 81, 84, 85, 85, 87, 87, 91, 91, 94, 95, 98, 100, 101, 104, 106, 109, 111, 113, 116, 117, 122, 123, 126, 130, 132, 133, 138, 139, 142, 146, 148, 149, 153, 154, 157, 159, 162, 163, 166, 167, 168, 169, 170, 170, 171, 170, 171, 170, 169, 170, 168, 169, 167, 167, 164, 163, 161, 161, 157, 157, 155, 152, 151, 147, 146, 142, 141, 139, 134, 133, 130, 128, 124, 122, 119, 115, 114, 109, 108, 104, 103, 100, 96, 96, 93, 92, 89, 88, 86, 86, 84, 84, 83, 83, 83, 81, 83, 84, 83, 85, 84, 86, 87, 88, 91, 91, 94, 94, 98, 99, 102, 104, 106, 109, 110, 114, 116, 118, 122, 124, 126, 130, 132, 134, 138, 140, 142, 145, 147, 149, 152, 154, 156, 159, 161, 162, 162, 166, 166, 168, 168, 168, 170, 170, 170, 169, 170, 169, 169, 167, 168, 166, 163, 163, 161, 160, 157, 156, 153, 152, 148, 147, 144, 142, 138, 137, 133, 131, 129, 125, 123, 119, 118, 115, 113, 110, 108, 106, 102, 101, 98, 96, 94, 93, 91, 89, 87, 87, 86, 86, 85, 84, 85, 84, 85, 85, 86, 86, 88, 88, 91, 92, 94, 95, 95, 99, 99, 101, 104, 104, 108, 109, 113, 115, 116, 119, 121, 124, 125, 130, 132, 133, 138, 139, 142, 146, 147, 151, 153, 154, 157, 159, 161, 163, 164, 164, 167, 168, 168, 168, 167, 168, 167, 168, 166, 167, 166, 163, 163, 161, 161, 159, 159, 156, 155, 154, 152, 149, 148, 146, 145, 141, 140, 138, 134, 132, 130, 126, 124, 121, 119, 116, 113, 111, 107, 106, 103, 100, 99, 96, 94, 93, 91, 91, 88, 88, 87, 87, 86, 86, 85, 86, 85, 87, 87, 87, 88, 88, 91, 91, 93, 93, 96, 98, 100, 100, 103, 104, 108, 109, 113, 114, 118, 121, 122, 125, 126, 131, 133, 134, 138, 139, 144, 145, 148, 151, 152, 154, 156, 157, 160, 161, 163, 164, 164, 167, 166, 168, 167, 168, 167, 167, 166, 166, 163, 163, 161, 161, 159, 157, 155, 154, 152, 151, 148, 147, 145, 144, 140, 139, 137, 136, 132, 132, 129, 128, 125, 122, 121, 117, 116, 113, 109, 108, 104, 103, 101, 98, 96, 93, 92, 91, 88, 88, 86, 86, 85, 86, 85, 86, 85, 87, 87, 88, 88, 91, 91, 94, 94, 96, 99, 99, 102, 103, 104, 108, 110, 113, 115, 117, 118, 122, 123, 126, 129, 132, 133, 138, 139, 142, 145, 146, 149, 151, 154, 154, 157, 157, 160, 160, 162, 163, 162, 164, 164, 163, 164, 164, 163, 164, 163, 163, 162, 162, 160, 161, 159, 159, 155, 155, 154, 151, 149, 147, 146, 144, 139, 138, 134, 133, 129, 128, 123, 122, 119, 116, 113, 111, 108, 107, 104, 102, 101, 99, 99, 96, 94, 94, 93, 93, 91, 92, 91, 89, 91, 89, 91, 89, 91, 91, 92, 92, 94, 93, 95, 95, 98, 100, 100, 102, 104, 106, 108, 109, 113, 115, 115, 118, 119, 123, 124, 128, 130, 131, 134, 136, 140, 141, 145, 145, 148, 149, 153, 155, 155, 159, 159, 161, 161, 163, 164, 164, 164, 166, 164, 164, 164, 164, 163, 161, 161, 160, 159, 157, 155, 155, 153, 152, 151, 147, 147, 144, 144, 141, 139, 137, 136, 132, 131, 129, 125, 123, 119, 118, 116, 111, 110, 108, 106, 103, 100, 99, 96, 95, 93, 91, 91, 89, 89, 88, 89, 88, 89, 89, 91, 91, 92, 93, 93, 94, 95, 96, 96, 99, 99, 102, 103, 103, 107, 108, 109, 111, 113, 116, 118, 119, 123, 124, 128, 130, 131, 136, 137, 140, 142, 144, 147, 148, 152, 153, 155, 157, 157, 160, 160, 162, 163, 164, 163, 164, 163, 164, 164, 163, 163, 162, 162, 160, 160, 157, 157, 155, 153, 153, 149, 148, 147, 144, 142, 140, 139, 136, 134, 132, 129, 129, 125, 123, 122, 118, 117, 114, 114, 110, 109, 107, 106, 102, 102, 99, 99, 96, 95, 93, 94, 92, 92, 92, 89, 91, 89, 91, 91, 92, 93, 92, 94, 94, 96, 96, 99, 99, 102, 102, 104, 106, 108, 109, 111, 113, 116, 117, 119, 122, 124, 125, 129, 130, 133, 134, 138, 140, 141, 145, 146, 149, 151, 153, 154, 156, 157, 160, 161, 160, 162, 162, 163, 162, 163, 162, 163, 162, 162, 161, 161, 159, 159, 156, 156, 154, 154, 152, 151, 148, 147, 144, 144, 141, 138, 137, 133, 132, 130, 126, 125, 122, 121, 117, 116, 113, 111, 108, 108, 104, 103, 102, 99, 99, 98, 95, 95, 93, 92, 93, 91, 92, 91, 92, 91, 91, 92, 92, 93, 93, 94, 96, 96, 99, 100, 100, 103, 104, 104, 108, 109, 111, 113, 116, 117, 118, 122, 123, 126, 128, 131, 132, 136, 137, 140, 141, 145, 147, 147, 151, 153, 154, 154, 157, 157, 160, 160, 160, 161, 162, 162, 162, 161, 162, 160, 161, 160, 159, 159, 157, 156, 155, 154, 153, 151, 151, 148, 147, 145, 144, 141, 140, 139, 137, 133, 132, 129, 128, 124, 123, 119, 118, 115, 113, 111, 108, 107, 103, 103, 100, 99, 96, 96, 95, 93, 93, 91, 92, 89, 91, 91, 89, 92, 92, 92, 94, 94, 96, 96, 99, 99, 101, 102, 104, 104, 108, 108, 110, 113, 113, 116, 116, 119, 121, 123, 123, 126, 129, 131, 132, 133, 137, 139, 141, 144, 145, 147, 149, 152, 153, 155, 155, 157, 157, 160, 161, 161, 162, 162, 161, 162, 161, 161, 159, 160, 157, 157, 155, 156, 154, 152, 152, 151, 148, 147, 146, 144, 142, 140, 139, 136, 134, 132, 131, 128, 126, 123, 122, 119, 116, 115, 111, 111, 109, 106, 106, 102, 102, 99, 99, 96, 96, 94, 95, 93, 93, 93, 92, 93, 93, 92, 93, 93, 94, 94, 96, 98, 99, 100, 101, 102, 102, 106, 106, 109, 109, 113, 113, 116, 117, 119, 121, 123, 126, 128, 129, 132, 133, 136, 138, 139, 142, 144, 146, 147, 149, 152, 152, 155, 155, 157, 157, 160, 159, 161, 160, 161, 161, 160, 161, 160, 160, 159, 159, 157, 156, 154, 154, 153, 151, 151, 148, 147, 146, 144, 142, 140, 137, 137, 134, 131, 130, 126, 125, 122, 121, 117, 116, 113, 111, 109, 108, 104, 104, 101, 101, 99, 99, 96, 96, 95, 94, 94, 93, 94, 93, 92, 93, 93, 94, 93, 95, 95, 95, 98, 98, 100, 101, 102, 103, 106, 107, 109, 110, 113, 114, 117, 117, 121, 122, 125, 128, 129, 132, 133, 136, 138, 140, 141, 144, 145, 147, 148, 151, 152, 154, 154, 156, 156, 159, 159, 160, 160, 161, 161, 161, 160, 161, 160, 160, 157, 159, 156, 156, 154, 154, 152, 151, 148, 148, 145, 145, 142, 141, 139, 137, 136, 132, 131, 130, 126, 125, 122, 121, 116, 115, 111, 110, 108, 104, 103, 101, 100, 96, 96, 95, 93, 93, 92, 92, 91, 92, 92, 91, 92, 92, 93, 93, 95, 95, 96, 98, 98, 100, 102, 102, 104, 106, 107, 109, 110, 113, 114, 116, 117, 121, 122, 125, 126, 130, 132, 133, 137, 138, 140, 142, 144, 147, 148, 151, 151, 153, 153, 156, 157, 157, 159, 160, 160, 161, 160, 161, 161, 160, 161, 160, 160, 159, 159, 156, 156, 154, 154, 152, 151, 148, 147, 145, 144, 140, 139, 138, 134, 133, 131, 128, 128, 125, 122, 121, 117, 117, 115, 113, 111, 109, 106, 106, 102, 101, 101, 98, 98, 95, 95, 94, 94, 92, 93, 91, 92, 92, 92, 93, 93, 94, 94, 96, 96, 99, 99, 101, 101, 104, 104, 108, 109, 110, 114, 114, 117, 119, 121, 124, 125, 126, 130, 131, 134, 136, 139, 140, 142, 145, 146, 148, 148, 152, 152, 154, 155, 155, 157, 156, 159, 160, 159, 160, 159, 161, 159, 160, 159, 160, 159, 157, 157, 155, 155, 153, 153, 151, 149, 148, 145, 144, 141, 140, 138, 134, 133, 130, 130, 126, 125, 122, 121, 118, 116, 115, 111, 110, 108, 107, 104, 103, 102, 101, 99, 99, 98, 95, 95, 93, 94, 92, 92, 93, 92, 93, 94, 94, 95, 94, 96, 96, 99, 99, 101, 103, 103, 107, 107, 109, 111, 113, 114, 117, 117, 121, 122, 125, 125, 129, 130, 133, 134, 137, 139, 140, 144, 146, 147, 149, 151, 153, 154, 154, 157, 156, 159, 160, 159, 161, 160, 161, 160, 160, 159, 160, 157, 159, 156, 156, 154, 154, 153, 151, 151, 149, 146, 146, 142, 142, 139, 138, 136, 134, 131, 130, 126, 125, 122, 121, 118, 117, 114, 113, 109, 109, 106, 104, 102, 102, 99, 99, 98, 95, 95, 95, 93, 94, 92, 93, 93, 93, 93, 93, 94, 95, 95, 96, 98, 99, 100, 102, 103, 104, 107, 107, 110, 110, 114, 114, 117, 119, 121, 123, 124, 128, 128, 131, 133, 136, 137, 138, 141, 142, 145, 146, 149, 149, 153, 153, 155, 155, 157, 159, 160, 161, 161, 160, 161, 160, 161, 160, 160, 159, 159, 156, 156, 155, 154, 153, 149, 149, 147, 146, 144, 142, 140, 139, 137, 136, 133, 132, 129, 129, 126, 123, 122, 118, 118, 115, 114, 111, 110, 108, 106, 104, 102, 101, 100, 99, 96, 96, 94, 94, 93, 93, 92, 93, 92, 93, 93, 94, 94, 94, 96, 96, 99, 99, 101, 101, 103, 106, 106, 109, 109, 113, 115, 115, 118, 119, 123, 125, 126, 130, 132, 132, 136, 137, 139, 141, 142, 146, 147, 148, 151, 152, 154, 154, 156, 157, 157, 160, 159, 161, 160, 161, 160, 161, 160, 161, 161, 159, 159, 157, 157, 155, 154, 152, 151, 149, 147, 146, 144, 141, 140, 137, 136, 132, 132, 129, 128, 124, 123, 119, 119, 117, 114, 113, 111, 108, 108, 106, 103, 102, 100, 100, 98, 98, 95, 95, 93, 94, 93, 92, 93, 92, 93, 93, 94, 93, 95, 96, 96, 99, 100, 100, 102, 103, 104, 107, 109, 109, 113, 114, 116, 117, 121, 121, 124, 126, 128, 130, 131, 134, 136, 139, 139, 142, 144, 146, 147, 149, 151, 153, 154, 154, 156, 156, 159, 157, 160, 159, 161, 161, 161, 161, 160, 160, 160, 159, 159, 156, 156, 154, 154, 152, 151, 149, 148, 146, 144, 140, 140, 137, 136, 132, 131, 128, 126, 124, 122, 118, 117, 114, 113, 111, 109, 108, 106, 104, 103, 101, 101, 100, 98, 99, 96, 96, 94, 95, 94, 94, 94, 94, 92, 94, 93, 94, 93, 94, 96, 96, 99, 99, 101, 103, 104, 107, 108, 110, 111, 115, 117, 118, 122, 123, 125, 129, 129, 132, 134, 137, 137, 140, 140, 144, 145, 146, 148, 149, 152, 153, 154, 154, 156, 156, 159, 159, 161, 161, 161, 162, 162, 160, 161, 160, 160, 159, 156, 156, 154, 154, 152, 151, 148, 147, 145, 144, 141, 140, 137, 136, 133, 132, 129, 128, 126, 124, 122, 119, 117, 116, 114, 110, 110, 107, 106, 104, 102, 101, 99, 99, 98, 95, 96, 95, 95, 94, 94, 93, 94, 93, 94, 93, 94, 95, 94, 96, 98, 98, 100, 100, 102, 103, 106, 107, 109, 110, 114, 116, 117, 119, 121, 124, 125, 129, 130, 133, 134, 138, 138, 141, 141, 145, 146, 147, 149, 149, 152, 154, 154, 156, 156, 159, 159, 159, 161, 160, 161, 161, 161, 160, 161, 159, 160, 157, 157, 155, 155, 152, 152, 149, 148, 145, 145, 142, 140, 138, 137, 134, 133, 131, 128, 126, 124, 123, 121, 118, 117, 114, 113, 110, 109, 106, 106, 103, 101, 100, 98, 98, 96, 94, 94, 92, 93, 92, 92, 91, 93, 92, 93, 94, 94, 95, 96, 98, 99, 99, 102, 102, 104, 107, 107, 110, 111, 113, 115, 116, 119, 121, 124, 124, 128, 130, 131, 134, 137, 138, 141, 142, 144, 147, 148, 148, 152, 153, 153, 155, 155, 157, 157, 159, 157, 160, 159, 160, 160, 159, 160, 160, 157, 159, 156, 156, 154, 155, 152, 152, 151, 148, 147, 144, 144, 140, 139, 137, 136, 133, 130, 130, 126, 125, 123, 121, 119, 116, 116, 114, 110, 110, 108, 106, 104, 102, 102, 99, 99, 96, 96, 95, 94, 94, 93, 92, 93, 92, 93, 93, 94, 93, 95, 95, 98, 98, 100, 100, 102, 104, 104, 108, 108, 111, 111, 114, 116, 117, 121, 122, 124, 125, 129, 130, 133, 134, 138, 140, 140, 144, 145, 148, 148, 152, 152, 154, 154, 156, 156, 159, 157, 160, 159, 160, 159, 160, 159, 160, 157, 159, 156, 157, 155, 155, 155, 153, 153, 151, 149, 148, 146, 145, 141, 141, 139, 137, 133, 132, 129, 128, 125, 123, 121, 118, 116, 114, 113, 109, 109, 106, 106, 103, 102, 100, 100, 98, 98, 95, 96, 95, 94, 94, 93, 93, 94, 93, 94, 94, 94, 96, 95, 98, 98, 100, 100, 102, 103, 106, 108, 108, 111, 111, 115, 116, 118, 119, 123, 123, 126, 129, 130, 133, 134, 136, 139, 140, 144, 145, 147, 147, 151, 151, 154, 155, 156, 156, 159, 157, 160, 159, 160, 161, 160, 160, 160, 160, 157, 157, 156, 156, 155, 153, 153, 151, 151, 147, 147, 146, 142, 142, 141, 138, 137, 134, 133, 130, 129, 126, 125, 123, 121, 118, 115, 114, 111, 110, 107, 107, 103, 103, 100, 100, 99, 96, 96, 95, 95, 93, 94, 94, 92, 93, 93, 94, 94, 94, 95, 95, 98, 96, 98, 100, 101, 103, 104, 106, 108, 108, 111, 113, 115, 117, 118, 121, 122, 125, 126, 130, 131, 133, 137, 137, 140, 142, 144, 147, 149, 149, 153, 153, 156, 156, 159, 159, 161, 161, 161, 162, 161, 162, 161, 161, 160, 160, 157, 157, 155, 155, 154, 152, 152, 148, 148, 146, 146, 142, 142, 141, 138, 138, 134, 134, 131, 130, 128, 126, 124, 121, 119, 116, 116, 113, 111, 109, 106, 104, 102, 100, 100, 98, 98, 95, 95, 93, 93, 92, 93, 92, 93, 93, 92, 94, 93, 95, 95, 96, 98, 99, 100, 100, 103, 103, 106, 107, 109, 110, 114, 115, 116, 119, 121, 123, 124, 128, 129, 132, 132, 136, 137, 140, 141, 142, 146, 146, 149, 151, 152, 154, 154, 156, 156, 159, 159, 160, 161, 160, 161, 160, 161, 160, 160, 160, 157, 157, 155, 155, 153, 153, 151, 151, 147, 147, 145, 144, 141, 140, 138, 137, 134, 132, 130, 129, 125, 124, 122, 118, 117, 114, 113, 110, 109, 106, 104, 102, 102, 99, 99, 96, 96, 94, 95, 93, 94, 93, 94, 93, 94, 93, 95, 95, 95, 96, 98, 98, 99, 99, 101, 102, 103, 106, 107, 107, 110, 110, 114, 115, 118, 118, 122, 123, 125, 129, 130, 133, 134, 138, 139, 141, 144, 146, 147, 147, 151, 151, 153, 153, 155, 156, 156, 157, 157, 159, 159, 160, 159, 160, 160, 159, 160, 157, 159, 157, 155, 156, 155, 153, 152, 149, 149, 146, 146, 142, 141, 139, 137, 136, 133, 131, 129, 126, 124, 122, 119, 116, 116, 113, 111, 108, 108, 106, 104, 103, 100, 100, 98, 98, 95, 95, 95, 94, 94, 94, 94, 93, 94, 93, 95, 94, 95, 96, 96, 99, 100, 100, 102, 102, 106, 107, 107, 110, 111, 113, 115, 116, 119, 121, 122, 125, 126, 130, 131, 133, 134, 138, 139, 142, 144, 146, 148, 148, 152, 152, 154, 154, 156, 157, 159, 160, 160, 160, 160, 161, 159, 160, 159, 160, 157, 157, 157, 156, 154, 154, 153, 151, 151, 147, 147, 145, 144, 141, 140, 139, 137, 134, 132, 131, 128, 126, 124, 122, 119, 116, 115, 114, 110, 109, 106, 106, 102, 102, 100, 99, 98, 95, 95, 94, 94, 93, 93, 92, 92, 93, 92, 94, 93, 95, 95, 95, 98, 99, 99, 101, 101, 104, 106, 106, 109, 109, 111, 115, 115, 118, 121, 122, 125, 125, 129, 130, 133, 134, 137, 139, 140, 144, 145, 147, 148, 151, 152, 152, 154, 154, 156, 157, 157, 159, 159, 160, 160, 160, 161, 161, 159, 160, 159, 159, 159, 156, 156, 154, 154, 153, 149, 149, 147, 145, 144, 140, 140, 138, 134, 133, 131, 129, 125, 124, 121, 119, 117, 114, 113, 110, 108, 107, 103, 103, 101, 100, 99, 96, 96, 94, 94, 93, 93, 93, 92, 93, 93, 93, 94, 94, 94, 95, 95, 98, 98, 100, 100, 102, 103, 106, 106, 109, 109, 113, 113, 116, 116, 119, 122, 124, 126, 126, 130, 132, 134, 137, 138, 141, 144, 145, 146, 149, 149, 153, 154, 154, 156, 156, 157, 157, 160, 159, 160, 159, 160, 159, 160, 159, 159, 159, 156, 157, 155, 155, 154, 152, 152, 149, 149, 146, 146, 145, 141, 140, 138, 137, 133, 132, 129, 128, 124, 123, 121, 118, 116, 114, 110, 110, 107, 106, 104, 102, 101, 100, 99, 96, 96, 94, 94, 94, 92, 93, 92, 93, 92, 93, 93, 94, 94, 95, 96, 98, 99, 100, 102, 103, 104, 106, 108, 109, 111, 113, 115, 116, 119, 121, 124, 125, 126, 130, 131, 134, 136, 138, 139, 142, 145, 146, 147, 149, 151, 153, 153, 155, 155, 157, 159, 157, 160, 159, 160, 159, 160, 159, 160, 157, 159, 156, 157, 155, 154, 154, 152, 152, 149, 149, 147, 147, 144, 144, 140, 139, 138, 134, 133, 130, 129, 126, 124, 122, 119, 117, 114, 113, 110, 109, 107, 104, 103, 102, 100, 99, 96, 98, 95, 95, 94, 94, 93, 93, 92, 93, 92, 94, 93, 94, 94, 96, 95, 98, 98, 100, 101, 103, 106, 107, 108, 110, 111, 115, 116, 119, 121, 123, 124, 128, 129, 132, 133, 136, 137, 140, 140, 144, 145, 146, 148, 149, 152, 153, 153, 155, 155, 157, 157, 159, 160, 160, 160, 160, 159, 160, 159, 159, 159, 156, 156, 154, 154, 153, 151, 151, 148, 147, 146, 145, 141, 141, 139, 136, 136, 132, 131, 130, 126, 125, 123, 121, 119, 117, 114, 113, 109, 109, 106, 104, 103, 102, 100, 99, 98, 96, 94, 95, 93, 94, 93, 94, 93, 94, 93, 93, 95, 94, 96, 96, 99, 99, 101, 101, 103, 103, 107, 107, 110, 110, 114, 116, 116, 119, 122, 123, 126, 128, 131, 133, 133, 137, 138, 141, 142, 145, 146, 148, 148, 152, 152, 153, 155, 155, 156, 157, 159, 157, 159, 157, 160, 160, 159, 159, 157, 157, 156, 156, 154, 154, 152, 152, 149, 149, 147, 146, 145, 142, 141, 139, 138, 136, 134, 132, 129, 128, 126, 124, 122, 118, 117, 115, 114, 111, 108, 108, 104, 104, 101, 101, 99, 99, 96, 96, 94, 95, 93, 94, 93, 94, 94, 93, 95, 94, 95, 95, 96, 99, 98, 100, 100, 102, 103, 106, 106, 109, 109, 113, 113, 116, 118, 121, 122, 125, 126, 130, 131, 134, 137, 137, 140, 142, 144, 147, 147, 151, 151, 153, 154, 154, 156, 156, 157, 157, 159, 160, 159, 160, 159, 160, 160, 159, 157, 157, 156, 156, 154, 155, 152, 152, 149, 149, 147, 146, 142, 142, 139, 138, 136, 133, 132, 129, 128, 125, 123, 121, 117, 117, 114, 113, 111, 108, 108, 106, 103, 102, 100, 100, 98, 98, 95, 96, 94, 94, 94, 93, 94, 94, 93, 94, 94, 95, 96, 98, 98, 100, 100, 102, 102, 104, 106, 107, 109, 110, 113, 114, 116, 117, 121, 121, 124, 125, 129, 130, 133, 133, 137, 139, 141, 142, 146, 146, 148, 151, 152, 154, 154, 156, 156, 159, 157, 160, 159, 160, 160, 159, 160, 159, 159, 157, 157, 156, 156, 154, 154, 153, 152, 149, 149, 147, 146, 144, 142, 140, 139, 136, 134, 131, 130, 128, 126, 124, 121, 119, 116, 115, 111, 111, 108, 108, 104, 104, 102, 101, 99, 99, 96, 98, 95, 95, 94, 94, 93, 94, 93, 94, 93, 94, 95, 95, 96, 95, 98, 99, 100, 101, 103, 103, 107, 108, 110, 113, 115, 117, 118, 119, 123, 125, 126, 129, 130, 133, 134, 137, 139, 141, 142, 144, 147, 147, 151, 151, 153, 154, 155, 157, 156, 159, 159, 160, 161, 160, 161, 160, 161, 159, 160, 159, 156, 156, 154, 154, 152, 152, 148, 148, 147, 144, 142, 140, 139, 137, 136, 132, 132, 129, 128, 124, 124, 121, 119, 117, 115, 114, 110, 110, 108, 106, 104, 102, 102, 101, 99, 99, 98, 95, 96, 95, 95, 94, 95, 94, 95, 94, 96, 95, 98, 98, 98, 100, 100, 100, 102, 103, 106, 107, 107, 110, 110, 114, 116, 116, 119, 121, 124, 126, 128, 131, 132, 134, 137, 138, 141, 141, 145, 146, 147, 149, 149, 152, 154, 153, 155, 155, 157, 157, 156, 159, 157, 159, 159, 157, 159, 157, 157, 155, 155, 154, 154, 152, 152, 151, 148, 146, 146, 142, 142, 139, 139, 137, 134, 133, 130, 130, 126, 125, 123, 119, 119, 116, 115, 111, 111, 108, 108, 104, 104, 102, 101, 99, 99, 98, 98, 95, 96, 96, 94, 95, 94, 95, 95, 96, 95, 98, 98, 99, 99, 101, 101, 103, 103, 106, 106, 109, 109, 111, 113, 115, 117, 119, 121, 122, 125, 128, 130, 131, 133, 136, 138, 139, 141, 144, 145, 147, 148, 149, 151, 152, 154, 153, 155, 155, 156, 156, 157, 157, 159, 157, 159, 159, 157, 157, 157, 156, 154, 155, 153, 153, 151, 151, 147, 147, 145, 144, 142, 140, 138, 136, 134, 132, 130, 126, 125, 123, 122, 118, 117, 115, 114, 111, 109, 107, 107, 103, 103, 101, 101, 99, 99, 96, 96, 95, 96, 95, 94, 95, 95, 95, 96, 95, 98, 96, 99, 99, 101, 102, 102, 104, 104, 107, 108, 109, 111, 111, 115, 116, 117, 121, 121, 124, 125, 128, 129, 132, 133, 137, 137, 140, 142, 144, 146, 148, 148, 151, 152, 154, 155, 154, 156, 157, 157, 159, 157, 159, 157, 157, 159, 157, 157, 156, 155, 156, 154, 154, 152, 152, 149, 148, 146, 146, 144, 141, 140, 137, 136, 133, 132, 129, 128, 124, 123, 122, 118, 117, 114, 114, 111, 109, 108, 106, 106, 103, 103, 101, 101, 99, 99, 98, 98, 96, 98, 95, 96, 96, 95, 96, 98, 96, 98, 98, 99, 99, 101, 101, 103, 104, 104, 107, 108, 110, 110, 114, 115, 117, 119, 122, 123, 124, 128, 129, 132, 133, 136, 138, 140, 141, 142, 146, 147, 148, 151, 152, 153, 153, 154, 155, 156, 155, 157, 156, 157, 157, 156, 157, 156, 155, 156, 155, 154, 154, 152, 152, 151, 149, 148, 147, 145, 145, 142, 141, 138, 138, 134, 133, 131, 130, 126, 125, 123, 121, 119, 116, 116, 113, 111, 109, 109, 106, 106, 104, 102, 102, 100, 100, 99, 98, 98, 96, 98, 96, 95, 96, 95, 96, 96, 98, 99, 98, 100, 100, 101, 101, 104, 106, 106, 108, 110, 110, 114, 116, 116, 119, 121, 123, 124, 128, 129, 130, 133, 133, 137, 138, 140, 142, 142, 145, 146, 148, 148, 151, 152, 153, 153, 155, 154, 156, 155, 157, 156, 157, 156, 157, 155, 156, 156, 155, 153, 154, 152, 151, 151, 148, 147, 145, 145, 141, 141, 139, 138, 134, 134, 132, 131, 129, 126, 125, 123, 121, 118, 117, 115, 113, 111, 108, 108, 106, 104, 103, 101, 101, 99, 99, 99, 96, 98, 96, 98, 95, 98, 96, 96, 98, 98, 99, 99, 100, 102, 102, 104, 104, 107, 107, 109, 111, 113, 114, 116, 118, 118, 122, 122, 125, 125, 129, 129, 132, 133, 136, 137, 139, 140, 142, 144, 145, 147, 148, 149, 149, 152, 152, 153, 154, 153, 155, 155, 156, 156, 155, 156, 156, 155, 155, 154, 153, 153, 151, 151, 148, 148, 146, 146, 145, 144, 140, 140, 138, 137, 134, 133, 131, 130, 128, 126, 124, 123, 121, 118, 116, 115, 113, 111, 109, 108, 107, 104, 103, 101, 101, 100, 99, 99, 96, 98, 98, 95, 96, 96, 98, 98, 98, 99, 99, 100, 100, 102, 103, 103, 106, 106, 108, 109, 110, 113, 113, 116, 117, 118, 122, 123, 124, 128, 128, 131, 133, 133, 137, 139, 139, 142, 144, 145, 147, 147, 149, 149, 152, 152, 154, 153, 155, 155, 154, 156, 155, 156, 155, 155, 154, 155, 154, 154, 153, 153, 152, 149, 149, 148, 147, 145, 144, 141, 140, 139, 136, 134, 133, 130, 129, 128, 124, 123, 121, 119, 116, 116, 113, 113, 110, 110, 108, 106, 106, 103, 103, 101, 102, 100, 100, 99, 99, 98, 98, 98, 96, 98, 96, 99, 99, 98, 100, 100, 102, 102, 104, 104, 107, 107, 110, 110, 113, 115, 115, 118, 119, 122, 123, 125, 128, 128, 131, 131, 133, 136, 137, 139, 140, 142, 144, 146, 146, 148, 149, 151, 152, 153, 153, 155, 154, 155, 156, 155, 156, 156, 154, 155, 153, 154, 152, 153, 151, 151, 148, 148, 146, 146, 144, 144, 141, 140, 139, 137, 136, 133, 132, 130, 128, 128, 124, 123, 122, 118, 117, 116, 113, 113, 109, 109, 108, 104, 104, 102, 102, 102, 100, 100, 99, 99, 98, 99, 99, 98, 99, 98, 99, 98, 100, 99, 100, 101, 101, 103, 103, 106, 106, 108, 109, 110, 113, 115, 115, 118, 119, 122, 123, 126, 128, 130, 131, 134, 136, 138, 138, 141, 141, 145, 145, 147, 148, 148, 151, 151, 153, 154, 154, 155, 156, 155, 156, 155, 156, 156, 155, 156, 154, 154, 153, 153, 151, 151, 148, 148, 146, 145, 142, 141, 139, 139, 136, 136, 133, 132, 130, 129, 126, 125, 124, 123, 119, 119, 116, 116, 113, 113, 110, 109, 107, 106, 103, 103, 101, 101, 99, 100, 98, 99, 98, 98, 98, 98, 98, 99, 98, 99, 99, 101, 100, 101, 103, 103, 106, 106, 108, 108, 111, 111, 114, 115, 117, 118, 122, 122, 125, 126, 130, 130, 133, 134, 137, 138, 140, 141, 144, 145, 146, 148, 148, 149, 149, 152, 151, 153, 153, 153, 154, 153, 154, 153, 154, 154, 153, 154, 153, 152, 153, 151, 152, 149, 149, 147, 147, 146, 144, 144, 141, 139, 138, 136, 134, 131, 130, 128, 126, 123, 122, 119, 118, 116, 115, 114, 110, 110, 108, 107, 106, 103, 103, 102, 102, 101, 99, 100, 99, 99, 99, 98, 99, 99, 98, 100, 100, 99, 101, 101, 103, 102, 104, 106, 106, 109, 109, 111, 113, 114, 116, 117, 119, 121, 122, 124, 126, 128, 129, 131, 132, 134, 136, 138, 139, 141, 142, 145, 146, 146, 148, 148, 151, 152, 153, 152, 154, 153, 155, 155, 154, 155, 153, 154, 153, 153, 152, 152, 151, 149, 149, 147, 147, 145, 145, 142, 142, 141, 138, 138, 136, 134, 132, 131, 130, 126, 125, 123, 122, 121, 117, 117, 114, 114, 110, 110, 108, 108, 106, 103, 104, 102, 102, 101, 101, 100, 100, 99, 100, 99, 100, 100, 99, 101, 100, 102, 101, 103, 102, 103, 106, 106, 108, 108, 110, 110, 114, 115, 115, 118, 119, 122, 122, 125, 126, 129, 130, 132, 132, 136, 136, 139, 139, 142, 144, 144, 146, 146, 148, 148, 151, 152, 153, 153, 153, 154, 154, 154, 155, 154, 153, 154, 153, 153, 152, 152, 149, 149, 149, 148, 145, 145, 144, 141, 141, 138, 138, 136, 134, 133, 131, 130, 129, 126, 125, 123, 122, 118, 118, 115, 115, 114, 110, 110, 109, 108, 106, 106, 103, 103, 101, 102, 100, 101, 100, 99, 100, 99, 100, 99, 100, 100, 101, 101, 102, 102, 104, 106, 107, 107, 109, 109, 111, 113, 114, 116, 116, 119, 119, 123, 124, 126, 128, 130, 131, 134, 134, 138, 138, 141, 141, 144, 144, 147, 147, 149, 148, 151, 151, 152, 153, 152, 153, 153, 154, 153, 154, 153, 153, 152, 153, 152, 151, 151, 148, 149, 148, 146, 146, 144, 144, 141, 140, 138, 138, 134, 134, 132, 130, 129, 125, 125, 122, 122, 118, 118, 115, 115, 113, 110, 110, 107, 107, 104, 104, 103, 103, 101, 102, 101, 100, 101, 100, 101, 100, 101, 101, 100, 101, 102, 101, 103, 102, 104, 104, 107, 107, 109, 109, 111, 113, 114, 114, 117, 117, 121, 121, 124, 125, 128, 129, 131, 133, 136, 137, 138, 140, 141, 144, 144, 146, 147, 147, 149, 149, 151, 151, 152, 153, 152, 153, 153, 152, 153, 152, 153, 151, 152, 152, 149, 149, 148, 148, 146, 146, 144, 144, 142, 140, 140, 137, 137, 134, 132, 132, 129, 129, 126, 125, 123, 122, 119, 118, 116, 116, 113, 113, 110, 109, 109, 107, 107, 104, 104, 103, 102, 101, 101, 100, 100, 99, 100, 100, 99, 101, 100, 102, 101, 103, 104, 104, 106, 106, 108, 109, 111, 111, 114, 114, 117, 118, 119, 121, 123, 123, 126, 126, 129, 130, 132, 133, 136, 136, 139, 139, 141, 142, 145, 145, 147, 148, 148, 149, 151, 151, 152, 151, 153, 152, 153, 152, 153, 153, 152, 152, 151, 151, 151, 148, 149, 147, 147, 145, 145, 142, 142, 139, 139, 136, 136, 132, 132, 129, 129, 126, 123, 123, 119, 119, 117, 115, 115, 114, 110, 110, 109, 109, 107, 107, 107, 104, 104, 103, 104, 102, 103, 102, 103, 101, 102, 101, 102, 103, 102, 103, 102, 104, 104, 104, 107, 107, 109, 110, 110, 113, 113, 116, 117, 119, 121, 122, 124, 125, 128, 129, 131, 132, 134, 136, 137, 139, 139, 142, 144, 144, 146, 146, 148, 147, 149, 149, 151, 151, 151, 152, 151, 152, 152, 152, 151, 151, 149, 149, 148, 148, 146, 147, 145, 145, 144, 144, 142, 140, 140, 138, 138, 134, 134, 132, 131, 129, 129, 125, 124, 122, 121, 119, 117, 115, 114, 111, 111, 108, 108, 106, 107, 104, 104, 103, 103, 103, 102, 103, 102, 103, 102, 102, 103, 103, 103, 104, 103, 106, 104, 107, 107, 107, 109, 109, 110, 111, 114, 114, 116, 116, 119, 121, 122, 124, 124, 128, 128, 131, 132, 133, 136, 136, 138, 139, 141, 141, 144, 144, 145, 145, 147, 148, 148, 149, 149, 151, 151, 149, 151, 151, 152, 151, 149, 151, 151, 151, 149, 148, 148, 147, 145, 145, 142, 142, 141, 139, 139, 138, 134, 134, 132, 131, 129, 129, 126, 125, 124, 121, 121, 117, 117, 116, 113, 113, 110, 110, 108, 108, 106, 106, 104, 103, 103, 102, 102, 102, 101, 102, 102, 101, 102, 101, 103, 102, 104, 103, 106, 106, 108, 108, 108, 110, 111, 111, 115, 115, 117, 117, 121, 121, 122, 125, 125, 129, 130, 130, 133, 133, 136, 137, 139, 139, 141, 141, 144, 145, 145, 147, 146, 148, 148, 148, 151, 149, 151, 151, 151, 152, 151, 152, 151, 151, 149, 151, 149, 149, 147, 147, 147, 146, 144, 144, 140, 140, 139, 136, 136, 132, 132, 129, 129, 126, 125, 123, 122, 118, 118, 116, 116, 114, 111, 111, 109, 109, 108, 108, 106, 107, 104, 104, 103, 104, 102, 103, 102, 103, 103, 102, 103, 102, 103, 102, 104, 104, 106, 106, 107, 108, 108, 110, 110, 113, 113, 115, 116, 118, 119, 122, 123, 124, 126, 128, 130, 132, 132, 136, 136, 138, 139, 141, 142, 142, 145, 145, 147, 147, 148, 148, 149, 149, 151, 151, 149, 151, 151, 149, 151, 149, 149, 148, 149, 147, 148, 147, 146, 145, 145, 142, 142, 140, 140, 139, 137, 137, 134, 133, 131, 131, 128, 128, 124, 124, 122, 119, 118, 116, 114, 114, 111, 110, 108, 108, 106, 106, 106, 103, 103, 102, 103, 101, 102, 101, 102, 101, 103, 102, 103, 103, 104, 104, 106, 107, 106, 108, 108, 108, 110, 110, 113, 113, 115, 115, 118, 118, 121, 122, 124, 125, 128, 129, 131, 132, 134, 137, 138, 139, 140, 142, 144, 144, 146, 146, 148, 147, 149, 148, 151, 149, 151, 149, 151, 149, 151, 151, 149, 151, 148, 149, 147, 148, 146, 146, 144, 144, 142, 142, 141, 139, 138, 137, 136, 133, 133, 130, 130, 128, 128, 124, 124, 122, 122, 118, 118, 116, 115, 113, 113, 111, 109, 109, 107, 107, 104, 106, 103, 104, 102, 103, 102, 103, 103, 102, 103, 103, 104, 103, 106, 104, 107, 107, 108, 108, 110, 110, 113, 113, 114, 115, 117, 118, 118, 121, 122, 123, 125, 125, 129, 129, 132, 132, 136, 136, 138, 140, 140, 142, 142, 145, 146, 147, 146, 148, 147, 149, 148, 149, 149, 148, 149, 148, 149, 149, 148, 149, 148, 148, 147, 147, 147, 146, 146, 144, 144, 141, 141, 139, 139, 137, 134, 133, 131, 131, 128, 128, 124, 124, 121, 121, 118, 117, 115, 115, 114, 111, 111, 109, 109, 108, 108, 106, 107, 106, 106, 104, 103, 104, 103, 104, 103, 104, 104, 104, 106, 104, 107, 107, 107, 109, 108, 110, 110, 113, 114, 113, 115, 115, 117, 118, 118, 121, 122, 123, 125, 125, 129, 129, 132, 132, 136, 136, 139, 139, 142, 144, 145, 145, 147, 147, 148, 148, 149, 149, 148, 149, 149, 148, 149, 147, 148, 148, 147, 147, 146, 147, 146, 145, 145, 145, 145, 144, 141, 141, 139, 139, 137, 137, 134, 132, 131, 129, 128, 124, 124, 122, 119, 118, 117, 115, 115, 113, 113, 113, 110, 110, 109, 109, 108, 109, 107, 108, 106, 107, 104, 104, 104, 103, 103, 102, 103, 102, 103, 103, 104, 106, 106, 108, 108, 110, 110, 114, 115, 115, 117, 118, 121, 121, 123, 123, 125, 125, 125, 128, 129, 129, 131, 132, 134, 137, 138, 141, 142, 146, 147, 151, 152, 154, 154, 156, 156, 157, 156, 156, 153, 152, 149, 146, 144, 139, 137, 134, 131, 129, 125, 125, 124, 125, 125, 128, 129, 133, 136, 140, 142, 148, 152, 155, 157, 160, 160, 161, 159, 159, 154, 151, 146, 140, 133, 126, 117, 111, 102, 95, 89, 83, 78, 72, 71, 68, 68, 66, 69, 70, 74, 77, 81, 85, 91, 95, 99, 103, 107, 110, 114, 115, 117, 117, 119, 118, 121, 119, 121, 119, 121, 121, 122, 122, 125, 126, 128, 132, 133, 137, 139, 142, 146, 147, 151, 152, 155, 156, 156, 157, 157, 159, 156, 157, 156, 156, 155, 154, 153, 153, 153, 152, 153, 153, 152, 154, 153, 154, 154, 155, 154, 154, 154, 152, 152, 149, 148, 146, 142, 140, 137, 134, 131, 128, 123, 121, 118, 115, 113, 109, 107, 106, 103, 102, 100, 100, 99, 99, 98, 96, 96, 95, 95, 94, 94, 94, 92, 93, 92, 92, 91, 92, 91, 93, 93, 94, 94, 96, 96, 100, 102, 102, 106, 108, 109, 113, 115, 118, 119, 123, 123, 126, 128, 130, 131, 133, 134, 137, 139, 140, 141, 141, 145, 146, 147, 147, 151, 151, 153, 153, 155, 155, 157, 156, 159, 159, 160, 160, 160, 159, 159, 159, 156, 157, 155, 155, 154, 152, 152, 149, 149, 147, 147, 146, 144, 144, 141, 141, 140, 138, 137, 134, 134, 131, 131, 130, 126, 126, 123, 123, 119, 119, 116, 116, 114, 111, 110, 108, 108, 104, 104, 102, 102, 101, 98, 98, 95, 95, 94, 92, 92, 89, 89, 89, 88, 88, 88, 89, 89, 91, 93, 93, 96, 98, 101, 103, 106, 110, 113, 115, 119, 122, 125, 128, 131, 132, 136, 136, 139, 140, 141, 141, 142, 141, 142, 142, 144, 142, 144, 142, 145, 144, 145, 146, 145, 147, 147, 148, 148, 149, 149, 151, 151, 149, 149, 147, 148, 146, 146, 142, 142, 140, 138, 138, 136, 134, 133, 131, 131, 130, 130, 130, 129, 130, 129, 130, 130, 131, 130, 131, 130, 131, 129, 130, 128, 129, 126, 126, 123, 123, 122, 119, 118, 116, 116, 114, 115, 113, 113, 113, 113, 113, 113, 113, 111, 113, 111, 113, 114, 113, 114, 114, 113, 114, 114, 115, 114, 115, 115, 115, 117, 117, 118, 118, 121, 123, 123, 125, 126, 129, 129, 131, 132, 134, 134, 134, 137, 136, 137, 136, 137, 136, 137, 134, 136, 133, 134, 133, 132, 132, 131, 132, 130, 131, 131, 130, 131, 129, 130, 130, 129, 130, 128, 129, 126, 128, 126, 125, 125, 123, 123, 122, 122, 119, 119, 118, 118, 118, 116, 117, 116, 117, 117, 116, 118, 117, 118, 118, 121, 119, 122, 122, 124, 124, 125, 125, 128, 128, 129, 129, 131, 131, 131, 132, 131, 132, 132, 133, 132, 133, 132, 133, 132, 133, 132, 134, 133, 136, 136, 136, 138, 138, 140, 141, 141, 144, 144, 146, 147, 146, 148, 147, 148, 146, 147, 145, 145, 142, 141, 139, 137, 136, 132, 132, 129, 129, 125, 125, 125, 123, 124, 122, 123, 123, 122, 123, 122, 123, 121, 121, 121, 117, 117, 114, 113, 110, 108, 103, 102, 98, 96, 94, 91, 89, 87, 88, 87, 88, 89, 91, 93, 94, 98, 100, 104, 106, 110, 111, 116, 117, 119, 121, 123, 122, 123, 122, 123, 121, 121, 119, 119, 119, 118, 119, 118, 121, 122, 125, 126, 131, 133, 138, 142, 146, 151, 154, 160, 163, 164, 169, 171, 172, 172, 172, 172, 170, 170, 167, 166, 162, 160, 157, 155, 153, 151, 147, 147, 145, 146, 146, 145, 146, 146, 147, 148, 147, 149, 148, 149, 147, 147, 145, 144, 140, 138, 133, 131, 126, 123, 117, 114, 108, 106, 101, 99, 94, 93, 91, 89, 88, 88, 88, 88, 89, 89, 92, 92, 94, 94, 95, 96, 95, 96, 95, 95, 94, 92, 92, 89, 89, 87, 87, 86, 86, 87, 86, 88, 91, 92, 95, 99, 101, 106, 109, 115, 118, 124, 126, 132, 136, 138, 142, 145, 148, 148, 151, 151, 153, 152, 153, 152, 153, 151, 152, 151, 153, 152, 154, 153, 155, 157, 159, 161, 161, 163, 166, 167, 169, 169, 171, 171, 170, 171, 169, 169, 167, 166, 162, 160, 156, 154, 152, 147, 145, 142, 139, 137, 133, 133, 131, 130, 129, 126, 128, 125, 125, 124, 124, 122, 122, 121, 117, 117, 114, 113, 108, 107, 103, 99, 98, 93, 92, 88, 85, 84, 81, 81, 80, 80, 79, 80, 80, 81, 85, 86, 89, 91, 94, 98, 100, 102, 103, 107, 108, 111, 111, 115, 115, 117, 118, 117, 119, 118, 121, 119, 122, 121, 122, 124, 124, 126, 126, 130, 130, 133, 136, 137, 140, 141, 145, 147, 148, 151, 152, 153, 155, 154, 156, 155, 156, 155, 155, 156, 154, 154, 154, 152, 152, 149, 149, 148, 148, 147, 147, 147, 146, 145, 146, 145, 144, 145, 142, 144, 142, 140, 141, 139, 139, 136, 136, 132, 132, 129, 128, 125, 124, 121, 121, 117, 116, 116, 113, 114, 111, 111, 110, 111, 110, 111, 110, 113, 111, 113, 113, 114, 115, 114, 115, 115, 115, 116, 115, 116, 115, 116, 115, 116, 116, 115, 116, 115, 116, 117, 116, 118, 117, 119, 119, 119, 122, 122, 122, 124, 124, 124, 125, 124, 126, 126, 126, 126, 125, 126, 125, 126, 125, 125, 125, 125, 125, 124, 123, 124, 123, 123, 123, 123, 122, 123, 122, 123, 123, 123, 124, 123, 125, 124, 125, 126, 126, 126, 126, 128, 126, 128, 126, 128, 128, 126, 128, 126, 128, 126, 128, 128, 126, 128, 128, 126, 129, 129, 129, 131, 131, 133, 133, 136, 137, 138, 140, 140, 142, 145, 146, 147, 147, 148, 148, 148, 149, 148, 148, 148, 147, 145, 145, 144, 144, 142, 140, 141, 140, 139, 139, 138, 139, 139, 138, 139, 139, 138, 139, 137, 138, 136, 137, 134, 133, 131, 130, 128, 126, 123, 122, 118, 116, 113, 111, 110, 107, 106, 104, 102, 102, 100, 101, 100, 99, 100, 99, 100, 99, 100, 99, 99, 98, 99, 96, 98, 95, 96, 95, 95, 94, 94, 93, 94, 93, 95, 95, 98, 99, 99, 102, 103, 107, 108, 111, 114, 117, 119, 123, 124, 128, 129, 132, 133, 137, 138, 139, 140, 142, 142, 145, 146, 146, 148, 148, 152, 152, 154, 155, 159, 159, 162, 163, 166, 168, 169, 170, 172, 172, 174, 175, 174, 175, 174, 174, 172, 172, 169, 169, 166, 164, 162, 160, 157, 155, 152, 149, 146, 145, 142, 139, 138, 134, 132, 131, 128, 126, 123, 122, 118, 117, 114, 113, 109, 108, 104, 103, 100, 98, 94, 93, 89, 88, 85, 84, 83, 79, 79, 78, 76, 76, 74, 76, 74, 76, 76, 77, 77, 79, 79, 83, 83, 85, 86, 88, 89, 92, 93, 95, 95, 99, 99, 102, 102, 106, 106, 109, 110, 114, 116, 117, 122, 124, 126, 131, 134, 137, 141, 144, 148, 152, 154, 159, 161, 164, 166, 169, 169, 172, 172, 174, 174, 175, 175, 174, 175, 174, 174, 172, 172, 172, 170, 171, 170, 169, 170, 168, 169, 168, 167, 167, 166, 166, 164, 161, 161, 159, 155, 154, 149, 148, 145, 140, 138, 133, 131, 126, 124, 121, 117, 114, 110, 109, 106, 104, 102, 101, 101, 99, 99, 96, 98, 95, 95, 95, 93, 94, 93, 92, 91, 88, 88, 87, 87, 85, 85, 84, 84, 83, 83, 81, 84, 83, 85, 85, 88, 89, 92, 94, 96, 98, 101, 103, 107, 110, 113, 115, 117, 118, 122, 124, 124, 126, 128, 130, 131, 131, 133, 132, 134, 134, 137, 138, 138, 141, 141, 144, 145, 148, 148, 152, 153, 156, 157, 159, 161, 162, 162, 164, 164, 163, 164, 164, 162, 162, 161, 157, 157, 155, 152, 152, 148, 147, 146, 142, 142, 141, 139, 140, 139, 138, 139, 138, 139, 138, 139, 138, 139, 138, 137, 137, 134, 134, 132, 131, 128, 126, 123, 122, 118, 117, 114, 113, 110, 108, 108, 106, 106, 106, 104, 107, 107, 108, 108, 110, 110, 114, 114, 116, 115, 117, 116, 117, 117, 117, 115, 115, 114, 114, 111, 109, 109, 108, 108, 106, 107, 106, 107, 108, 107, 109, 109, 113, 113, 116, 117, 117, 121, 121, 123, 123, 124, 123, 125, 124, 124, 124, 122, 123, 122, 122, 121, 121, 119, 121, 119, 121, 121, 122, 123, 124, 126, 128, 129, 130, 132, 132, 134, 136, 136, 138, 138, 138, 139, 138, 139, 138, 138, 137, 138, 136, 137, 137, 137, 137, 137, 138, 138, 138, 140, 140, 142, 142, 145, 146, 146, 148, 148, 149, 151, 149, 151, 149, 151, 149, 151, 148, 148, 147, 147, 145, 145, 144, 144, 141, 141, 139, 139, 139, 137, 138, 136, 134, 134, 134, 132, 132, 130, 130, 129, 125, 125, 122, 122, 118, 118, 115, 114, 111, 110, 108, 107, 104, 103, 101, 100, 99, 98, 96, 95, 95, 93, 94, 94, 92, 93, 93, 92, 93, 92, 93, 92, 93, 92, 93, 92, 92, 94, 93, 94, 94, 96, 95, 98, 99, 101, 101, 104, 106, 107, 110, 111, 116, 117, 121, 124, 125, 129, 131, 134, 137, 139, 142, 144, 147, 148, 151, 152, 154, 155, 157, 159, 159, 162, 163, 163, 166, 167, 167, 169, 170, 170, 172, 171, 174, 175, 174, 175, 175, 176, 175, 174, 174, 171, 171, 169, 168, 166, 164, 162, 160, 156, 154, 152, 148, 145, 144, 139, 138, 136, 132, 131, 126, 125, 122, 121, 117, 116, 113, 111, 107, 106, 102, 101, 98, 95, 93, 89, 87, 84, 83, 79, 78, 76, 74, 73, 72, 72, 72, 71, 72, 72, 72, 74, 74, 77, 77, 80, 80, 84, 85, 86, 88, 91, 92, 94, 96, 96, 100, 101, 102, 106, 107, 108, 111, 113, 117, 118, 122, 124, 129, 130, 134, 138, 140, 145, 147, 149, 154, 155, 160, 161, 164, 166, 169, 170, 171, 174, 174, 175, 176, 175, 177, 177, 176, 177, 176, 175, 176, 175, 175, 172, 174, 171, 171, 171, 169, 169, 166, 166, 164, 161, 161, 159, 155, 153, 149, 148, 144, 141, 139, 134, 132, 128, 126, 122, 119, 116, 115, 111, 110, 108, 104, 103, 101, 101, 100, 99, 98, 96, 95, 94, 93, 93, 91, 91, 89, 89, 87, 88, 86, 85, 86, 84, 85, 84, 85, 85, 85, 86, 87, 88, 88, 91, 91, 94, 95, 99, 101, 102, 106, 107, 110, 111, 115, 117, 118, 122, 123, 125, 126, 129, 129, 131, 131, 133, 134, 136, 137, 138, 139, 140, 141, 144, 145, 146, 147, 148, 149, 149, 152, 152, 154, 154, 155, 155, 156, 155, 156, 155, 156, 156, 155, 155, 153, 154, 153, 151, 151, 149, 149, 147, 147, 145, 145, 144, 144, 141, 141, 139, 140, 139, 138, 137, 136, 136, 133, 133, 131, 131, 130, 129, 126, 126, 125, 124, 123, 123, 121, 121, 118, 118, 117, 117, 116, 115, 116, 115, 116, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 115, 116, 115, 116, 115, 115, 115, 113, 114, 113, 113, 111, 110, 110, 109, 110, 109, 110, 109, 110, 109, 111, 110, 113, 111, 114, 114, 114, 115, 115, 117, 116, 117, 117, 118, 117, 118, 117, 118, 117, 118, 117, 116, 117, 116, 118, 118, 117, 119, 118, 121, 122, 123, 123, 125, 126, 128, 130, 131, 131, 133, 134, 137, 137, 138, 138, 140, 140, 140, 142, 142, 141, 144, 144, 144, 145, 145, 146, 145, 147, 146, 148, 147, 148, 151, 149, 152, 153, 152, 154, 154, 154, 153, 154, 153, 154, 153, 153, 152, 152, 151, 149, 148, 147, 144, 144, 141, 141, 138, 138, 137, 134, 134, 131, 131, 130, 128, 128, 125, 125, 123, 122, 119, 119, 117, 116, 115, 111, 111, 108, 107, 106, 102, 101, 99, 98, 95, 94, 93, 91, 91, 88, 88, 86, 87, 86, 87, 86, 87, 87, 88, 88, 91, 91, 93, 94, 95, 95, 98, 98, 100, 100, 102, 102, 104, 106, 107, 107, 110, 110, 114, 115, 116, 119, 121, 124, 126, 130, 132, 136, 137, 141, 142, 147, 148, 152, 153, 156, 157, 161, 161, 163, 164, 167, 167, 168, 169, 170, 170, 171, 170, 171, 171, 172, 171, 172, 171, 172, 171, 172, 171, 171, 170, 170, 168, 167, 164, 163, 161, 160, 155, 154, 149, 148, 144, 141, 137, 134, 132, 129, 125, 123, 118, 117, 114, 113, 110, 107, 106, 102, 102, 99, 99, 96, 95, 94, 91, 91, 89, 87, 86, 85, 83, 83, 81, 79, 79, 78, 78, 77, 78, 78, 78, 77, 79, 79, 79, 81, 83, 85, 86, 88, 89, 93, 95, 96, 101, 102, 106, 107, 110, 113, 116, 118, 119, 123, 125, 126, 131, 133, 136, 138, 140, 141, 145, 146, 149, 151, 154, 154, 157, 159, 162, 164, 166, 168, 169, 171, 171, 174, 174, 175, 175, 176, 175, 175, 175, 172, 174, 171, 171, 168, 168, 164, 164, 161, 161, 157, 156, 153, 153, 149, 148, 146, 145, 141, 140, 138, 137, 133, 133, 130, 129, 126, 123, 122, 118, 117, 114, 113, 110, 107, 106, 102, 101, 98, 98, 94, 94, 92, 92, 89, 91, 89, 89, 88, 89, 89, 89, 91, 91, 92, 92, 93, 94, 93, 95, 95, 98, 98, 99, 99, 101, 100, 102, 102, 104, 106, 108, 108, 111, 111, 115, 115, 117, 121, 122, 124, 125, 129, 130, 132, 133, 136, 137, 139, 140, 140, 142, 142, 142, 144, 144, 144, 146, 145, 146, 145, 147, 146, 147, 147, 148, 148, 149, 149, 149, 151, 151, 151, 152, 152, 151, 151, 149, 151, 148, 148, 147, 146, 145, 144, 141, 140, 139, 137, 136, 133, 133, 132, 130, 130, 130, 128, 129, 128, 128, 128, 126, 128, 126, 128, 126, 128, 126, 128, 126, 125, 126, 124, 124, 123, 122, 122, 119, 119, 117, 117, 116, 116, 115, 116, 115, 116, 115, 116, 115, 117, 117, 117, 118, 118, 119, 118, 121, 119, 121, 118, 119, 118, 118, 118, 116, 117, 116, 114, 115, 113, 114, 113, 113, 113, 113, 113, 114, 113, 115, 114, 116, 115, 117, 116, 118, 118, 117, 119, 118, 119, 118, 118, 117, 118, 118, 117, 117, 117, 117, 116, 117, 116, 118, 117, 119, 119, 122, 122, 125, 125, 128, 130, 130, 133, 133, 136, 136, 139, 139, 139, 141, 141, 142, 144, 142, 145, 144, 145, 146, 145, 146, 147, 146, 148, 147, 149, 151, 149, 152, 151, 153, 153, 154, 154, 155, 154, 155, 154, 154, 153, 153, 151, 152, 148, 148, 146, 146, 142, 142, 139, 139, 137, 136, 132, 132, 129, 129, 125, 125, 124, 122, 122, 118, 118, 116, 116, 114, 113, 111, 109, 108, 107, 103, 103, 100, 99, 96, 95, 93, 92, 89, 89, 87, 87, 86, 84, 85, 84, 85, 85, 85, 87, 87, 89, 89, 92, 94, 95, 98, 98, 101, 101, 104, 104, 108, 108, 111, 111, 114, 115, 117, 118, 119, 122, 124, 124, 128, 129, 132, 134, 137, 140, 144, 145, 149, 151, 155, 156, 160, 162, 166, 166, 169, 170, 170, 172, 172, 174, 174, 172, 172, 171, 171, 170, 170, 169, 168, 166, 166, 163, 163, 162, 162, 160, 160, 159, 159, 157, 156, 155, 154, 151, 151, 147, 146, 142, 140, 137, 134, 131, 126, 124, 119, 117, 113, 111, 107, 104, 101, 100, 96, 95, 92, 92, 89, 89, 87, 88, 86, 87, 87, 87, 86, 86, 86, 86, 86, 85, 84, 85, 85, 84, 84, 83, 84, 84, 85, 85, 86, 86, 88, 88, 92, 94, 95, 99, 100, 104, 107, 109, 114, 116, 119, 123, 125, 128, 131, 132, 137, 138, 140, 141, 145, 145, 147, 148, 151, 151, 153, 154, 156, 156, 159, 159, 162, 163, 164, 166, 167, 167, 169, 169, 170, 169, 171, 170, 170, 169, 169, 167, 167, 166, 163, 162, 160, 159, 155, 154, 151, 149, 146, 146, 144, 140, 140, 137, 136, 134, 131, 131, 129, 128, 125, 124, 122, 121, 118, 117, 115, 114, 111, 109, 108, 104, 103, 101, 100, 98, 98, 95, 95, 93, 93, 93, 92, 93, 92, 93, 94, 93, 95, 95, 98, 98, 99, 100, 100, 102, 103, 103, 106, 104, 107, 107, 108, 109, 109, 111, 111, 111, 114, 114, 116, 118, 119, 119, 123, 123, 126, 126, 130, 132, 133, 133, 137, 137, 139, 140, 140, 142, 142, 141, 144, 142, 144, 142, 144, 142, 142, 142, 141, 142, 141, 142, 141, 142, 141, 144, 144, 142, 144, 144, 144, 145, 144, 145, 144, 145, 144, 142, 142, 141, 141, 140, 138, 138, 136, 136, 133, 134, 133, 131, 131, 130, 130, 129, 129, 128, 129, 129, 128, 129, 128, 129, 128, 129, 128, 129, 126, 128, 126, 126, 126, 124, 124, 124, 122, 122, 122, 119, 121, 118, 119, 117, 118, 117, 118, 118, 118, 119, 118, 119, 119, 121, 121, 121, 122, 121, 122, 121, 122, 119, 121, 118, 119, 117, 118, 116, 116, 116, 114, 114, 113, 113, 113, 113, 111, 113, 111, 113, 111, 114, 113, 115, 114, 115, 115, 116, 116, 117, 116, 117, 116, 117, 118, 117, 118, 118, 117, 118, 118, 117, 118, 118, 119, 121, 121, 123, 123, 125, 126, 128, 131, 131, 134, 134, 137, 139, 140, 140, 142, 142, 145, 145, 146, 147, 147, 148, 147, 148, 148, 148, 148, 148, 148, 149, 149, 148, 151, 149, 151, 151, 152, 152, 153, 152, 154, 153, 153, 152, 153, 151, 151, 149, 147, 147, 144, 142, 141, 138, 137, 133, 132, 129, 128, 125, 124, 122, 121, 118, 118, 116, 116, 114, 114, 111, 111, 110, 110, 108, 108, 106, 104, 103, 101, 100, 98, 98, 94, 93, 93, 91, 88, 89, 87, 87, 86, 87, 87, 87, 88, 89, 89, 92, 94, 94, 98, 99, 100, 102, 104, 104, 108, 108, 111, 111, 114, 115, 117, 117, 121, 122, 123, 125, 126, 129, 130, 133, 134, 138, 140, 144, 146, 147, 151, 152, 156, 156, 160, 161, 163, 166, 167, 168, 169, 169, 168, 170, 169, 170, 168, 169, 167, 168, 167, 166, 166, 164, 163, 163, 161, 161, 160, 160, 159, 156, 156, 154, 152, 152, 148, 147, 144, 142, 140, 137, 134, 132, 128, 125, 121, 119, 115, 113, 109, 107, 103, 102, 99, 98, 95, 94, 92, 92, 89, 89, 89, 87, 88, 88, 86, 87, 86, 87, 86, 87, 86, 86, 85, 86, 86, 86, 87, 87, 87, 88, 88, 91, 91, 94, 94, 98, 100, 101, 104, 108, 109, 114, 115, 119, 122, 124, 128, 130, 132, 134, 136, 139, 139, 141, 142, 145, 146, 147, 148, 148, 151, 151, 153, 154, 155, 156, 157, 159, 160, 161, 162, 163, 163, 166, 166, 167, 166, 166, 167, 166, 166, 163, 163, 161, 160, 157, 156, 153, 152, 149, 148, 145, 144, 142, 139, 139, 137, 134, 134, 132, 132, 131, 129, 129, 128, 126, 124, 123, 121, 121, 117, 116, 115, 113, 111, 109, 107, 106, 103, 102, 101, 99, 99, 96, 98, 95, 96, 96, 95, 96, 96, 98, 98, 100, 100, 101, 102, 103, 103, 106, 106, 107, 107, 109, 109, 110, 110, 111, 111, 113, 113, 115, 115, 116, 117, 117, 119, 119, 123, 123, 125, 126, 129, 129, 131, 132, 134, 134, 137, 137, 138, 138, 140, 139, 140, 139, 140, 140, 139, 140, 139, 139, 138, 139, 138, 139, 139, 138, 139, 138, 139, 139, 140, 140, 140, 140, 141, 140, 141, 141, 140, 141, 139, 140, 140, 138, 138, 138, 136, 136, 133, 134, 132, 132, 132, 130, 131, 129, 130, 130, 129, 130, 130, 129, 130, 129, 130, 129, 130, 130, 130, 130, 130, 129, 129, 128, 128, 128, 128, 126, 125, 124, 123, 124, 122, 123, 122, 123, 122, 122, 122, 122, 122, 122, 122, 121, 122, 121, 121, 119, 121, 119, 119, 118, 118, 117, 117, 116, 116, 116, 114, 114, 113, 113, 113, 111, 111, 111, 110, 110, 109, 111, 110, 111, 111, 110, 113, 113, 113, 114, 115, 114, 115, 116, 115, 117, 116, 118, 117, 119, 118, 121, 121, 122, 122, 123, 123, 124, 125, 126, 125, 128, 129, 130, 131, 132, 133, 136, 137, 138, 139, 139, 141, 141, 144, 145, 146, 146, 147, 147, 148, 149, 149, 148, 149, 148, 151, 149, 151, 149, 151, 149, 151, 151, 149, 151, 149, 151, 149, 151, 149, 149, 149, 147, 148, 146, 146, 144, 144, 141, 139, 138, 136, 134, 131, 131, 128, 126, 124, 121, 121, 117, 117, 114, 114, 111, 110, 110, 108, 108, 106, 106, 106, 104, 103, 102, 102, 101, 100, 98, 99, 96, 96, 95, 94, 94, 93, 94, 92, 93, 92, 93, 93, 94, 95, 96, 96, 99, 99, 101, 102, 104, 104, 108, 108, 111, 113, 114, 116, 117, 119, 121, 123, 124, 126, 126, 130, 131, 132, 134, 136, 138, 139, 141, 144, 145, 147, 148, 151, 152, 154, 156, 156, 159, 159, 161, 161, 163, 163, 164, 163, 164, 164, 164, 164, 163, 163, 163, 162, 161, 159, 159, 157, 156, 155, 153, 153, 151, 149, 147, 147, 146, 144, 141, 140, 138, 137, 134, 133, 131, 129, 128, 125, 123, 121, 118, 116, 113, 113, 110, 108, 106, 104, 102, 101, 100, 99, 96, 96, 94, 94, 94, 92, 93, 92, 93, 92, 91, 92, 91, 91, 92, 93, 92, 93, 92, 94, 94, 93, 95, 95, 98, 98, 100, 100, 101, 104, 104, 108, 110, 113, 114, 117, 118, 122, 123, 125, 128, 129, 132, 133, 136, 137, 139, 139, 141, 141, 145, 145, 147, 148, 148, 149, 149, 152, 152, 154, 154, 156, 157, 157, 160, 159, 161, 160, 161, 162, 161, 161, 161, 160, 160, 157, 157, 155, 155, 153, 153, 149, 149, 147, 146, 145, 142, 141, 139, 139, 137, 137, 134, 134, 131, 131, 129, 129, 128, 124, 124, 123, 119, 119, 116, 116, 113, 113, 110, 108, 108, 107, 106, 103, 103, 103, 101, 102, 100, 101, 100, 101, 100, 102, 102, 102, 102, 102, 103, 102, 104, 104, 103, 106, 104, 106, 106, 107, 107, 108, 109, 108, 110, 111, 111, 114, 115, 116, 117, 118, 118, 121, 122, 124, 124, 126, 128, 130, 131, 132, 133, 133, 133, 136, 136, 136, 137, 137, 138, 139, 138, 139, 139, 139, 140, 139, 140, 140, 141, 140, 141, 140, 142, 141, 142, 141, 142, 141, 144, 142, 144, 142, 142, 142, 142, 141, 141, 141, 140, 140, 138, 139, 138, 137, 137, 134, 134, 134, 133, 133, 132, 133, 131, 132, 131, 132, 130, 131, 130, 131, 129, 130, 130, 129, 129, 128, 128, 128, 125, 126, 124, 125, 123, 124, 122, 122, 121, 121, 121, 119, 118, 119, 118, 117, 118, 116, 117, 117, 116, 116, 115, 116, 116, 114, 115, 114, 115, 114, 114, 113, 114, 114, 111, 113, 111, 113, 113, 111, 113, 111, 113, 111, 113, 113, 111, 113, 111, 113, 113, 114, 114, 114, 115, 114, 116, 115, 117, 117, 118, 118, 121, 121, 121, 123, 124, 124, 124, 126, 126, 129, 130, 129, 131, 131, 133, 134, 134, 137, 137, 139, 138, 140, 141, 141, 144, 144, 146, 145, 147, 148, 148, 148, 149, 149, 151, 149, 151, 149, 151, 151, 151, 149, 149, 148, 149, 147, 148, 146, 147, 146, 145, 145, 144, 144, 144, 141, 141, 140, 140, 138, 138, 136, 136, 133, 132, 130, 130, 128, 126, 124, 123, 121, 119, 117, 116, 115, 111, 111, 109, 109, 107, 107, 106, 103, 104, 103, 101, 102, 101, 101, 100, 100, 98, 99, 96, 98, 95, 96, 95, 96, 95, 96, 96, 98, 98, 99, 100, 100, 101, 101, 104, 106, 106, 109, 109, 111, 113, 115, 116, 118, 121, 121, 123, 124, 126, 128, 130, 130, 133, 133, 136, 138, 139, 141, 141, 144, 146, 147, 148, 151, 151, 153, 153, 154, 156, 156, 159, 157, 160, 160, 161, 161, 160, 161, 161, 159, 160, 159, 159, 157, 157, 155, 155, 155, 153, 153, 151, 151, 148, 148, 146, 146, 142, 142, 140, 139, 137, 136, 132, 132, 129, 128, 125, 124, 122, 119, 118, 116, 115, 111, 111, 110, 107, 107, 104, 104, 102, 102, 100, 100, 98, 99, 96, 98, 95, 96, 96, 94, 95, 94, 95, 94, 95, 94, 96, 95, 96, 96, 98, 99, 100, 99, 101, 101, 103, 103, 106, 107, 109, 109, 113, 113, 116, 116, 119, 119, 123, 123, 126, 126, 130, 131, 133, 134, 136, 136, 139, 139, 141, 142, 142, 145, 144, 146, 147, 147, 149, 148, 151, 149, 152, 153, 153, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 153, 152, 152, 149, 149, 147, 147, 145, 144, 141, 141, 139, 138, 136, 136, 133, 133, 130, 130, 129, 126, 126, 124, 124, 123, 123, 122, 121, 118, 118, 116, 117, 116, 114, 114, 111, 111, 110, 110, 108, 108, 107, 107, 106, 104, 106, 104, 103, 104, 103, 104, 104, 106, 104, 107, 107, 107, 108, 108, 110, 110, 111, 111, 111, 113, 113, 113, 114, 113, 114, 114, 114, 115, 115, 116, 116, 116, 118, 118, 121, 122, 122, 124, 124, 126, 126, 129, 129, 131, 131, 133, 133, 136, 136, 136, 138, 138, 137, 138, 138, 139, 139, 138, 139, 138, 139, 139, 138, 139, 139, 138, 139, 139, 140, 139, 141, 140, 141, 141, 142, 142, 141, 144, 142, 144, 142, 144, 141, 142, 141, 141, 140, 140, 139, 139, 138, 138, 136, 137, 136, 134, 134, 134, 132, 133, 131, 132, 132, 130, 131, 130, 130, 130, 129, 129, 128, 126, 126, 125, 125, 124, 122, 123, 122, 119, 119, 117, 117, 117, 115, 115, 113, 114, 113, 110, 111, 110, 110, 110, 109, 109, 108, 109, 108, 109, 108, 109, 108, 109, 109, 108, 109, 108, 109, 108, 108, 108, 109, 109, 108, 109, 108, 110, 109, 111, 110, 113, 114, 114, 115, 117, 117, 119, 121, 121, 123, 123, 125, 125, 128, 128, 130, 131, 131, 133, 133, 136, 134, 137, 137, 139, 139, 140, 140, 142, 144, 144, 146, 145, 147, 147, 149, 151, 151, 151, 152, 152, 153, 153, 154, 153, 154, 153, 153, 152, 152, 151, 151, 149, 149, 147, 147, 147, 145, 145, 142, 144, 141, 140, 140, 138, 138, 138, 136, 136, 133, 131, 131, 129, 128, 126, 123, 123, 121, 118, 117, 115, 113, 111, 109, 108, 107, 104, 104, 102, 102, 100, 100, 99, 99, 99, 98, 98, 96, 98, 98, 96, 98, 99, 98, 99, 98, 99, 100, 99, 100, 101, 100, 102, 101, 103, 102, 104, 104, 107, 107, 109, 110, 110, 114, 115, 116, 118, 121, 122, 124, 125, 129, 129, 132, 134, 134, 138, 138, 141, 142, 142, 146, 146, 148, 148, 151, 151, 151, 153, 153, 154, 154, 155, 156, 155, 157, 156, 157, 157, 159, 159, 157, 159, 157, 159, 157, 156, 156, 155, 155, 154, 152, 152, 149, 149, 148, 146, 145, 142, 141, 140, 137, 136, 133, 132, 130, 129, 126, 125, 123, 122, 119, 118, 116, 116, 115, 111, 111, 109, 109, 108, 107, 104, 104, 102, 102, 101, 101, 99, 100, 98, 99, 98, 96, 98, 98, 98, 98, 98, 96, 98, 98, 99, 99, 100, 101, 101, 102, 103, 103, 106, 106, 108, 109, 110, 110, 113, 113, 116, 116, 118, 119, 122, 123, 124, 125, 128, 128, 130, 131, 133, 133, 137, 138, 139, 139, 142, 144, 145, 146, 147, 147, 148, 148, 151, 151, 152, 152, 152, 151, 152, 151, 152, 151, 152, 152, 151, 149, 151, 148, 149, 148, 148, 147, 147, 145, 146, 144, 145, 142, 142, 142, 140, 140, 140, 138, 138, 137, 136, 133, 133, 131, 131, 129, 129, 126, 126, 125, 123, 123, 121, 121, 118, 118, 116, 117, 116, 115, 115, 113, 114, 113, 111, 111, 111, 109, 110, 109, 109, 108, 109, 108, 108, 107, 108, 107, 106, 107, 106, 107, 107, 108, 107, 108, 109, 108, 110, 109, 111, 111, 113, 113, 115, 114, 116, 116, 117, 117, 119, 121, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 126, 128, 128, 129, 129, 131, 131, 132, 132, 133, 133, 134, 134, 136, 137, 137, 138, 138, 139, 139, 140, 139, 141, 140, 141, 140, 142, 141, 142, 141, 142, 141, 142, 141, 144, 142, 144, 142, 144, 144, 142, 144, 144, 144, 142, 144, 142, 142, 141, 142, 141, 140, 140, 139, 139, 138, 137, 134, 134, 133, 133, 132, 131, 130, 130, 128, 128, 125, 125, 124, 124, 123, 122, 122, 119, 121, 118, 118, 116, 117, 115, 115, 114, 114, 111, 111, 109, 110, 109, 107, 108, 107, 106, 106, 104, 104, 104, 103, 104, 103, 104, 103, 104, 103, 104, 103, 106, 104, 106, 107, 106, 107, 107, 108, 108, 110, 109, 111, 113, 113, 115, 116, 116, 118, 118, 121, 122, 124, 124, 126, 128, 129, 131, 131, 134, 134, 137, 138, 140, 140, 142, 142, 145, 145, 147, 147, 149, 151, 151, 152, 152, 153, 154, 153, 155, 154, 155, 154, 155, 154, 155, 155, 154, 155, 153, 154, 154, 152, 153, 151, 151, 148, 148, 148, 146, 145, 142, 142, 141, 138, 138, 136, 134, 133, 130, 130, 126, 126, 124, 123, 121, 119, 117, 117, 114, 114, 111, 111, 109, 109, 107, 106, 106, 104, 103, 102, 100, 100, 99, 99, 96, 96, 95, 95, 94, 94, 93, 94, 93, 94, 94, 94, 95, 96, 95, 98, 98, 100, 100, 103, 103, 106, 107, 109, 111, 113, 114, 116, 117, 118, 121, 122, 124, 126, 128, 129, 131, 131, 134, 134, 137, 138, 140, 140, 141, 145, 145, 147, 147, 149, 151, 151, 153, 152, 154, 154, 155, 155, 156, 155, 157, 157, 156, 157, 156, 156, 156, 156, 156, 155, 155, 153, 154, 152, 152, 149, 151, 148, 148, 147, 146, 144, 142, 140, 140, 139, 136, 136, 133, 131, 131, 128, 128, 124, 124, 122, 119, 118, 116, 116, 115, 111, 111, 109, 109, 108, 106, 106, 106, 103, 103, 102, 102, 101, 100, 101, 100, 99, 100, 99, 99, 98, 99, 99, 100, 99, 101, 100, 102, 101, 103, 103, 106, 106, 108, 109, 110, 110, 113, 113, 115, 116, 116, 119, 121, 121, 123, 123, 125, 124, 126, 128, 128, 130, 130, 132, 132, 133, 133, 136, 136, 138, 138, 140, 141, 141, 142, 144, 144, 145, 145, 146, 147, 147, 147, 148, 147, 148, 147, 148, 148, 147, 147, 147, 146, 146, 145, 146, 145, 145, 144, 144, 142, 142, 142, 141, 141, 140, 140, 139, 138, 138, 136, 137, 134, 134, 132, 133, 131, 131, 129, 129, 126, 128, 125, 125, 123, 124, 123, 121, 122, 119, 119, 118, 118, 117, 117, 116, 117, 116, 115, 115, 114, 115, 114, 113, 113, 111, 113, 111, 111, 111, 111, 110, 110, 109, 110, 109, 110, 110, 110, 111, 111, 110, 111, 111, 113, 111, 114, 113, 114, 114, 115, 114, 116, 115, 116, 116, 117, 116, 118, 117, 118, 119, 119, 121, 121, 123, 123, 124, 125, 125, 126, 126, 129, 128, 130, 131, 131, 132, 133, 133, 133, 136, 134, 137, 137, 137, 138, 138, 139, 139, 140, 140, 141, 141, 141, 142, 142, 144, 145, 145, 145, 146, 146, 146, 147, 147, 146, 147, 146, 147, 147, 146, 146, 145, 146, 145, 144, 144, 142, 142, 140, 141, 139, 139, 139, 138, 136, 136, 134, 134, 132, 132, 131, 129, 129, 126, 126, 124, 124, 122, 122, 119, 118, 116, 116, 114, 114, 113, 110, 110, 108, 108, 107, 104, 104, 102, 102, 102, 101, 101, 100, 101, 99, 100, 100, 99, 100, 99, 100, 101, 101, 101, 102, 102, 102, 103, 103, 106, 106, 106, 108, 108, 110, 110, 113, 113, 115, 116, 118, 118, 122, 122, 124, 125, 128, 129, 131, 132, 134, 136, 138, 139, 139, 142, 144, 145, 146, 147, 148, 148, 151, 151, 152, 153, 154, 154, 154, 155, 155, 156, 155, 157, 156, 157, 156, 157, 157, 156, 157, 156, 156, 156, 154, 154, 153, 151, 151, 148, 148, 146, 145, 142, 141, 139, 138, 137, 133, 133, 131, 129, 129, 125, 125, 122, 122, 119, 118, 117, 115, 115, 111, 111, 109, 108, 106, 106, 103, 102, 100, 100, 98, 98, 96, 96, 94, 95, 94, 93, 94, 93, 94, 93, 95, 95, 95, 96, 96, 99, 100, 100, 102, 101, 103, 103, 106, 106, 108, 110, 110, 113, 114, 114, 116, 118, 119, 119, 123, 123, 126, 128, 130, 130, 133, 133, 137, 137, 140, 141, 141, 144, 145, 147, 147, 149, 148, 151, 151, 152, 153, 152, 154, 153, 154, 153, 155, 155, 154, 155, 154, 155, 155, 154, 153, 154, 153, 153, 152, 151, 151, 148, 149, 147, 147, 145, 145, 141, 141, 139, 139, 136, 136, 133, 132, 130, 130, 128, 125, 125, 123, 122, 121, 118, 118, 117, 116, 116, 114, 114, 113, 111, 111, 109, 110, 108, 108, 107, 107, 106, 106, 106, 103, 104, 102, 103, 102, 103, 103, 103, 103, 103, 103, 103, 104, 103, 106, 104, 107, 107, 109, 108, 110, 111, 111, 114, 114, 116, 116, 118, 118, 119, 121, 122, 122, 124, 124, 125, 125, 128, 128, 130, 130, 131, 131, 133, 133, 134, 134, 137, 138, 138, 138, 140, 140, 141, 141, 142, 141, 142, 142, 144, 144, 144, 144, 144, 144, 144, 142, 142, 142, 142, 142, 142, 141, 141, 140, 141, 140, 141, 141, 140, 141, 139, 140, 140, 139, 139, 138, 138, 138, 136, 137, 134, 136, 133, 133, 131, 132, 131, 129, 130, 128, 128, 128, 125, 125, 124, 124, 123, 123, 122, 122, 121, 121, 121, 119, 119, 118, 118, 117, 118, 116, 117, 116, 115, 115, 115, 114, 114, 113, 113, 113, 111, 111, 111, 110, 111, 110, 111, 110, 111, 110, 111, 110, 111, 110, 111, 113, 111, 113, 111, 114, 114, 113, 115, 114, 115, 116, 116, 117, 116, 118, 117, 119, 119, 119, 122, 122, 122, 124, 124, 126, 125, 128, 128, 130, 130, 131, 131, 133, 134, 134, 134, 137, 137, 137, 139, 138, 140, 140, 141, 141, 141, 144, 142, 145, 144, 146, 145, 147, 146, 148, 147, 148, 148, 148, 149, 148, 149, 148, 148, 147, 148, 146, 147, 145, 145, 145, 142, 142, 140, 140, 140, 138, 138, 136, 136, 133, 133, 132, 132, 131, 129, 129, 126, 126, 124, 124, 122, 122, 119, 118, 116, 116, 114, 114, 113, 110, 110, 108, 108, 106, 106, 104, 102, 103, 101, 101, 100, 101, 99, 100, 100, 99, 100, 99, 100, 100, 101, 100, 101, 101, 102, 103, 103, 104, 104, 107, 108, 108, 110, 110, 113, 113, 115, 115, 118, 119, 121, 122, 124, 124, 128, 128, 130, 132, 133, 134, 137, 137, 139, 140, 142, 144, 144, 146, 146, 148, 149, 151, 151, 152, 153, 153, 153, 154, 153, 154, 155, 154, 155, 154, 155, 154, 155, 154, 154, 153, 154, 152, 153, 151, 151, 151, 149, 147, 147, 145, 145, 144, 141, 141, 138, 138, 136, 134, 132, 131, 130, 128, 126, 124, 122, 121, 119, 117, 117, 114, 114, 113, 110, 110, 109, 108, 107, 104, 104, 102, 102, 102, 100, 100, 99, 100, 99, 99, 98, 99, 99, 98, 99, 98, 99, 99, 100, 100, 101, 101, 103, 102, 104, 104, 107, 107, 109, 109, 111, 111, 114, 115, 116, 118, 119, 119, 123, 123, 125, 126, 129, 130, 132, 132, 134, 136, 138, 139, 139, 141, 141, 144, 144, 146, 146, 147, 147, 149, 149, 149, 151, 151, 151, 151, 152, 151, 152, 151, 152, 151, 152, 152, 149, 151, 149, 149, 149, 148, 148, 147, 146, 146, 144, 144, 142, 141, 139, 139, 137, 136, 133, 133, 131, 131, 129, 129, 128, 125, 125, 123, 123, 121, 121, 119, 119, 117, 117, 116, 116, 114, 114, 113, 113, 111, 110, 110, 108, 109, 107, 108, 108, 106, 107, 106, 107, 107, 106, 107, 107, 108, 108, 109, 109, 109, 110, 110, 111, 113, 113, 113, 114, 114, 115, 115, 116, 116, 116, 117, 117, 118, 118, 119, 119, 121, 122, 122, 123, 123, 125, 125, 128, 129, 130, 130, 131, 131, 133, 132, 134, 134, 136, 137, 136, 138, 137, 137, 138, 138, 139, 139, 138, 139, 138, 140, 139, 140, 139, 140, 139, 140, 139, 140, 139, 140, 141, 139, 140, 140, 140, 140, 140, 139, 139, 138, 139, 138, 138, 137, 137, 136, 137, 136, 134, 134, 133, 133, 133, 131, 132, 130, 131, 131, 130, 130, 129, 129, 128, 126, 126, 125, 125, 123, 124, 122, 123, 122, 122, 121, 121, 119, 119, 118, 118, 117, 117, 116, 116, 115, 114, 115, 114, 114, 114, 113, 114, 113, 111, 113, 113, 111, 113, 111, 113, 111, 113, 113, 111, 113, 113, 111, 113, 113, 111, 113, 114, 113, 114, 114, 115, 115, 116, 116, 117, 117, 119, 118, 121, 121, 123, 123, 124, 125, 125, 128, 128, 129, 129, 131, 131, 132, 132, 134, 133, 136, 134, 137, 138, 137, 139, 138, 140, 140, 141, 142, 141, 144, 142, 145, 145, 145, 146, 146, 147, 147, 146, 147, 146, 147, 146, 147, 146, 147, 145, 146, 145, 145, 144, 144, 141, 142, 140, 140, 138, 139, 137, 137, 136, 134, 133, 132, 132, 130, 129, 129, 126, 126, 125, 123, 123, 121, 121, 118, 118, 116, 116, 114, 114, 111, 111, 110, 108, 109, 107, 107, 107, 106, 104, 104, 103, 103, 102, 103, 102, 103, 103, 101, 103, 102, 103, 102, 103, 103, 104, 103, 106, 106, 106, 108, 107, 109, 109, 111, 111, 114, 114, 116, 117, 118, 121, 122, 122, 125, 125, 128, 130, 130, 132, 133, 136, 136, 138, 138, 140, 140, 142, 142, 145, 145, 146, 146, 148, 147, 149, 148, 151, 149, 152, 151, 152, 152, 153, 153, 152, 154, 153, 154, 154, 152, 153, 152, 152, 151, 151, 149, 149, 147, 147, 145, 144, 142, 140, 140, 137, 137, 136, 133, 131, 131, 130, 126, 126, 124, 124, 121, 121, 119, 117, 117, 115, 115, 114, 111, 111, 109, 109, 107, 107, 106, 104, 104, 102, 102, 101, 101, 100, 101, 100, 99, 100, 99, 100, 100, 100, 101, 101, 101, 102, 102, 104, 104, 104, 107, 107, 108, 108, 110, 110, 113, 114, 114, 116, 116, 118, 118, 121, 122, 124, 124, 126, 128, 130, 131, 131, 134, 134, 137, 137, 139, 140, 140, 142, 142, 145, 145, 146, 146, 147, 147, 148, 148, 149, 148, 149, 148, 149, 149, 151, 151, 149, 151, 149, 148, 149, 148, 148, 147, 148, 147, 146, 146, 145, 144, 141, 142, 140, 140, 139, 137, 137, 134, 134, 132, 132, 131, 130, 129, 126, 126, 124, 124, 122, 122, 121, 119, 118, 118, 116, 116, 114, 115, 113, 111, 113, 110, 111, 110, 109, 109, 108, 109, 108, 107, 108, 107, 107, 108, 107, 108, 107, 108, 108, 109, 109, 109, 110, 109, 111, 110, 111, 113, 113, 114, 115, 116, 116, 117, 117, 118, 119, 119, 121, 121, 122, 123, 123, 124, 123, 125, 125, 128, 126, 129, 130, 130, 131, 132, 132, 133, 133, 136, 134, 137, 138, 137, 138, 138, 139, 140, 139, 140, 139, 140, 140, 140, 139, 140, 140, 140, 140, 139, 140, 139, 140, 139, 140, 140, 139, 140, 140, 139, 140, 140, 138, 139, 138, 139, 138, 137, 137, 137, 134, 136, 134, 133, 133, 133, 132, 130, 131, 129, 130, 128, 129, 126, 128, 126, 125, 125, 124, 125, 123, 124, 122, 123, 121, 122, 121, 119, 121, 118, 119, 118, 117, 117, 116, 116, 116, 114, 115, 115, 113, 114, 113, 113, 111, 113, 111, 113, 111, 113, 111, 113, 111, 113, 111, 113, 114, 113, 114, 113, 115, 114, 115, 115, 116, 115, 117, 116, 117, 117, 118, 118, 119, 119, 121, 121, 122, 123, 123, 124, 124, 126, 125, 128, 129, 129, 131, 130, 132, 132, 134, 134, 134, 137, 136, 138, 138, 139, 138, 140, 140, 141, 141, 141, 141, 142, 142, 144, 144, 144, 145, 145, 144, 145, 144, 146, 145, 146, 145, 146, 144, 145, 145, 144, 144, 142, 142, 142, 140, 140, 139, 139, 137, 137, 136, 133, 133, 132, 132, 130, 130, 128, 128, 126, 124, 124, 123, 123, 121, 121, 118, 118, 116, 116, 114, 115, 114, 111, 111, 110, 110, 108, 108, 106, 107, 104, 106, 103, 104, 103, 103, 102, 103, 103, 102, 103, 103, 104, 103, 106, 106, 106, 107, 107, 109, 109, 110, 110, 111, 114, 114, 116, 115, 116, 118, 119, 121, 122, 123, 123, 125, 126, 128, 130, 130, 132, 132, 134, 136, 136, 138, 138, 140, 141, 141, 144, 144, 146, 146, 147, 147, 148, 148, 149, 149, 151, 149, 151, 151, 149, 151, 149, 151, 149, 151, 148, 149, 147, 148, 146, 147, 146, 144, 145, 142, 142, 140, 140, 138, 138, 137, 134, 134, 132, 132, 130, 130, 128, 128, 125, 125, 123, 123, 122, 119, 119, 117, 117, 115, 115, 113, 113, 111, 109, 110, 108, 108, 107, 107, 104, 106, 103, 104, 103, 104, 102, 103, 103, 104, 104, 104, 103, 106, 104, 106, 106, 107, 107, 108, 109, 110, 109, 111, 110, 111, 114, 114, 116, 115, 117, 118, 118, 121, 121, 123, 124, 124, 126, 126, 130, 131, 132, 132, 134, 134, 134, 137, 137, 139, 140, 140, 140, 141, 141, 142, 144, 142, 145, 144, 145, 145, 146, 145, 146, 146, 145, 146, 145, 146, 146, 145, 146, 146, 145, 144, 145, 142, 144, 141, 142, 140, 141, 140, 139, 138, 137, 137, 134, 134, 133, 133, 132, 131, 130, 129, 128, 128, 125, 125, 123, 124, 123, 122, 122, 119, 119, 118, 118, 118, 117, 117, 117, 115, 116, 116, 114, 115, 114, 114, 114, 113, 114, 111, 113, 111, 113, 113, 110, 111, 110, 113, 111, 113, 113, 111, 114, 113, 114, 114, 115, 115, 115, 116, 116, 117, 116, 118, 118, 118, 118, 119, 119, 121, 121, 122, 121, 123, 122, 124, 124, 125, 125, 126, 126, 129, 129, 129, 131, 130, 131, 132, 132, 133, 134, 133, 134, 133, 136, 136, 136, 134, 137, 137, 137, 137, 137, 137, 138, 137, 138, 138, 139, 138, 140, 140, 140, 140, 139, 140, 140, 139, 140, 139, 140, 140, 138, 139, 138, 138, 137, 138, 136, 137, 136, 134, 136, 134, 133, 133, 132, 133, 131, 131, 131, 130, 130, 130, 128, 129, 126, 128, 125, 125, 124, 124, 122, 123, 121, 121, 121, 118, 118, 118, 116, 116, 116, 114, 115, 114, 114, 114, 113, 111, 113, 111, 110, 111, 110, 111, 110, 111, 110, 111, 111, 111, 111, 111, 110, 111, 111, 113, 113, 111, 114, 113, 114, 115, 114, 116, 116, 116, 117, 117, 118, 119, 119, 122, 122, 122, 124, 124, 126, 126, 128, 129, 130, 131, 132, 133, 134, 134, 136, 136, 138, 139, 139, 139, 141, 142, 141, 144, 142, 145, 145, 145, 146, 146, 147, 146, 147, 146, 148, 147, 148, 146, 147, 146, 146, 147, 145, 146, 145, 144, 144, 144, 141, 142, 140, 140, 138, 138, 138, 136, 136, 134, 133, 131, 131, 129, 129, 128, 126, 124, 123, 121, 121, 118, 118, 116, 116, 114, 115, 113, 113, 110, 110, 109, 109, 108, 108, 108, 106, 107, 106, 104, 106, 104, 103, 104, 103, 104, 104, 103, 104, 103, 104, 103, 106, 104, 106, 107, 108, 108, 108, 110, 110, 113, 111, 114, 116, 116, 118, 118, 121, 121, 123, 123, 126, 128, 128, 130, 130, 132, 132, 134, 134, 137, 137, 139, 139, 141, 140, 142, 144, 144, 144, 146, 145, 147, 146, 148, 147, 148, 148, 149, 148, 149, 149, 148, 149, 149, 148, 149, 147, 148, 146, 147, 145, 146, 144, 144, 142, 142, 141, 140, 138, 138, 137, 137, 136, 134, 133, 132, 130, 130, 129, 128, 125, 125, 123, 123, 121, 121, 118, 118, 117, 115, 115, 114, 113, 113, 110, 111, 109, 110, 108, 109, 108, 108, 107, 107, 108, 107, 108, 107, 108, 107, 108, 107, 108, 108, 109, 108, 109, 108, 110, 110, 109, 111, 110, 113, 113, 114, 114, 115, 116, 116, 118, 119, 119, 122, 122, 123, 123, 125, 126, 126, 129, 129, 131, 131, 132, 132, 134, 133, 136, 136, 137, 138, 137, 139, 138, 140, 140, 140, 141, 140, 142, 142, 141, 142, 142, 141, 144, 142, 141, 142, 141, 142, 142, 141, 142, 140, 141, 141, 140, 139, 140, 139, 139, 139, 138, 138, 137, 137, 136, 136, 134, 134, 134, 132, 132, 131, 131, 130, 129, 128, 126, 126, 124, 125, 124, 122, 123, 121, 121, 119, 119, 118, 119, 118, 117, 118, 116, 117, 116, 116, 115, 116, 115, 115, 115, 114, 115, 113, 114, 114, 113, 113, 114, 113, 114, 114, 113, 115, 114, 115, 114, 114, 116, 115, 116, 117, 116, 117, 117, 118, 118, 118, 119, 118, 121, 119, 121, 122, 121, 122, 122, 123, 123, 124, 125, 124, 126, 125, 128, 126, 129, 128, 130, 129, 131, 131, 131, 132, 132, 133, 133, 134, 134, 134, 136, 136, 136, 137, 136, 137, 137, 138, 138, 138, 139, 138, 139, 138, 140, 140, 139, 140, 139, 140, 140, 141, 141, 141, 140, 140, 139, 140, 139, 140, 138, 139, 137, 138, 137, 136, 136, 134, 134, 134, 133, 131, 132, 130, 131, 129, 129, 128, 128, 125, 126, 124, 125, 124, 123, 123, 121, 122, 121, 118, 119, 117, 117, 117, 115, 116, 114, 114, 114, 111, 113, 110, 111, 109, 110, 108, 109, 108, 109, 109, 108, 109, 108, 109, 108, 109, 108, 110, 110, 109, 111, 110, 113, 111, 114, 113, 115, 114, 116, 117, 116, 118, 118, 119, 119, 122, 122, 124, 124, 124, 126, 126, 129, 130, 130, 132, 132, 134, 134, 136, 136, 138, 138, 140, 140, 141, 141, 142, 144, 144, 145, 146, 145, 147, 147, 146, 147, 147, 148, 147, 148, 147, 148, 147, 148, 147, 148, 147, 146, 146, 145, 145, 144, 144, 142, 140, 141, 140, 138, 138, 136, 136, 133, 133, 131, 131, 129, 129, 126, 126, 124, 124, 123, 121, 121, 118, 119, 118, 116, 116, 114, 114, 111, 113, 110, 110, 108, 109, 107, 107, 107, 104, 106, 103, 104, 103, 103, 102, 103, 102, 103, 103, 103, 104, 103, 106, 106, 106, 107, 107, 109, 108, 110, 110, 113, 113, 115, 114, 116, 117, 117, 119, 121, 123, 123, 125, 125, 128, 128, 131, 131, 133, 133, 136, 137, 137, 139, 139, 141, 141, 142, 142, 145, 144, 146, 145, 146, 147, 146, 147, 147, 148, 147, 148, 147, 148, 148, 147, 148, 148, 148, 148, 147, 147, 146, 147, 145, 146, 144, 144, 142, 141, 141, 139, 139, 138, 136, 136, 134, 131, 131, 129, 129, 126, 126, 124, 124, 122, 121, 121, 119, 118, 117, 117, 115, 116, 114, 114, 114, 111, 113, 111, 110, 110, 110, 108, 109, 108, 108, 107, 108, 107, 107, 106, 107, 106, 107, 106, 107, 107, 108, 107, 109, 110, 109, 111, 110, 113, 113, 115, 115, 117, 116, 118, 118, 121, 121, 123, 123, 123, 125, 125, 126, 126, 129, 129, 130, 130, 132, 132, 132, 134, 133, 136, 136, 137, 138, 138, 139, 139, 140, 140, 141, 142, 142, 142, 142, 141, 142, 141, 142, 142, 141, 141, 140, 141, 140, 140, 138, 139, 137, 137, 138, 136, 137, 137, 136, 136, 134, 136, 136, 136, 133, 134, 133, 133, 132, 132, 131, 131, 130, 130, 130, 128, 128, 126, 126, 125, 124, 123, 123, 122, 122, 119, 121, 119, 119, 118, 119, 117, 118, 117, 118, 116, 117, 116, 117, 117, 117, 116, 117, 116, 117, 116, 117, 117, 117, 117, 116, 117, 116, 117, 117, 117, 118, 117, 118, 117, 118, 117, 118, 117, 118, 118, 119, 118, 119, 118, 121, 119, 121, 119, 122, 121, 123, 122, 123, 123, 124, 123, 125, 125, 126, 125, 126, 128, 126, 128, 128, 129, 128, 130, 130, 130, 131, 130, 132, 131, 133, 132, 134, 134, 133, 136, 134, 137, 137, 136, 137, 137, 138, 137, 138, 138, 137, 138, 138, 137, 138, 138, 137, 139, 138, 139, 139, 138, 139, 138, 139, 138, 139, 137, 138, 138, 138, 137, 137, 136, 134, 134, 133, 133, 133, 132, 130, 131, 130, 128, 129, 126, 128, 125, 126, 124, 125, 123, 124, 122, 122, 121, 121, 119, 119, 118, 118, 117, 116, 116, 114, 115, 114, 113, 113, 111, 111, 111, 109, 110, 109, 110, 110, 108, 109, 108, 109, 108, 109, 109, 110, 109, 110, 110, 111, 111, 113, 114, 114, 115, 115, 116, 117, 118, 118, 121, 119, 122, 122, 124, 125, 126, 128, 128, 129, 130, 131, 131, 132, 132, 134, 134, 136, 137, 138, 139, 140, 140, 141, 142, 144, 144, 145, 145, 146, 146, 146, 146, 147, 146, 147, 146, 147, 147, 146, 146, 146, 146, 146, 144, 145, 144, 145, 142, 144, 141, 142, 141, 140, 140, 139, 139, 137, 137, 134, 134, 131, 131, 129, 129, 125, 125, 124, 122, 121, 118, 118, 116, 117, 115, 115, 114, 114, 111, 113, 110, 111, 110, 109, 109, 108, 107, 108, 106, 107, 104, 106, 104, 103, 104, 103, 104, 104, 104, 104, 104, 106, 106, 107, 107, 109, 110, 109, 111, 113, 113, 115, 116, 117, 116, 118, 118, 121, 122, 122, 124, 124, 126, 126, 129, 129, 131, 132, 132, 134, 136, 136, 138, 138, 140, 139, 141, 141, 142, 144, 144, 145, 145, 146, 146, 147, 146, 147, 147, 148, 148, 147, 148, 147, 148, 148, 147, 148, 147, 146, 146, 145, 145, 142, 144, 142, 140, 140, 138, 138, 137, 137, 134, 134, 132, 133, 131, 131, 129, 129, 126, 128, 126, 124, 124, 122, 122, 119, 117, 117, 115, 115, 115, 113, 113, 110, 111, 109, 110, 109, 110, 109, 110, 110, 109, 110, 109, 110, 110, 109, 110, 109, 110, 110, 109, 110, 109, 110, 109, 110, 109, 110, 111, 111, 114, 113, 115, 116, 117, 117, 119, 119, 122, 122, 122, 124, 124, 126, 126, 128, 129, 129, 129, 130, 130, 131, 131, 132, 132, 134, 133, 136, 136, 137, 137, 138, 138, 139, 139, 140, 139, 140, 141, 140, 141, 140, 140, 139, 140, 139, 140, 139, 140, 139, 140, 140, 140, 139, 139, 138, 139, 138, 138, 137, 137, 137, 136, 136, 133, 133, 133, 132, 131, 130, 130, 129, 129, 128, 129, 128, 126, 128, 128, 128, 126, 126, 125, 126, 125, 124, 124, 123, 123, 122, 121, 119, 119, 117, 118, 116, 117, 116, 115, 116, 115, 117, 117, 116, 118, 117, 118, 118, 119, 118, 119, 119, 119, 117, 118, 117, 117, 116, 116, 116, 116, 115, 116, 115, 116, 116, 117, 116, 118, 118, 121, 121, 121, 123, 123, 123, 124, 124, 125, 124, 125, 124, 124, 123, 124, 124, 123, 124, 123, 125, 125, 125, 128, 126, 129, 129, 131, 131, 133, 134, 133, 136, 136, 134, 136, 134, 136, 134, 136, 134, 136, 134, 136, 134, 136, 134, 137, 137, 137, 138, 138, 140, 139, 141, 140, 141, 141, 140, 141, 139, 139, 138, 138, 137, 136, 134, 133, 132, 133, 131, 132, 131, 131, 132, 132, 133, 132, 133, 132, 132, 133, 131, 131, 130, 128, 128, 125, 124, 123, 119, 119, 117, 117, 115, 115, 115, 114, 115, 114, 116, 116, 116, 117, 117, 116, 117, 116, 116, 114, 114, 113, 110, 110, 107, 107, 106, 103, 104, 102, 104, 104, 104, 108, 108, 111, 113, 116, 117, 121, 122, 124, 125, 124, 125, 125, 123, 123, 121, 121, 118, 118, 117, 116, 115, 117, 117, 121, 122, 126, 130, 134, 138, 144, 146, 152, 153, 156, 156, 159, 157, 154, 153, 148, 145, 138, 133, 128, 123, 117, 115, 111, 110, 110, 111, 115, 119, 125, 133, 141, 149, 160, 167, 177, 184, 192, 197, 201, 201, 202, 199, 197, 191, 183, 172, 163, 151, 140, 126, 116, 106, 94, 86, 77, 72, 68, 65, 63, 63, 64, 68, 70, 74, 78, 84, 89, 93, 99, 102, 104, 109, 110, 114, 116, 116, 118, 117, 119, 119, 121, 122, 122, 124, 124, 126, 126, 129, 128, 130, 130, 131, 129, 130, 128, 128, 125, 125, 124, 122, 119, 118, 116, 116, 115, 114, 114, 113, 114, 113, 114, 113, 114, 113, 113, 111, 111, 110, 110, 108, 109, 108, 107, 109, 110, 110, 115, 118, 123, 129, 134, 140, 149, 156, 166, 174, 181, 187, 193, 199, 202, 202, 204, 202, 199, 194, 189, 182, 172, 164, 154, 147, 138, 130, 123, 118, 113, 111, 110, 110, 111, 115, 119, 124, 129, 134, 138, 144, 146, 149, 151, 149, 149, 145, 141, 136, 130, 122, 115, 107, 100, 92, 87, 81, 77, 76, 73, 74, 74, 78, 81, 87, 91, 98, 101, 108, 111, 116, 118, 122, 123, 123, 123, 121, 119, 117, 115, 110, 109, 104, 104, 101, 102, 101, 102, 104, 106, 109, 113, 116, 121, 124, 129, 131, 134, 138, 138, 140, 141, 140, 139, 139, 138, 134, 133, 131, 130, 129, 126, 128, 126, 128, 129, 130, 133, 134, 139, 141, 145, 148, 151, 154, 156, 159, 160, 160, 162, 161, 162, 161, 161, 160, 159, 155, 154, 152, 148, 147, 144, 141, 138, 136, 131, 129, 125, 122, 118, 114, 111, 107, 104, 101, 98, 95, 92, 91, 88, 88, 87, 88, 87, 89, 91, 92, 95, 96, 101, 102, 106, 109, 113, 115, 118, 119, 123, 124, 128, 130, 131, 134, 136, 139, 140, 145, 146, 151, 154, 157, 160, 164, 168, 172, 174, 178, 181, 183, 183, 185, 184, 184, 182, 181, 176, 172, 167, 163, 155, 151, 144, 137, 129, 122, 114, 108, 101, 93, 87, 80, 74, 70, 64, 58, 56, 51, 49, 44, 43, 40, 40, 38, 39, 38, 39, 39, 42, 44, 48, 50, 56, 61, 68, 73, 81, 87, 96, 104, 115, 123, 133, 141, 151, 161, 169, 178, 186, 194, 200, 207, 214, 217, 223, 227, 228, 230, 230, 230, 229, 227, 223, 222, 216, 213, 207, 202, 196, 190, 184, 176, 170, 162, 156, 149, 141, 136, 130, 122, 117, 110, 106, 100, 96, 91, 87, 83, 80, 76, 74, 72, 71, 69, 66, 68, 66, 68, 66, 68, 70, 70, 72, 74, 76, 79, 80, 85, 86, 91, 93, 98, 100, 102, 107, 109, 114, 115, 119, 121, 124, 128, 129, 131, 132, 134, 134, 137, 136, 137, 136, 137, 137, 134, 136, 133, 133, 131, 131, 130, 129, 129, 128, 129, 129, 129, 129, 131, 132, 134, 137, 139, 141, 144, 147, 151, 153, 156, 157, 161, 163, 164, 168, 168, 170, 170, 171, 171, 170, 170, 169, 169, 167, 164, 164, 161, 160, 157, 154, 153, 148, 146, 141, 139, 134, 131, 126, 121, 116, 111, 104, 100, 93, 88, 81, 78, 72, 66, 63, 59, 55, 54, 50, 50, 49, 51, 51, 55, 58, 61, 66, 71, 78, 83, 91, 96, 106, 113, 121, 129, 136, 145, 152, 160, 168, 174, 182, 187, 194, 199, 205, 208, 213, 216, 219, 220, 221, 220, 217, 216, 213, 209, 205, 198, 192, 183, 175, 167, 156, 147, 136, 126, 115, 106, 94, 86, 76, 66, 57, 50, 42, 34, 29, 23, 19, 14, 13, 10, 10, 10, 10, 12, 14, 19, 23, 28, 33, 41, 49, 56, 66, 76, 87, 96, 108, 118, 131, 142, 153, 166, 175, 186, 197, 206, 215, 223, 230, 235, 242, 245, 250, 251, 254, 255, 254, 254, 251, 250, 245, 243, 237, 230, 226, 217, 211, 202, 193, 184, 174, 164, 154, 142, 133, 122, 110, 101, 89, 80, 70, 62, 53, 47, 40, 34, 31, 26, 25, 24, 21, 24, 24, 27, 29, 34, 38, 43, 48, 54, 58, 66, 72, 78, 84, 88, 95, 100, 106, 110, 116, 121, 126, 130, 134, 138, 142, 145, 149, 152, 155, 156, 159, 160, 160, 161, 160, 161, 159, 157, 156, 153, 151, 147, 146, 142, 139, 137, 134, 131, 131, 129, 129, 128, 129, 128, 130, 131, 132, 136, 137, 140, 142, 146, 147, 152, 153, 156, 157, 159, 162, 162, 164, 163, 164, 166, 164, 164, 163, 163, 160, 160, 156, 155, 152, 149, 145, 142, 138, 134, 129, 123, 118, 113, 106, 101, 94, 89, 83, 77, 72, 66, 64, 58, 57, 55, 51, 51, 50, 51, 54, 54, 57, 59, 65, 69, 72, 79, 84, 91, 95, 103, 108, 116, 122, 130, 136, 145, 152, 159, 166, 174, 181, 189, 194, 201, 208, 213, 219, 222, 227, 229, 232, 232, 231, 231, 228, 226, 219, 215, 207, 200, 191, 183, 171, 162, 151, 140, 129, 117, 107, 95, 85, 74, 64, 55, 46, 38, 31, 23, 17, 10, 6, 2, 0, 0, 0, 0, 0, 0, 2, 6, 11, 18, 26, 33, 43, 53, 65, 74, 88, 99, 113, 124, 138, 148, 161, 172, 183, 193, 202, 212, 220, 227, 232, 239, 243, 247, 251, 253, 253, 255, 255, 253, 253, 250, 247, 243, 239, 234, 228, 221, 213, 205, 194, 186, 175, 166, 153, 144, 131, 121, 108, 99, 88, 78, 70, 61, 54, 47, 42, 36, 34, 29, 29, 28, 27, 29, 29, 33, 35, 38, 41, 44, 49, 53, 57, 61, 66, 71, 77, 81, 87, 92, 98, 106, 110, 117, 123, 129, 136, 141, 145, 152, 155, 160, 162, 166, 167, 169, 169, 170, 169, 168, 167, 163, 162, 157, 155, 152, 149, 145, 144, 140, 139, 136, 136, 134, 132, 133, 132, 133, 134, 134, 137, 138, 138, 140, 141, 144, 144, 146, 146, 148, 149, 149, 151, 152, 151, 153, 152, 153, 152, 152, 152, 151, 149, 147, 146, 142, 141, 139, 136, 131, 129, 124, 121, 116, 113, 108, 102, 99, 94, 91, 87, 83, 81, 77, 77, 74, 72, 73, 71, 73, 73, 73, 76, 77, 80, 84, 85, 89, 92, 98, 101, 107, 111, 116, 123, 128, 134, 139, 147, 153, 160, 166, 172, 177, 184, 189, 194, 197, 201, 202, 206, 206, 207, 205, 204, 201, 198, 193, 187, 181, 176, 169, 162, 154, 146, 138, 131, 122, 115, 106, 100, 92, 85, 78, 72, 65, 59, 55, 48, 44, 39, 36, 32, 29, 26, 26, 24, 25, 24, 27, 28, 33, 36, 43, 49, 57, 65, 76, 85, 95, 107, 118, 129, 142, 153, 166, 176, 185, 197, 205, 214, 220, 228, 232, 237, 242, 243, 245, 246, 246, 245, 243, 242, 237, 235, 230, 226, 221, 214, 208, 200, 194, 187, 178, 170, 162, 152, 144, 133, 124, 114, 106, 95, 87, 78, 71, 63, 55, 50, 44, 40, 36, 33, 32, 29, 29, 29, 32, 32, 35, 39, 40, 46, 48, 54, 57, 63, 68, 73, 78, 85, 89, 95, 100, 107, 113, 117, 124, 129, 136, 140, 146, 149, 155, 157, 162, 164, 168, 169, 170, 172, 171, 172, 170, 170, 168, 167, 164, 163, 161, 159, 156, 153, 152, 148, 147, 145, 142, 142, 141, 141, 140, 139, 138, 138, 137, 138, 136, 136, 137, 134, 136, 133, 134, 133, 133, 132, 131, 132, 130, 131, 131, 130, 131, 130, 129, 130, 128, 129, 126, 126, 126, 124, 122, 122, 118, 117, 115, 113, 109, 108, 104, 103, 100, 99, 95, 95, 94, 92, 92, 91, 92, 91, 92, 93, 94, 95, 95, 99, 100, 103, 104, 108, 109, 114, 116, 121, 123, 128, 132, 136, 140, 145, 149, 155, 159, 164, 170, 175, 178, 182, 186, 189, 192, 193, 196, 197, 196, 196, 193, 191, 186, 184, 178, 174, 168, 162, 155, 148, 140, 134, 126, 119, 111, 106, 100, 92, 87, 80, 76, 69, 64, 58, 56, 50, 47, 44, 41, 38, 36, 34, 34, 34, 33, 35, 36, 40, 43, 47, 53, 57, 64, 72, 79, 88, 96, 104, 116, 124, 136, 144, 155, 163, 174, 182, 189, 197, 202, 211, 214, 220, 224, 227, 228, 231, 230, 232, 230, 230, 228, 226, 222, 220, 214, 209, 206, 199, 194, 186, 181, 174, 166, 159, 151, 141, 134, 126, 118, 111, 102, 96, 89, 81, 77, 71, 65, 61, 57, 54, 51, 49, 49, 47, 48, 47, 49, 49, 53, 53, 57, 58, 63, 66, 70, 73, 76, 81, 85, 89, 93, 99, 103, 109, 113, 118, 122, 128, 131, 137, 139, 145, 147, 152, 154, 155, 159, 161, 161, 163, 162, 163, 162, 163, 161, 162, 160, 160, 156, 156, 155, 153, 153, 151, 149, 147, 147, 146, 146, 144, 144, 141, 141, 141, 139, 139, 138, 138, 137, 137, 137, 134, 136, 134, 133, 134, 133, 133, 133, 132, 132, 131, 131, 131, 129, 129, 126, 126, 123, 122, 121, 117, 116, 113, 111, 107, 106, 103, 100, 100, 96, 96, 94, 94, 93, 93, 93, 93, 94, 95, 96, 98, 100, 101, 104, 106, 109, 110, 114, 115, 119, 122, 124, 128, 131, 133, 137, 139, 144, 146, 151, 153, 157, 160, 164, 166, 170, 172, 172, 175, 175, 177, 177, 176, 174, 174, 171, 169, 166, 162, 157, 154, 148, 145, 140, 133, 130, 123, 119, 113, 109, 102, 99, 93, 89, 84, 80, 76, 73, 70, 65, 64, 62, 58, 58, 56, 56, 55, 57, 57, 59, 61, 65, 68, 73, 78, 81, 88, 94, 101, 107, 115, 121, 129, 136, 141, 149, 155, 163, 168, 175, 181, 184, 191, 193, 199, 201, 205, 207, 209, 209, 212, 211, 212, 209, 209, 206, 205, 201, 198, 193, 190, 184, 179, 172, 168, 160, 155, 147, 141, 134, 128, 121, 114, 107, 100, 94, 87, 84, 77, 73, 69, 65, 63, 59, 57, 56, 54, 55, 54, 55, 56, 57, 57, 61, 62, 66, 69, 73, 77, 80, 84, 88, 92, 98, 101, 107, 110, 116, 121, 123, 129, 131, 137, 140, 142, 147, 148, 152, 154, 155, 159, 159, 161, 161, 162, 161, 163, 162, 161, 162, 161, 160, 159, 156, 156, 155, 154, 153, 151, 148, 148, 146, 146, 145, 142, 142, 140, 140, 139, 138, 138, 137, 136, 133, 133, 132, 132, 131, 129, 130, 128, 128, 126, 125, 125, 123, 123, 121, 122, 119, 119, 117, 117, 116, 115, 114, 113, 111, 110, 109, 108, 107, 106, 104, 103, 101, 101, 99, 100, 99, 98, 99, 99, 99, 100, 100, 102, 104, 104, 108, 110, 111, 115, 117, 119, 123, 125, 128, 131, 133, 137, 139, 144, 145, 149, 152, 155, 156, 160, 162, 166, 167, 170, 171, 172, 175, 175, 175, 176, 174, 174, 171, 170, 167, 164, 161, 156, 152, 146, 142, 136, 131, 124, 119, 113, 108, 101, 98, 91, 87, 81, 78, 73, 71, 68, 64, 63, 61, 57, 57, 56, 56, 55, 57, 57, 59, 62, 64, 68, 70, 74, 78, 85, 91, 95, 102, 108, 116, 122, 130, 138, 144, 152, 159, 167, 172, 179, 184, 190, 194, 200, 202, 207, 208, 212, 212, 214, 213, 214, 213, 211, 211, 206, 205, 200, 197, 192, 187, 182, 177, 169, 164, 157, 149, 144, 136, 130, 122, 116, 108, 102, 96, 89, 85, 79, 74, 70, 68, 63, 62, 58, 58, 56, 56, 55, 56, 56, 58, 58, 62, 62, 65, 68, 71, 73, 78, 80, 86, 89, 94, 98, 103, 108, 113, 118, 123, 126, 132, 136, 140, 144, 146, 151, 152, 155, 156, 159, 159, 161, 160, 161, 160, 160, 159, 159, 156, 156, 154, 154, 153, 151, 151, 148, 148, 146, 147, 145, 145, 144, 144, 142, 142, 141, 141, 140, 139, 137, 137, 137, 134, 134, 134, 132, 132, 131, 131, 129, 130, 128, 129, 128, 128, 126, 126, 126, 124, 125, 124, 122, 122, 121, 118, 118, 116, 114, 114, 110, 110, 108, 107, 106, 103, 103, 101, 102, 101, 100, 101, 100, 102, 103, 102, 106, 107, 107, 110, 111, 115, 117, 119, 121, 124, 125, 130, 131, 134, 136, 140, 141, 145, 146, 149, 152, 154, 156, 156, 160, 161, 162, 163, 164, 163, 164, 163, 164, 162, 161, 160, 156, 155, 152, 149, 145, 141, 137, 133, 128, 124, 118, 115, 109, 104, 99, 95, 91, 87, 84, 79, 77, 73, 72, 70, 68, 68, 65, 66, 65, 68, 66, 70, 71, 72, 77, 78, 84, 86, 92, 95, 101, 106, 113, 117, 125, 130, 138, 145, 149, 157, 162, 169, 175, 179, 185, 189, 193, 196, 200, 201, 204, 204, 205, 204, 204, 201, 200, 197, 194, 191, 189, 183, 179, 176, 169, 166, 160, 155, 149, 145, 138, 133, 128, 123, 116, 111, 106, 101, 96, 89, 86, 83, 77, 74, 70, 69, 65, 64, 62, 62, 61, 62, 62, 63, 65, 65, 69, 70, 73, 76, 80, 83, 87, 91, 93, 98, 101, 106, 108, 114, 116, 121, 125, 129, 131, 136, 138, 141, 145, 147, 149, 151, 154, 154, 156, 156, 159, 157, 160, 160, 160, 159, 157, 157, 155, 156, 155, 153, 153, 152, 152, 149, 151, 149, 147, 148, 146, 146, 145, 145, 142, 144, 141, 141, 139, 139, 137, 137, 133, 133, 131, 131, 129, 129, 128, 126, 125, 124, 123, 122, 121, 119, 119, 117, 117, 115, 115, 114, 113, 110, 109, 107, 106, 103, 102, 100, 99, 98, 95, 95, 93, 94, 94, 93, 94, 94, 96, 98, 99, 101, 103, 107, 108, 113, 115, 119, 122, 126, 129, 133, 137, 139, 144, 146, 151, 153, 156, 159, 162, 164, 166, 168, 169, 170, 172, 172, 174, 172, 174, 172, 171, 170, 168, 166, 162, 160, 156, 153, 148, 145, 139, 136, 130, 126, 121, 115, 111, 104, 101, 96, 91, 88, 83, 80, 76, 73, 70, 69, 66, 63, 63, 62, 62, 62, 62, 62, 64, 65, 69, 71, 73, 78, 81, 87, 92, 96, 102, 107, 114, 121, 125, 132, 138, 145, 149, 156, 162, 167, 172, 177, 182, 185, 190, 192, 196, 198, 200, 201, 201, 202, 201, 202, 201, 198, 198, 193, 192, 189, 184, 181, 175, 171, 166, 161, 154, 149, 142, 138, 131, 126, 121, 114, 109, 102, 99, 93, 89, 85, 81, 78, 74, 73, 70, 69, 68, 68, 66, 66, 65, 68, 66, 69, 70, 72, 73, 77, 78, 81, 84, 87, 89, 94, 95, 100, 103, 108, 111, 115, 117, 122, 124, 129, 131, 134, 137, 140, 142, 145, 146, 148, 149, 152, 153, 153, 154, 154, 153, 154, 154, 154, 153, 154, 153, 154, 153, 153, 152, 153, 152, 153, 153, 152, 152, 151, 152, 151, 151, 149, 151, 149, 147, 147, 145, 145, 144, 142, 140, 138, 137, 134, 133, 130, 130, 126, 125, 123, 122, 118, 117, 115, 114, 111, 111, 108, 108, 106, 106, 103, 103, 101, 101, 100, 99, 99, 98, 96, 98, 95, 96, 95, 98, 98, 99, 99, 101, 101, 104, 107, 108, 111, 113, 116, 119, 123, 126, 130, 133, 137, 140, 144, 146, 148, 153, 154, 157, 161, 162, 164, 167, 167, 168, 168, 168, 169, 167, 167, 166, 163, 160, 159, 155, 153, 148, 146, 142, 138, 134, 130, 126, 121, 118, 113, 109, 104, 102, 96, 94, 89, 87, 84, 81, 78, 77, 74, 73, 72, 72, 71, 70, 72, 72, 74, 74, 78, 80, 83, 87, 89, 95, 99, 104, 109, 115, 119, 126, 132, 138, 141, 148, 153, 159, 162, 168, 171, 177, 179, 183, 185, 189, 189, 191, 192, 192, 193, 191, 192, 190, 189, 186, 185, 182, 179, 175, 172, 169, 166, 161, 156, 153, 147, 144, 137, 133, 128, 124, 117, 114, 108, 104, 100, 96, 92, 89, 86, 83, 79, 78, 76, 74, 73, 72, 72, 71, 72, 72, 73, 73, 76, 77, 79, 80, 81, 85, 86, 89, 92, 95, 99, 101, 103, 108, 110, 115, 117, 122, 125, 128, 131, 133, 138, 139, 142, 144, 147, 148, 152, 153, 154, 155, 155, 156, 156, 157, 156, 157, 156, 157, 155, 156, 155, 155, 155, 153, 154, 152, 153, 151, 152, 151, 149, 149, 148, 146, 146, 144, 144, 141, 140, 139, 137, 136, 133, 132, 131, 129, 128, 125, 124, 123, 119, 119, 117, 116, 115, 114, 111, 110, 108, 108, 104, 104, 102, 102, 100, 100, 98, 98, 98, 95, 96, 95, 96, 95, 98, 98, 99, 101, 102, 103, 107, 109, 111, 114, 116, 119, 122, 126, 128, 132, 133, 138, 140, 142, 146, 147, 149, 153, 154, 156, 157, 160, 161, 163, 163, 166, 164, 167, 166, 167, 164, 164, 164, 161, 161, 159, 155, 153, 149, 147, 142, 139, 134, 131, 125, 123, 117, 114, 108, 106, 100, 96, 93, 88, 87, 84, 80, 78, 76, 74, 72, 70, 70, 69, 70, 69, 70, 70, 72, 74, 77, 79, 83, 86, 89, 93, 99, 103, 108, 114, 118, 125, 130, 137, 141, 148, 154, 159, 164, 168, 172, 177, 179, 183, 186, 186, 190, 190, 192, 191, 193, 191, 192, 190, 190, 187, 187, 184, 183, 178, 177, 174, 169, 166, 162, 156, 153, 148, 141, 138, 132, 125, 122, 115, 111, 104, 101, 95, 93, 87, 85, 81, 80, 77, 76, 73, 73, 72, 72, 72, 72, 73, 73, 76, 74, 77, 78, 80, 80, 84, 85, 87, 89, 91, 95, 96, 101, 102, 107, 109, 114, 117, 119, 123, 128, 130, 134, 137, 140, 142, 146, 147, 149, 151, 153, 153, 155, 154, 156, 156, 155, 156, 155, 156, 156, 155, 154, 155, 154, 155, 154, 155, 154, 154, 154, 153, 153, 152, 151, 151, 148, 148, 146, 146, 144, 142, 140, 139, 137, 136, 133, 132, 130, 129, 126, 125, 124, 122, 121, 118, 117, 115, 114, 113, 110, 109, 107, 106, 104, 102, 101, 100, 98, 99, 96, 98, 98, 98, 96, 98, 98, 100, 100, 103, 103, 107, 108, 110, 111, 115, 116, 119, 121, 124, 126, 129, 130, 133, 134, 138, 139, 142, 144, 146, 148, 149, 152, 154, 156, 157, 159, 159, 161, 161, 161, 162, 160, 160, 160, 157, 156, 153, 152, 148, 146, 141, 139, 136, 132, 128, 124, 121, 116, 113, 109, 106, 102, 100, 95, 94, 91, 89, 86, 86, 84, 83, 80, 80, 80, 79, 78, 79, 80, 80, 83, 84, 85, 88, 89, 94, 98, 101, 106, 109, 116, 121, 124, 131, 137, 140, 147, 151, 156, 160, 166, 168, 171, 176, 178, 182, 182, 183, 185, 185, 186, 185, 186, 185, 183, 183, 181, 179, 176, 175, 171, 169, 164, 162, 157, 155, 151, 146, 142, 138, 132, 129, 122, 118, 113, 109, 103, 101, 95, 93, 88, 86, 83, 81, 79, 77, 74, 76, 74, 74, 74, 73, 76, 77, 77, 79, 79, 81, 83, 86, 88, 89, 93, 95, 96, 101, 102, 107, 108, 113, 115, 119, 122, 126, 128, 132, 134, 138, 141, 142, 146, 147, 151, 152, 153, 154, 155, 156, 157, 157, 157, 156, 157, 157, 156, 157, 156, 157, 155, 156, 155, 155, 155, 153, 153, 152, 151, 149, 147, 147, 145, 144, 141, 139, 138, 134, 133, 132, 130, 126, 126, 123, 123, 119, 119, 117, 117, 115, 115, 113, 113, 111, 110, 109, 107, 107, 104, 104, 103, 103, 101, 101, 100, 100, 99, 100, 100, 99, 100, 100, 102, 102, 104, 107, 108, 109, 113, 114, 117, 119, 123, 125, 128, 131, 132, 136, 138, 140, 142, 145, 146, 149, 151, 153, 154, 156, 157, 160, 159, 161, 161, 162, 162, 163, 162, 161, 161, 159, 157, 155, 154, 152, 147, 146, 141, 139, 134, 132, 128, 125, 121, 116, 114, 109, 107, 103, 101, 98, 94, 92, 88, 87, 86, 84, 81, 79, 79, 78, 78, 77, 76, 77, 78, 77, 80, 81, 84, 86, 88, 93, 95, 100, 104, 108, 114, 119, 123, 129, 133, 139, 145, 148, 154, 157, 162, 167, 169, 172, 176, 177, 181, 183, 183, 185, 185, 185, 186, 185, 185, 185, 183, 183, 181, 177, 176, 174, 170, 168, 164, 160, 157, 153, 147, 145, 139, 136, 129, 125, 119, 116, 111, 108, 102, 100, 95, 93, 88, 87, 84, 83, 80, 78, 78, 77, 76, 77, 76, 77, 76, 78, 78, 80, 80, 83, 83, 86, 87, 91, 92, 95, 96, 100, 102, 106, 109, 111, 115, 118, 122, 125, 128, 130, 134, 137, 139, 141, 145, 145, 148, 149, 152, 152, 154, 154, 155, 155, 156, 156, 155, 156, 155, 156, 154, 154, 155, 153, 154, 153, 153, 152, 152, 152, 149, 151, 149, 147, 147, 145, 145, 144, 141, 140, 138, 138, 136, 132, 132, 129, 128, 124, 124, 121, 119, 118, 115, 114, 113, 109, 109, 107, 107, 106, 102, 103, 102, 100, 100, 100, 99, 99, 99, 98, 100, 99, 101, 100, 102, 102, 106, 106, 109, 111, 111, 115, 116, 121, 123, 125, 128, 130, 132, 136, 137, 140, 140, 144, 145, 148, 148, 152, 152, 154, 155, 155, 157, 156, 159, 157, 159, 157, 157, 156, 156, 154, 153, 151, 148, 146, 142, 140, 136, 133, 129, 126, 123, 118, 116, 113, 108, 106, 101, 100, 95, 94, 93, 91, 89, 87, 87, 85, 86, 84, 85, 85, 86, 86, 87, 87, 89, 91, 93, 94, 98, 100, 101, 106, 108, 113, 115, 121, 123, 129, 133, 137, 141, 145, 151, 153, 159, 162, 164, 168, 170, 174, 175, 176, 178, 178, 177, 178, 178, 176, 177, 175, 174, 171, 170, 168, 166, 162, 161, 156, 155, 152, 147, 145, 140, 138, 134, 131, 128, 124, 118, 116, 113, 109, 106, 103, 99, 98, 95, 92, 92, 88, 88, 87, 86, 86, 86, 85, 86, 85, 87, 87, 87, 89, 89, 89, 92, 92, 95, 96, 98, 100, 102, 103, 107, 108, 111, 114, 117, 121, 122, 126, 128, 132, 133, 137, 139, 140, 144, 145, 145, 147, 147, 149, 148, 151, 149, 151, 149, 151, 149, 151, 151, 149, 152, 151, 152, 152, 152, 152, 152, 152, 151, 152, 151, 151, 148, 149, 147, 146, 145, 141, 141, 138, 137, 134, 133, 130, 129, 125, 125, 123, 121, 119, 117, 117, 114, 114, 111, 111, 109, 109, 108, 108, 106, 106, 104, 102, 103, 102, 100, 101, 100, 100, 99, 101, 100, 102, 102, 102, 106, 107, 108, 111, 113, 116, 118, 119, 124, 125, 130, 131, 134, 137, 140, 141, 144, 147, 148, 152, 153, 154, 156, 156, 159, 160, 160, 161, 161, 160, 161, 159, 159, 156, 156, 154, 153, 149, 148, 144, 142, 138, 136, 131, 129, 124, 122, 117, 115, 111, 109, 106, 102, 99, 96, 93, 92, 88, 88, 86, 85, 84, 83, 81, 81, 81, 81, 81, 81, 83, 84, 86, 88, 91, 93, 95, 99, 102, 107, 110, 114, 118, 123, 128, 131, 134, 140, 142, 148, 151, 155, 159, 162, 164, 167, 168, 171, 171, 175, 175, 176, 176, 177, 177, 177, 176, 177, 175, 174, 174, 171, 170, 168, 164, 163, 160, 157, 154, 149, 147, 144, 139, 136, 131, 128, 124, 118, 116, 111, 109, 106, 101, 100, 95, 94, 92, 91, 89, 87, 87, 86, 85, 86, 85, 86, 85, 86, 87, 86, 88, 88, 89, 89, 92, 92, 94, 95, 98, 98, 100, 101, 104, 104, 108, 109, 113, 115, 118, 119, 123, 125, 129, 131, 133, 137, 138, 140, 141, 145, 145, 148, 149, 151, 151, 152, 152, 153, 153, 154, 154, 154, 154, 155, 155, 154, 155, 154, 155, 155, 154, 155, 154, 154, 153, 154, 153, 151, 151, 148, 148, 146, 145, 142, 141, 139, 136, 132, 131, 128, 125, 122, 121, 117, 116, 114, 111, 108, 107, 106, 103, 103, 101, 101, 99, 100, 98, 99, 99, 98, 99, 98, 100, 99, 101, 102, 101, 104, 104, 107, 108, 110, 111, 115, 117, 119, 121, 124, 125, 130, 131, 134, 136, 139, 140, 144, 146, 147, 149, 151, 153, 154, 154, 155, 156, 155, 156, 155, 156, 154, 155, 153, 152, 149, 149, 146, 145, 141, 140, 137, 133, 131, 128, 125, 123, 118, 116, 113, 110, 108, 104, 102, 100, 98, 96, 94, 93, 92, 91, 91, 89, 89, 91, 91, 89, 92, 92, 94, 95, 96, 98, 101, 102, 106, 107, 111, 113, 117, 119, 124, 128, 130, 136, 138, 142, 145, 149, 152, 154, 157, 160, 163, 164, 166, 168, 168, 169, 170, 169, 170, 168, 169, 167, 167, 164, 164, 163, 161, 160, 156, 156, 153, 152, 149, 146, 145, 140, 139, 134, 133, 129, 126, 124, 121, 117, 114, 111, 108, 106, 102, 100, 96, 96, 93, 93, 91, 91, 89, 91, 89, 89, 91, 89, 92, 91, 93, 94, 94, 96, 96, 98, 100, 100, 102, 102, 104, 106, 108, 109, 111, 111, 115, 117, 118, 122, 124, 125, 129, 130, 133, 134, 137, 138, 141, 141, 145, 145, 147, 147, 149, 149, 152, 152, 152, 153, 152, 153, 152, 153, 152, 152, 152, 151, 151, 149, 149, 149, 147, 148, 147, 145, 145, 142, 142, 141, 140, 138, 136, 136, 132, 132, 129, 128, 125, 124, 122, 121, 118, 116, 115, 113, 111, 109, 108, 106, 106, 103, 103, 101, 102, 100, 101, 101, 100, 101, 101, 102, 102, 104, 104, 108, 108, 111, 114, 114, 117, 118, 122, 124, 125, 129, 130, 133, 136, 136, 139, 141, 141, 144, 145, 147, 148, 148, 151, 149, 152, 152, 153, 153, 153, 154, 153, 154, 153, 152, 152, 149, 149, 147, 146, 145, 141, 140, 137, 134, 131, 129, 125, 122, 119, 115, 113, 109, 107, 104, 100, 99, 95, 94, 92, 91, 88, 88, 86, 87, 86, 86, 87, 86, 88, 87, 89, 91, 92, 94, 95, 99, 100, 103, 106, 108, 111, 114, 118, 121, 125, 129, 131, 137, 139, 144, 148, 151, 155, 157, 162, 163, 167, 168, 171, 172, 175, 175, 176, 177, 176, 176, 175, 175, 174, 170, 170, 168, 166, 163, 161, 157, 154, 153, 148, 146, 142, 140, 136, 134, 130, 128, 124, 122, 119, 115, 114, 110, 107, 106, 102, 101, 98, 96, 94, 93, 91, 91, 89, 89, 88, 88, 88, 87, 88, 88, 89, 89, 92, 92, 92, 94, 94, 96, 96, 100, 101, 101, 104, 104, 108, 110, 111, 115, 116, 119, 121, 124, 126, 128, 131, 133, 137, 139, 140, 142, 144, 147, 147, 149, 151, 153, 152, 154, 154, 155, 155, 156, 155, 156, 155, 156, 155, 156, 154, 155, 154, 154, 153, 152, 152, 151, 148, 148, 145, 145, 142, 140, 139, 136, 136, 133, 130, 129, 125, 125, 123, 119, 119, 116, 115, 114, 111, 110, 108, 108, 106, 106, 104, 103, 101, 101, 101, 100, 100, 99, 98, 99, 99, 100, 100, 102, 103, 104, 106, 108, 109, 113, 114, 117, 118, 123, 125, 126, 130, 132, 136, 138, 139, 142, 142, 146, 147, 147, 149, 149, 152, 153, 153, 154, 154, 154, 153, 154, 153, 154, 152, 153, 152, 151, 148, 147, 145, 142, 140, 137, 136, 131, 130, 125, 123, 119, 117, 113, 110, 107, 104, 102, 99, 99, 95, 95, 93, 93, 92, 89, 91, 91, 89, 91, 91, 93, 93, 94, 94, 98, 98, 101, 103, 104, 108, 109, 113, 116, 119, 123, 125, 129, 132, 136, 139, 142, 145, 149, 151, 155, 156, 160, 161, 163, 164, 167, 167, 168, 168, 169, 168, 169, 167, 168, 166, 166, 163, 163, 161, 160, 157, 156, 153, 152, 149, 146, 145, 140, 139, 134, 132, 129, 124, 122, 118, 116, 113, 108, 107, 102, 101, 99, 96, 95, 93, 92, 91, 89, 89, 89, 88, 89, 88, 89, 89, 91, 91, 93, 93, 95, 96, 96, 99, 99, 102, 103, 104, 108, 109, 113, 115, 116, 119, 122, 124, 126, 130, 131, 134, 137, 138, 141, 142, 144, 146, 146, 148, 148, 151, 149, 152, 151, 152, 152, 153, 152, 153, 152, 153, 151, 152, 152, 151, 151, 149, 149, 147, 148, 146, 146, 144, 142, 140, 140, 137, 137, 133, 133, 130, 130, 126, 126, 123, 123, 119, 119, 117, 117, 115, 115, 111, 111, 110, 110, 109, 107, 107, 106, 104, 104, 104, 102, 103, 103, 102, 103, 103, 104, 104, 107, 108, 108, 111, 113, 114, 117, 117, 121, 122, 125, 128, 129, 132, 133, 137, 138, 140, 141, 144, 145, 147, 148, 149, 149, 152, 152, 153, 154, 153, 154, 154, 153, 154, 153, 153, 153, 152, 148, 148, 145, 145, 140, 138, 137, 132, 131, 126, 124, 119, 117, 113, 110, 108, 103, 102, 99, 95, 94, 93, 91, 89, 87, 87, 86, 86, 86, 85, 86, 86, 86, 88, 88, 91, 92, 94, 96, 98, 102, 103, 108, 111, 114, 118, 123, 125, 130, 133, 138, 141, 146, 151, 153, 157, 159, 163, 164, 168, 169, 172, 174, 174, 176, 176, 177, 177, 176, 176, 175, 174, 172, 171, 168, 168, 164, 163, 160, 157, 154, 152, 147, 145, 140, 138, 133, 131, 126, 123, 121, 116, 114, 109, 106, 104, 100, 99, 96, 94, 93, 91, 88, 88, 86, 86, 86, 84, 85, 84, 85, 84, 86, 85, 87, 87, 89, 89, 92, 93, 94, 96, 98, 101, 102, 106, 108, 109, 114, 115, 118, 121, 124, 125, 130, 131, 134, 137, 138, 140, 142, 142, 146, 146, 148, 149, 151, 151, 152, 152, 154, 153, 155, 155, 156, 155, 156, 155, 157, 157, 157, 155, 156, 155, 155, 154, 152, 152, 149, 149, 146, 146, 144, 141, 140, 137, 136, 132, 131, 130, 128, 125, 122, 122, 119, 117, 116, 114, 114, 111, 110, 109, 107, 107, 106, 103, 103, 101, 102, 101, 99, 100, 99, 100, 100, 99, 101, 100, 102, 103, 104, 106, 108, 109, 113, 114, 117, 118, 122, 124, 128, 129, 132, 133, 137, 139, 140, 144, 144, 147, 147, 149, 149, 152, 152, 153, 153, 154, 154, 153, 154, 154, 153, 153, 151, 151, 148, 146, 146, 142, 141, 139, 136, 134, 130, 129, 124, 123, 118, 117, 113, 111, 109, 106, 102, 101, 99, 98, 95, 94, 92, 92, 91, 89, 91, 89, 91, 89, 92, 91, 93, 94, 96, 98, 100, 101, 104, 108, 110, 113, 117, 119, 124, 128, 131, 134, 137, 141, 144, 148, 151, 155, 157, 160, 161, 164, 164, 168, 169, 168, 170, 170, 169, 170, 169, 169, 169, 167, 167, 164, 162, 161, 160, 156, 155, 152, 149, 146, 144, 140, 138, 134, 132, 128, 125, 122, 119, 115, 114, 110, 107, 104, 101, 100, 98, 96, 94, 94, 92, 92, 89, 91, 91, 89, 91, 89, 91, 92, 91, 93, 92, 94, 94, 96, 96, 99, 100, 102, 104, 104, 108, 110, 111, 113, 116, 117, 121, 123, 126, 129, 130, 133, 134, 138, 139, 140, 144, 144, 146, 147, 147, 149, 149, 151, 151, 152, 151, 152, 151, 152, 152, 151, 152, 151, 152, 151, 151, 151, 149, 149, 148, 148, 147, 145, 145, 142, 142, 141, 138, 138, 136, 132, 132, 129, 128, 125, 124, 122, 119, 118, 116, 115, 113, 113, 111, 110, 109, 107, 107, 106, 104, 106, 103, 104, 103, 104, 103, 104, 103, 106, 104, 107, 107, 109, 109, 110, 114, 114, 117, 117, 121, 123, 124, 128, 129, 132, 132, 136, 137, 140, 140, 144, 145, 145, 147, 149, 149, 151, 152, 151, 153, 152, 152, 153, 152, 153, 151, 151, 149, 149, 147, 146, 145, 141, 140, 137, 136, 131, 130, 125, 123, 118, 117, 114, 110, 107, 104, 101, 100, 96, 95, 93, 92, 91, 89, 88, 89, 88, 89, 88, 89, 89, 92, 92, 94, 94, 96, 98, 101, 101, 104, 108, 110, 111, 116, 118, 123, 125, 130, 132, 137, 140, 144, 148, 151, 155, 159, 162, 163, 167, 169, 170, 172, 172, 175, 174, 175, 174, 175, 172, 172, 170, 170, 167, 167, 163, 161, 160, 156, 154, 152, 148, 146, 141, 140, 137, 132, 130, 126, 123, 119, 117, 113, 110, 106, 104, 101, 98, 96, 93, 93, 89, 89, 87, 87, 87, 86, 87, 87, 86, 87, 87, 88, 88, 89, 92, 92, 94, 94, 98, 98, 100, 101, 103, 106, 107, 110, 111, 115, 117, 118, 122, 123, 126, 130, 131, 134, 136, 139, 140, 141, 144, 145, 147, 148, 148, 151, 151, 152, 152, 153, 153, 154, 154, 155, 154, 154, 155, 155, 155, 155, 154, 155, 154, 153, 153, 151, 151, 148, 147, 146, 144, 142, 141, 138, 137, 133, 132, 130, 129, 126, 124, 121, 121, 117, 115, 115, 111, 111, 108, 108, 107, 104, 104, 102, 102, 100, 100, 98, 99, 98, 98, 96, 98, 98, 99, 99, 101, 101, 104, 104, 108, 109, 113, 114, 116, 121, 122, 125, 128, 131, 132, 137, 138, 141, 144, 146, 147, 149, 152, 153, 154, 154, 156, 156, 157, 157, 159, 157, 159, 156, 157, 155, 155, 154, 151, 151, 148, 146, 142, 139, 137, 134, 131, 128, 123, 121, 116, 115, 111, 107, 106, 101, 100, 96, 95, 92, 92, 89, 89, 88, 88, 86, 87, 87, 88, 87, 89, 89, 92, 94, 94, 98, 99, 102, 104, 106, 110, 113, 115, 119, 122, 126, 129, 133, 136, 140, 142, 147, 149, 154, 155, 160, 161, 164, 166, 168, 170, 170, 172, 171, 174, 172, 172, 171, 171, 170, 168, 167, 164, 163, 161, 157, 156, 153, 149, 147, 144, 141, 138, 133, 132, 128, 125, 123, 118, 116, 113, 110, 107, 106, 102, 101, 99, 96, 94, 94, 93, 91, 91, 89, 89, 88, 88, 89, 89, 91, 92, 93, 94, 95, 95, 99, 99, 101, 102, 106, 107, 108, 111, 113, 114, 117, 118, 121, 122, 125, 125, 129, 131, 132, 132, 136, 136, 138, 138, 140, 141, 142, 144, 144, 145, 145, 145, 147, 147, 148, 148, 149, 148, 151, 149, 151, 151, 152, 151, 151, 149, 151, 151, 148, 148, 148, 146, 146, 145, 141, 141, 140, 137, 136, 133, 132, 130, 129, 125, 125, 123, 121, 119, 118, 115, 115, 114, 113, 110, 109, 107, 107, 104, 106, 103, 103, 102, 102, 101, 101, 102, 101, 102, 103, 104, 104, 107, 107, 109, 110, 114, 115, 118, 119, 122, 125, 126, 130, 131, 134, 136, 138, 141, 142, 145, 147, 148, 149, 149, 152, 153, 153, 153, 154, 154, 154, 153, 153, 152, 152, 151, 148, 148, 146, 145, 142, 139, 138, 134, 132, 130, 125, 124, 119, 117, 115, 110, 109, 106, 102, 101, 98, 96, 95, 93, 92, 91, 88, 89, 87, 88, 87, 88, 89, 89, 92, 92, 94, 95, 98, 99, 102, 104, 108, 110, 114, 116, 121, 124, 126, 132, 136, 139, 142, 146, 148, 153, 155, 159, 160, 162, 166, 167, 169, 169, 171, 171, 172, 171, 172, 171, 171, 170, 169, 167, 167, 164, 163, 161, 157, 156, 153, 151, 148, 144, 142, 138, 136, 131, 130, 125, 123, 118, 116, 113, 110, 108, 103, 102, 99, 98, 95, 94, 92, 91, 88, 89, 88, 88, 87, 86, 87, 88, 88, 88, 89, 89, 92, 92, 95, 95, 98, 100, 101, 104, 104, 108, 109, 113, 116, 118, 121, 123, 124, 128, 129, 132, 134, 136, 137, 140, 140, 142, 142, 146, 146, 148, 147, 149, 149, 151, 151, 152, 152, 153, 153, 154, 154, 153, 154, 153, 154, 152, 153, 151, 152, 149, 149, 148, 146, 146, 144, 142, 140, 140, 138, 136, 134, 132, 131, 129, 128, 125, 125, 122, 122, 118, 118, 117, 114, 114, 111, 111, 108, 108, 107, 106, 104, 102, 102, 100, 101, 99, 100, 99, 100, 100, 100, 101, 101, 103, 103, 106, 108, 108, 111, 113, 116, 117, 121, 122, 126, 128, 130, 133, 134, 138, 139, 142, 144, 147, 147, 151, 151, 153, 153, 155, 154, 156, 156, 156, 155, 156, 154, 155, 153, 153, 151, 149, 147, 146, 144, 140, 139, 136, 134, 131, 129, 125, 123, 119, 117, 113, 111, 107, 106, 102, 101, 98, 95, 94, 92, 89, 89, 88, 87, 87, 87, 86, 88, 87, 89, 91, 93, 95, 96, 100, 101, 104, 107, 110, 113, 117, 121, 122, 126, 129, 133, 136, 140, 141, 146, 149, 152, 154, 156, 160, 162, 163, 166, 167, 168, 170, 169, 171, 170, 171, 171, 170, 169, 169, 166, 166, 163, 160, 159, 155, 153, 149, 147, 144, 140, 138, 133, 131, 126, 124, 121, 118, 115, 113, 109, 106, 104, 101, 101, 98, 98, 94, 94, 92, 92, 91, 91, 89, 91, 91, 89, 92, 91, 93, 94, 94, 96, 96, 100, 100, 102, 103, 107, 107, 110, 111, 114, 115, 118, 121, 121, 124, 125, 128, 130, 130, 133, 133, 137, 138, 138, 140, 140, 142, 142, 145, 145, 146, 146, 147, 146, 147, 147, 148, 147, 148, 147, 148, 146, 147, 147, 147, 147, 146, 146, 145, 145, 144, 144, 144, 142, 141, 140, 139, 139, 136, 136, 133, 133, 131, 130, 129, 126, 125, 122, 122, 121, 119, 117, 115, 115, 114, 113, 113, 110, 110, 109, 110, 108, 109, 109, 109, 108, 109, 109, 109, 109, 110, 110, 110, 111, 113, 113, 114, 115, 116, 116, 119, 119, 122, 123, 126, 126, 130, 131, 132, 136, 137, 139, 141, 141, 144, 145, 147, 146, 148, 148, 149, 148, 149, 148, 149, 148, 148, 147, 146, 146, 142, 142, 140, 139, 137, 136, 132, 131, 128, 126, 124, 121, 118, 115, 114, 110, 108, 106, 103, 101, 100, 96, 96, 94, 94, 93, 91, 92, 91, 91, 93, 92, 94, 94, 98, 99, 100, 103, 104, 108, 110, 113, 115, 118, 121, 125, 128, 130, 134, 137, 141, 144, 147, 151, 152, 155, 159, 161, 162, 163, 166, 168, 169, 169, 169, 170, 170, 169, 168, 168, 166, 166, 163, 162, 160, 157, 156, 153, 149, 148, 145, 142, 139, 137, 133, 131, 126, 124, 119, 117, 115, 110, 109, 104, 103, 100, 98, 95, 94, 92, 89, 89, 87, 88, 86, 87, 86, 88, 87, 89, 91, 91, 94, 94, 96, 98, 100, 101, 103, 106, 107, 109, 110, 114, 115, 116, 119, 121, 124, 125, 126, 130, 131, 134, 136, 138, 139, 141, 142, 145, 145, 148, 147, 149, 149, 151, 149, 152, 152, 151, 149, 151, 148, 149, 148, 148, 147, 147, 146, 146, 146, 145, 144, 144, 141, 142, 141, 140, 139, 139, 137, 137, 136, 133, 131, 131, 128, 128, 126, 123, 123, 121, 121, 118, 118, 116, 116, 114, 114, 114, 111, 111, 110, 110, 110, 110, 108, 109, 108, 108, 107, 108, 107, 108, 108, 108, 107, 109, 109, 110, 110, 113, 114, 116, 116, 119, 122, 123, 124, 128, 129, 131, 133, 136, 137, 139, 140, 140, 142, 142, 145, 145, 146, 146, 147, 148, 148, 147, 149, 148, 149, 147, 148, 148, 147, 147, 145, 145, 142, 141, 140, 137, 137, 133, 131, 129, 126, 123, 121, 117, 115, 111, 110, 108, 104, 103, 101, 100, 98, 95, 95, 95, 94, 93, 94, 93, 94, 94, 95, 95, 98, 98, 100, 101, 103, 104, 108, 109, 113, 115, 117, 121, 123, 128, 130, 133, 137, 140, 141, 146, 148, 152, 153, 157, 159, 161, 162, 164, 164, 167, 168, 167, 168, 168, 167, 167, 166, 166, 163, 162, 160, 159, 155, 154, 151, 149, 146, 144, 140, 138, 134, 132, 129, 125, 123, 118, 116, 113, 110, 107, 106, 102, 101, 98, 98, 94, 94, 92, 93, 92, 92, 91, 92, 91, 93, 92, 94, 95, 96, 98, 99, 101, 101, 104, 104, 108, 109, 110, 113, 114, 117, 119, 121, 123, 125, 125, 129, 130, 132, 133, 136, 136, 138, 138, 140, 140, 141, 141, 142, 142, 144, 142, 145, 145, 144, 145, 145, 144, 145, 144, 145, 144, 145, 144, 144, 142, 144, 142, 141, 141, 140, 140, 139, 139, 137, 137, 136, 134, 134, 132, 132, 130, 130, 128, 128, 128, 125, 125, 124, 123, 123, 121, 121, 119, 119, 118, 117, 117, 116, 115, 115, 113, 114, 113, 111, 111, 110, 110, 109, 110, 109, 110, 109, 111, 110, 113, 113, 115, 115, 117, 117, 119, 121, 123, 125, 125, 128, 130, 130, 132, 133, 136, 136, 138, 138, 140, 141, 142, 142, 145, 144, 146, 145, 146, 145, 146, 145, 146, 145, 145, 142, 144, 141, 140, 139, 137, 136, 132, 131, 129, 125, 124, 121, 119, 116, 115, 111, 110, 107, 106, 103, 102, 101, 100, 99, 98, 96, 95, 95, 95, 95, 95, 96, 96, 96, 99, 99, 101, 102, 104, 107, 108, 111, 115, 116, 121, 123, 126, 129, 132, 137, 139, 144, 145, 149, 153, 154, 157, 159, 162, 164, 164, 167, 167, 169, 169, 169, 169, 168, 168, 167, 166, 164, 163, 161, 159, 155, 154, 151, 148, 145, 144, 140, 136, 134, 130, 129, 125, 122, 118, 116, 113, 111, 108, 104, 103, 101, 100, 98, 95, 95, 94, 93, 93, 92, 91, 92, 91, 92, 92, 93, 93, 94, 94, 96, 96, 100, 100, 103, 103, 107, 107, 110, 111, 115, 117, 117, 121, 122, 125, 128, 129, 132, 132, 136, 137, 138, 140, 140, 142, 142, 145, 144, 146, 146, 146, 147, 146, 147, 146, 147, 147, 145, 146, 145, 146, 146, 146, 145, 145, 144, 145, 144, 144, 144, 142, 142, 140, 141, 139, 139, 137, 137, 134, 134, 133, 130, 130, 129, 128, 125, 125, 123, 123, 122, 119, 119, 118, 117, 117, 116, 116, 115, 114, 114, 113, 113, 113, 110, 110, 109, 109, 108, 108, 107, 108, 108, 108, 107, 108, 109, 109, 111, 111, 114, 114, 117, 118, 121, 123, 125, 126, 128, 131, 132, 134, 136, 138, 138, 141, 141, 144, 144, 145, 146, 147, 146, 148, 147, 148, 147, 148, 147, 147, 147, 146, 144, 145, 141, 141, 139, 138, 137, 133, 132, 129, 128, 124, 123, 119, 117, 114, 113, 109, 109, 106, 104, 103, 101, 101, 99, 99, 96, 98, 98, 98, 98, 98, 96, 99, 99, 101, 101, 103, 106, 106, 109, 110, 114, 115, 119, 121, 125, 128, 130, 133, 136, 139, 141, 142, 147, 147, 151, 152, 154, 155, 157, 157, 160, 160, 160, 161, 160, 161, 160, 161, 160, 160, 159, 159, 156, 156, 153, 153, 149, 149, 147, 142, 141, 138, 134, 133, 129, 126, 123, 121, 117, 115, 110, 109, 106, 104, 103, 102, 100, 99, 99, 96, 98, 96, 98, 96, 98, 96, 99, 98, 100, 100, 101, 101, 103, 103, 103, 106, 107, 108, 109, 111, 113, 114, 116, 117, 119, 122, 123, 125, 126, 130, 130, 133, 133, 136, 136, 137, 139, 139, 140, 140, 141, 141, 141, 141, 141, 140, 141, 140, 141, 140, 141, 141, 140, 141, 140, 141, 140, 141, 140, 141, 139, 140, 139, 139, 138, 138, 136, 136, 134, 134, 132, 132, 131, 131, 129, 129, 128, 128, 125, 126, 124, 125, 124, 123, 123, 122, 122, 119, 121, 118, 119, 117, 117, 116, 115, 115, 114, 114, 113, 114, 111, 113, 111, 114, 114, 113, 115, 115, 116, 117, 117, 119, 121, 122, 123, 123, 126, 128, 129, 130, 131, 132, 133, 134, 133, 136, 136, 138, 138, 139, 139, 140, 140, 141, 141, 142, 141, 142, 142, 141, 142, 141, 141, 140, 140, 139, 136, 136, 133, 132, 130, 129, 126, 124, 121, 121, 117, 116, 113, 111, 108, 108, 104, 104, 101, 101, 99, 100, 98, 98, 99, 98, 99, 99, 100, 100, 102, 102, 106, 106, 109, 109, 113, 114, 116, 119, 122, 123, 128, 129, 132, 133, 138, 139, 142, 144, 147, 148, 152, 153, 155, 156, 159, 159, 161, 161, 163, 163, 163, 162, 163, 161, 162, 160, 160, 157, 156, 154, 153, 149, 148, 146, 142, 140, 137, 136, 133, 130, 126, 125, 121, 119, 117, 114, 113, 109, 108, 104, 104, 101, 101, 99, 99, 96, 96, 95, 94, 95, 94, 95, 95, 94, 96, 95, 98, 99, 100, 100, 102, 102, 104, 106, 108, 109, 111, 114, 116, 117, 119, 121, 124, 124, 128, 130, 130, 133, 133, 137, 137, 139, 139, 141, 142, 142, 144, 144, 145, 144, 145, 144, 145, 145, 144, 145, 145, 142, 144, 144, 144, 144, 144, 144, 142, 144, 142, 142, 142, 141, 141, 140, 140, 139, 137, 137, 136, 134, 132, 130, 130, 128, 128, 125, 125, 123, 123, 121, 121, 121, 118, 119, 118, 118, 118, 117, 116, 116, 116, 116, 115, 115, 113, 114, 113, 111, 111, 110, 111, 110, 111, 110, 113, 113, 113, 115, 115, 117, 117, 119, 121, 122, 124, 125, 126, 129, 130, 130, 133, 133, 136, 136, 137, 139, 140, 139, 141, 141, 142, 144, 142, 145, 145, 144, 145, 144, 144, 144, 141, 141, 139, 139, 137, 134, 134, 131, 130, 128, 126, 123, 123, 119, 119, 117, 115, 115, 113, 110, 110, 108, 108, 106, 106, 104};&lt;br /&gt;
const uint16_t sizeMusique=sizeof musique;&lt;br /&gt;
// pour lire le tableau, avec i variant de 0 à sizeMusique&lt;br /&gt;
// OCR4A=pgm_read_byte(musique+i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Jouons des notes=&lt;br /&gt;
&lt;br /&gt;
On va réaliser un modeste piano en utilisant 4 boutons.&lt;br /&gt;
&lt;br /&gt;
Connectez ces 4 boutons à votre carte Leonardo, en utilisant 1 seul PORT :&lt;br /&gt;
&lt;br /&gt;
[[Media:LeonardoPinout.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme qui change la fréquence de la sinusoïde (valeur de OCR1A) suivant le bouton appuyé.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Note || Do || Do# || Ré || Ré# || Mi || Fa || Fa# || Sol || Sol# || La || La# || Si&lt;br /&gt;
|-&lt;br /&gt;
! Fréquence (Hz) || 261,63 || 277,18 || 293,66 || 311,13 || 329,63 || 349,23 || 369,99 || 392 || 415,3 || 440 || 466,16 || 493,88&lt;br /&gt;
|-&lt;br /&gt;
! Période (µs)   || 3822   || 3608   || 3405   || 3214   || 3037   || 2863   || 2703   || 2551|| 2408  || 2273|| 2145   || 2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Stevie Wonder - I'm free=&lt;br /&gt;
&lt;br /&gt;
Les premières secondes de cette chanson échantillonnée à 4kHz :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
const uint8_t musique[] PROGMEM={127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 128, 127, 127, 127, 128, 128, 128, 129, 131, 136, 139, 139, 143, 141, 142, 144, 141, 139, 137, 137, 126, 122, 117, 100, 96, 86, 86, 84, 83, 85, 87, 88, 90, 90, 94, 98, 103, 108, 121, 130, 144, 143, 152, 161, 170, 178, 182, 189, 191, 195, 194, 194, 194, 191, 187, 181, 176, 169, 163, 158, 149, 141, 131, 125, 119, 112, 107, 98, 92, 89, 86, 83, 85, 83, 84, 85, 86, 88, 88, 93, 96, 98, 100, 102, 106, 109, 109, 109, 108, 108, 109, 112, 116, 124, 128, 132, 138, 142, 146, 152, 156, 159, 164, 168, 170, 171, 169, 168, 166, 164, 161, 158, 156, 152, 147, 141, 137, 128, 121, 117, 111, 108, 106, 102, 97, 92, 88, 83, 83, 82, 84, 84, 91, 93, 93, 95, 97, 99, 104, 108, 112, 115, 116, 116, 116, 121, 123, 126, 130, 137, 142, 146, 151, 153, 154, 160, 158, 160, 158, 159, 160, 162, 164, 164, 162, 161, 159, 157, 158, 161, 164, 170, 171, 170, 170, 163, 163, 159, 160, 157, 157, 153, 146, 138, 135, 127, 126, 121, 125, 123, 124, 121, 118, 120, 120, 115, 117, 114, 113, 112, 111, 104, 98, 97, 90, 86, 82, 83, 79, 85, 88, 86, 87, 92, 88, 95, 95, 100, 98, 106, 103, 104, 112, 118, 110, 115, 115, 117, 114, 125, 130, 137, 155, 158, 152, 150, 142, 137, 137, 143, 144, 147, 153, 135, 124, 116, 112, 107, 123, 137, 143, 153, 157, 142, 140, 134, 132, 128, 138, 137, 131, 131, 120, 105, 107, 101, 99, 99, 109, 108, 111, 126, 117, 117, 125, 122, 120, 121, 128, 128, 133, 140, 128, 130, 123, 116, 115, 126, 131, 133, 150, 152, 149, 157, 152, 153, 153, 162, 159, 157, 165, 154, 150, 150, 140, 139, 139, 143, 138, 146, 158, 147, 157, 155, 148, 147, 149, 150, 145, 155, 154, 138, 139, 124, 112, 105, 109, 106, 108, 121, 115, 111, 115, 105, 102, 103, 109, 102, 104, 111, 96, 96, 97, 87, 85, 87, 88, 83, 95, 99, 89, 100, 99, 95, 93, 98, 96, 99, 116, 114, 111, 123, 118, 115, 119, 130, 129, 144, 159, 157, 160, 168, 159, 160, 167, 169, 167, 181, 188, 180, 189, 188, 181, 181, 185, 179, 176, 184, 177, 165, 168, 153, 143, 138, 140, 128, 134, 137, 125, 118, 117, 99, 91, 91, 94, 87, 98, 95, 84, 82, 80, 68, 68, 76, 76, 80, 92, 91, 84, 93, 90, 91, 99, 111, 110, 122, 132, 127, 124, 133, 124, 127, 134, 141, 138, 154, 154, 147, 146, 146, 134, 136, 143, 144, 147, 161, 160, 157, 160, 158, 148, 154, 156, 150, 153, 159, 151, 144, 145, 134, 130, 133, 136, 130, 141, 141, 132, 126, 126, 110, 109, 113, 114, 113, 126, 120, 114, 110, 107, 92, 95, 99, 98, 104, 114, 109, 107, 110, 108, 100, 108, 107, 103, 110, 113, 107, 104, 107, 99, 99, 105, 106, 107, 121, 125, 124, 124, 130, 118, 122, 125, 125, 130, 142, 142, 145, 145, 149, 139, 149, 149, 146, 151, 154, 147, 142, 141, 137, 130, 140, 135, 137, 147, 147, 145, 143, 144, 132, 132, 134, 127, 129, 137, 132, 132, 129, 131, 117, 123, 122, 120, 128, 131, 126, 126, 120, 118, 105, 116, 112, 114, 122, 120, 118, 116, 115, 111, 110, 118, 113, 119, 129, 127, 132, 131, 134, 128, 134, 135, 133, 139, 146, 142, 147, 144, 146, 136, 143, 139, 138, 147, 148, 143, 145, 142, 141, 137, 148, 143, 147, 151, 143, 139, 135, 134, 130, 136, 140, 135, 137, 140, 127, 127, 118, 115, 106, 112, 107, 107, 113, 115, 110, 116, 109, 109, 100, 106, 97, 101, 108, 107, 109, 113, 108, 108, 104, 109, 104, 113, 116, 110, 112, 106, 103, 99, 101, 101, 100, 108, 113, 111, 122, 119, 125, 125, 133, 128, 132, 136, 133, 131, 135, 131, 135, 132, 139, 134, 140, 145, 141, 144, 143, 139, 139, 138, 143, 143, 152, 154, 147, 150, 145, 142, 141, 144, 142, 140, 141, 134, 126, 127, 117, 117, 118, 125, 124, 131, 134, 131, 130, 128, 118, 115, 112, 114, 110, 121, 126, 128, 135, 132, 126, 122, 119, 118, 117, 129, 130, 131, 136, 132, 130, 132, 136, 137, 140, 146, 141, 139, 138, 129, 130, 132, 137, 138, 148, 153, 151, 153, 151, 144, 144, 142, 142, 137, 145, 141, 139, 139, 134, 126, 125, 123, 124, 128, 139, 137, 137, 137, 129, 121, 123, 121, 121, 125, 130, 125, 124, 122, 111, 107, 108, 106, 104, 116, 117, 119, 123, 124, 117, 118, 116, 112, 109, 117, 111, 116, 119, 119, 115, 119, 116, 113, 115, 122, 117, 122, 127, 127, 129, 136, 134, 132, 133, 131, 124, 126, 126, 121, 125, 129, 128, 128, 134, 128, 128, 129, 129, 124, 131, 131, 130, 131, 136, 129, 130, 128, 126, 120, 123, 119, 117, 120, 122, 118, 121, 122, 120, 118, 124, 121, 121, 125, 121, 121, 121, 123, 118, 120, 122, 118, 119, 123, 118, 121, 121, 125, 120, 127, 125, 125, 127, 129, 125, 130, 131, 133, 129, 135, 129, 129, 132, 132, 129, 132, 133, 132, 133, 139, 134, 136, 137, 132, 132, 133, 136, 132, 138, 139, 135, 139, 140, 135, 138, 136, 138, 132, 138, 135, 133, 136, 134, 129, 132, 130, 131, 127, 134, 129, 131, 134, 129, 127, 127, 126, 124, 124, 128, 122, 126, 125, 118, 117, 115, 116, 113, 119, 121, 120, 127, 126, 123, 124, 121, 123, 119, 126, 123, 125, 128, 124, 122, 124, 124, 126, 123, 130, 125, 131, 134, 131, 133, 134, 135, 135, 137, 141, 137, 141, 136, 130, 129, 128, 131, 129, 136, 135, 135, 139, 135, 133, 133, 131, 133, 130, 135, 130, 132, 131, 127, 124, 124, 122, 124, 122, 126, 121, 127, 125, 122, 122, 121, 122, 122, 124, 128, 124, 128, 122, 118, 118, 117, 119, 120, 126, 124, 124, 127, 121, 121, 121, 121, 125, 125, 131, 129, 133, 132, 126, 126, 127, 125, 129, 128, 131, 128, 135, 131, 129, 130, 130, 130, 133, 134, 135, 134, 137, 128, 125, 126, 124, 125, 127, 129, 127, 129, 129, 125, 124, 125, 124, 127, 129, 130, 128, 133, 129, 124, 123, 123, 120, 125, 125, 126, 124, 130, 125, 123, 124, 124, 123, 127, 127, 128, 130, 132, 125, 123, 124, 122, 122, 125, 125, 125, 128, 126, 123, 121, 123, 121, 126, 127, 127, 129, 133, 128, 126, 127, 127, 125, 131, 129, 128, 129, 131, 125, 125, 125, 124, 125, 132, 130, 133, 135, 133, 126, 126, 126, 123, 127, 131, 129, 129, 131, 127, 123, 123, 123, 120, 128, 127, 127, 129, 132, 125, 123, 123, 122, 121, 129, 126, 126, 127, 126, 120, 120, 119, 117, 120, 127, 126, 130, 133, 130, 125, 126, 125, 124, 129, 133, 130, 134, 135, 131, 129, 129, 129, 129, 138, 136, 136, 139, 138, 132, 131, 131, 130, 132, 140, 135, 135, 136, 133, 127, 128, 127, 126, 129, 135, 129, 133, 132, 127, 124, 124, 123, 122, 128, 130, 126, 131, 128, 125, 122, 121, 120, 120, 128, 125, 124, 129, 126, 122, 121, 120, 119, 122, 129, 124, 126, 130, 126, 124, 125, 124, 123, 125, 130, 125, 131, 130, 127, 126, 126, 126, 125, 132, 134, 129, 137, 133, 131, 128, 127, 126, 127, 135, 131, 131, 136, 132, 129, 129, 127, 126, 129, 135, 128, 132, 134, 128, 127, 126, 124, 123, 126, 130, 125, 133, 130, 126, 124, 122, 120, 121, 126, 127, 124, 132, 126, 124, 122, 120, 118, 122, 128, 125, 127, 131, 125, 123, 121, 119, 119, 123, 128, 123, 127, 128, 124, 124, 123, 121, 121, 126, 128, 125, 132, 128, 125, 125, 125, 123, 125, 131, 129, 129, 134, 128, 128, 127, 126, 125, 131, 135, 131, 134, 137, 131, 130, 129, 127, 128, 133, 136, 130, 135, 133, 128, 128, 127, 125, 127, 131, 131, 129, 135, 129, 127, 127, 125, 124, 127, 130, 128, 129, 131, 126, 126, 125, 121, 122, 126, 127, 125, 128, 129, 124, 126, 124, 122, 125, 129, 131, 128, 133, 129, 126, 127, 125, 124, 127, 129, 128, 129, 133, 127, 128, 127, 125, 125, 128, 130, 129, 130, 132, 127, 129, 128, 125, 126, 130, 130, 129, 132, 131, 127, 129, 127, 125, 129, 132, 132, 131, 134, 128, 126, 127, 124, 123, 128, 128, 128, 130, 131, 125, 126, 125, 123, 123, 128, 127, 128, 130, 129, 125, 126, 125, 121, 124, 128, 127, 128, 130, 127, 124, 125, 123, 121, 126, 128, 127, 130, 131, 127, 126, 127, 124, 123, 128, 128, 128, 130, 129, 125, 126, 125, 123, 124, 128, 127, 130, 131, 129, 126, 128, 126, 122, 126, 128, 126, 129, 129, 126, 125, 126, 123, 122, 127, 127, 126, 131, 129, 126, 127, 126, 123, 123, 126, 123, 126, 128, 125, 123, 125, 123, 121, 124, 127, 125, 130, 129, 127, 126, 127, 124, 122, 126, 126, 125, 129, 127, 125, 125, 126, 122, 123, 128, 127, 128, 133, 129, 127, 128, 128, 125, 127, 129, 126, 129, 130, 126, 127, 127, 126, 125, 128, 129, 128, 133, 131, 129, 129, 130, 128, 126, 129, 127, 127, 131, 126, 126, 127, 127, 125, 127, 130, 127, 130, 132, 127, 129, 131, 129, 126, 128, 129, 125, 129, 129, 126, 128, 116, 122, 141, 125, 122, 136, 125, 134, 118, 137, 124, 135, 132, 142, 130, 137, 123, 130, 129, 125, 127, 125, 124, 128, 124, 119, 130, 121, 124, 117, 130, 115, 128, 143, 125, 124, 136, 113, 133, 126, 130, 127, 141, 120, 139, 145, 119, 133, 133, 135, 136, 128, 149, 127, 147, 120, 118, 118, 137, 109, 134, 125, 125, 113, 135, 131, 113, 121, 138, 112, 141, 108, 118, 132, 135, 106, 124, 131, 132, 108, 123, 114, 142, 126, 142, 118, 137, 124, 132, 141, 132, 116, 132, 133, 134, 120, 121, 127, 131, 130, 124, 134, 127, 132, 128, 134, 130, 128, 125, 127, 125, 138, 129, 124, 130, 128, 115, 125, 113, 125, 121, 125, 125, 128, 122, 136, 126, 124, 132, 130, 132, 122, 121, 119, 114, 126, 112, 122, 125, 124, 124, 142, 121, 133, 142, 136, 127, 137, 127, 130, 121, 133, 113, 128, 128, 122, 121, 130, 130, 133, 130, 136, 130, 128, 124, 133, 127, 126, 125, 128, 126, 120, 127, 121, 132, 127, 131, 126, 139, 124, 133, 131, 132, 135, 135, 133, 129, 136, 122, 136, 126, 123, 125, 127, 114, 118, 122, 123, 119, 125, 128, 124, 131, 133, 123, 130, 122, 130, 122, 120, 129, 131, 120, 127, 120, 128, 133, 128, 126, 136, 135, 133, 133, 125, 139, 139, 129, 123, 135, 124, 120, 130, 118, 117, 132, 129, 113, 127, 133, 125, 127, 126, 136, 131, 130, 125, 136, 128, 127, 123, 132, 126, 126, 126, 128, 133, 122, 127, 127, 134, 134, 121, 133, 136, 132, 120, 128, 122, 134, 115, 123, 125, 127, 122, 124, 121, 128, 129, 129, 119, 123, 138, 126, 124, 130, 136, 127, 127, 128, 133, 116, 131, 133, 127, 123, 121, 133, 129, 122, 134, 126, 132, 137, 123, 132, 129, 120, 130, 115, 122, 119, 123, 119, 123, 123, 132, 132, 130, 132, 129, 122, 132, 125, 133, 125, 128, 129, 127, 131, 124, 126, 130, 133, 127, 125, 123, 139, 119, 128, 132, 136, 124, 128, 132, 137, 124, 115, 123, 112, 124, 124, 122, 127, 118, 128, 132, 129, 126, 131, 126, 126, 128, 136, 120, 125, 138, 126, 128, 129, 124, 138, 128, 127, 126, 123, 125, 129, 129, 125, 131, 126, 136, 128, 128, 133, 117, 119, 120, 130, 116, 125, 127, 129, 126, 131, 125, 135, 130, 121, 129, 126, 124, 128, 124, 126, 127, 132, 125, 132, 130, 133, 124, 125, 126, 135, 120, 129, 128, 132, 132, 124, 133, 127, 131, 122, 126, 116, 127, 122, 127, 129, 124, 133, 124, 131, 133, 135, 128, 121, 135, 127, 121, 124, 127, 128, 120, 127, 131, 133, 133, 122, 119, 137, 124, 122, 130, 130, 125, 130, 133, 126, 134, 126, 125, 126, 124, 118, 128, 132, 130, 122, 134, 127, 132, 134, 129, 128, 134, 124, 125, 127, 126, 125, 125, 122, 125, 126, 137, 128, 132, 129, 126, 126, 124, 126, 135, 121, 133, 121, 127, 133, 125, 128, 127, 123, 122, 121, 130, 129, 127, 129, 126, 125, 133, 128, 129, 131, 135, 122, 125, 129, 126, 127, 126, 127, 126, 126, 133, 127, 132, 131, 125, 123, 127, 128, 128, 129, 131, 124, 126, 129, 126, 126, 128, 120, 126, 123, 130, 125, 126, 129, 123, 128, 128, 126, 130, 134, 126, 131, 122, 123, 124, 126, 123, 126, 122, 131, 125, 131, 129, 129, 126, 128, 125, 128, 127, 126, 124, 128, 126, 126, 120, 130, 131, 127, 130, 124, 126, 131, 121, 125, 131, 129, 122, 133, 129, 128, 136, 126, 127, 125, 124, 129, 128, 131, 124, 130, 132, 126, 128, 129, 130, 132, 126, 127, 126, 127, 128, 124, 121, 125, 125, 125, 132, 128, 127, 131, 126, 126, 126, 124, 130, 124, 132, 128, 123, 129, 129, 125, 126, 123, 122, 127, 130, 128, 126, 130, 126, 129, 128, 131, 128, 129, 130, 127, 129, 124, 121, 128, 122, 125, 125, 125, 130, 129, 132, 129, 126, 130, 128, 130, 123, 132, 124, 128, 128, 123, 125, 129, 125, 128, 131, 130, 128, 129, 128, 123, 130, 128, 127, 128, 129, 129, 127, 130, 124, 127, 128, 124, 123, 125, 129, 129, 126, 133, 123, 127, 126, 125, 128, 125, 130, 124, 127, 128, 126, 127, 126, 128, 129, 124, 130, 129, 131, 129, 126, 129, 128, 130, 124, 131, 129, 127, 127, 129, 124, 128, 126, 125, 127, 128, 126, 129, 130, 125, 130, 124, 126, 128, 126, 130, 126, 129, 129, 126, 128, 126, 125, 128, 129, 130, 128, 132, 125, 129, 126, 130, 129, 128, 127, 126, 127, 124, 128, 127, 124, 123, 126, 128, 128, 127, 132, 125, 126, 126, 127, 125, 128, 130, 126, 130, 127, 128, 127, 129, 127, 129, 129, 125, 126, 129, 129, 127, 125, 129, 125, 129, 130, 129, 130, 126, 127, 125, 127, 125, 125, 125, 128, 124, 127, 130, 129, 126, 131, 124, 128, 126, 128, 128, 128, 129, 125, 125, 128, 125, 128, 130, 128, 126, 126, 126, 130, 127, 130, 125, 132, 130, 130, 128, 130, 128, 125, 125, 123, 124, 125, 131, 128, 128, 134, 127, 128, 131, 127, 127, 130, 129, 124, 125, 131, 125, 129, 128, 127, 128, 134, 125, 126, 131, 128, 124, 130, 127, 121, 126, 128, 124, 128, 133, 131, 130, 128, 127, 122, 129, 128, 127, 128, 132, 124, 125, 126, 125, 128, 133, 128, 132, 130, 128, 124, 130, 126, 126, 123, 128, 129, 122, 124, 126, 126, 130, 131, 134, 132, 132, 126, 131, 127, 127, 124, 128, 121, 122, 124, 123, 123, 130, 132, 133, 132, 132, 129, 126, 128, 125, 127, 127, 123, 124, 120, 120, 124, 125, 129, 135, 132, 133, 129, 128, 127, 126, 124, 127, 130, 120, 126, 121, 121, 125, 129, 128, 134, 133, 130, 128, 130, 125, 126, 129, 123, 126, 122, 123, 123, 126, 129, 131, 133, 134, 131, 128, 127, 129, 123, 126, 126, 123, 126, 126, 124, 127, 129, 134, 133, 133, 131, 128, 127, 121, 124, 120, 128, 127, 125, 128, 123, 126, 129, 129, 133, 132, 133, 129, 127, 124, 122, 123, 129, 124, 127, 124, 126, 123, 129, 127, 131, 132, 133, 131, 128, 128, 126, 127, 127, 127, 125, 124, 121, 122, 123, 127, 129, 134, 134, 131, 132, 128, 126, 125, 128, 126, 126, 127, 123, 120, 124, 126, 128, 130, 134, 133, 130, 128, 124, 124, 127, 127, 127, 130, 127, 126, 125, 129, 127, 131, 130, 129, 128, 127, 123, 124, 127, 128, 127, 129, 127, 125, 127, 128, 128, 128, 134, 131, 129, 128, 126, 124, 124, 128, 126, 129, 128, 123, 125, 127, 126, 128, 135, 135, 130, 129, 127, 121, 124, 126, 126, 126, 128, 125, 125, 125, 126, 128, 133, 131, 130, 131, 128, 125, 124, 125, 125, 126, 129, 127, 125, 126, 126, 128, 132, 133, 130, 131, 128, 125, 122, 128, 127, 128, 129, 126, 123, 124, 126, 126, 126, 131, 130, 134, 131, 127, 126, 128, 128, 125, 128, 128, 127, 125, 125, 122, 128, 131, 132, 132, 129, 127, 125, 127, 126, 126, 128, 128, 126, 126, 127, 126, 127, 129, 131, 131, 128, 126, 122, 123, 124, 123, 130, 129, 127, 127, 128, 127, 127, 131, 131, 130, 130, 126, 125, 124, 124, 125, 129, 129, 125, 129, 127, 126, 125, 130, 131, 132, 131, 131, 125, 126, 125, 124, 127, 127, 126, 125, 126, 127, 126, 130, 130, 130, 132, 131, 126, 125, 127, 124, 126, 128, 126, 127, 125, 127, 127, 126, 131, 127, 133, 129, 126, 125, 126, 125, 126, 130, 129, 128, 129, 126, 127, 125, 127, 130, 128, 128, 127, 124, 128, 124, 126, 130, 130, 129, 126, 128, 124, 126, 129, 124, 130, 128, 129, 126, 126, 126, 124, 131, 129, 127, 128, 127, 126, 126, 128, 128, 127, 132, 128, 126, 124, 125, 126, 125, 128, 127, 128, 129, 125, 126, 129, 129, 130, 130, 128, 126, 126, 127, 123, 125, 126, 128, 128, 128, 125, 124, 128, 129, 127, 129, 129, 129, 127, 128, 125, 126, 130, 128, 128, 128, 124, 125, 124, 125, 126, 129, 131, 129, 129, 128, 127, 127, 128, 129, 127, 129, 126, 123, 124, 124, 128, 129, 129, 129, 127, 129, 127, 125, 127, 128, 128, 129, 128, 125, 126, 128, 126, 128, 129, 129, 129, 126, 125, 125, 127, 129, 127, 130, 129, 126, 125, 127, 127, 126, 131, 129, 127, 127, 126, 127, 128, 127, 127, 127, 129, 126, 124, 126, 126, 127, 130, 131, 129, 129, 129, 125, 126, 127, 127, 127, 128, 125, 124, 126, 127, 127, 129, 130, 130, 129, 129, 125, 126, 128, 127, 127, 128, 127, 126, 127, 126, 126, 127, 130, 129, 128, 127, 126, 127, 129, 127, 129, 128, 129, 125, 126, 126, 126, 126, 128, 128, 129, 128, 127, 126, 128, 128, 129, 130, 129, 125, 125, 126, 125, 126, 127, 128, 129, 129, 127, 125, 128, 127, 127, 128, 129, 127, 127, 128, 126, 126, 127, 128, 128, 127, 127, 126, 126, 126, 125, 129, 130, 129, 127, 127, 127, 128, 128, 128, 127, 127, 127, 125, 126, 125, 127, 129, 130, 127, 127, 126, 126, 126, 126, 128, 129, 129, 130, 127, 128, 127, 127, 128, 128, 127, 127, 125, 125, 124, 127, 127, 128, 130, 130, 129, 128, 129, 127, 127, 129, 128, 126, 126, 123, 125, 126, 128, 127, 129, 129, 128, 128, 128, 127, 128, 129, 128, 127, 127, 125, 126, 126, 126, 127, 129, 129, 126, 126, 127, 127, 128, 128, 128, 129, 128, 127, 125, 127, 126, 127, 129, 127, 127, 128, 128, 127, 127, 128, 127, 128, 127, 126, 126, 126, 128, 128, 129, 129, 128, 128, 127, 126, 126, 127, 127, 126, 128, 126, 126, 127, 127, 129, 130, 130, 129, 128, 126, 125, 127, 126, 126, 126, 128, 127, 125, 127, 126, 127, 130, 129, 129, 128, 128, 126, 126, 128, 125, 129, 128, 127, 126, 126, 126, 126, 128, 129, 128, 130, 129, 127, 128, 128, 127, 127, 129, 126, 126, 126, 126, 125, 128, 129, 128, 129, 129, 126, 127, 127, 126, 127, 128, 129, 126, 128, 126, 126, 129, 128, 128, 128, 127, 127, 125, 126, 125, 126, 129, 128, 128, 128, 128, 127, 128, 129, 127, 128, 127, 126, 125, 126, 126, 126, 128, 127, 127, 129, 127, 126, 128, 129, 128, 128, 129, 126, 127, 127, 127, 125, 127, 126, 126, 127, 126, 126, 128, 129, 128, 129, 130, 128, 127, 127, 125, 125, 128, 127, 127, 127, 127, 126, 128, 129, 127, 128, 130, 127, 127, 127, 125, 126, 128, 128, 127, 129, 129, 127, 127, 128, 126, 127, 127, 126, 126, 127, 127, 127, 128, 129, 127, 130, 128, 127, 127, 128, 127, 127, 127, 125, 127, 128, 126, 125, 128, 128, 127, 129, 128, 126, 128, 128, 127, 128, 129, 127, 127, 128, 125, 124, 127, 126, 126, 128, 129, 128, 128, 129, 127, 128, 129, 127, 126, 128, 126, 126, 126, 125, 124, 128, 129, 127, 128, 129, 128, 128, 129, 127, 126, 128, 126, 126, 127, 127, 127, 128, 128, 126, 127, 128, 126, 126, 128, 128, 128, 129, 127, 126, 127, 128, 127, 127, 128, 128, 128, 128, 125, 125, 128, 127, 126, 128, 128, 127, 128, 128, 126, 128, 129, 128, 128, 128, 127, 127, 128, 126, 124, 127, 126, 125, 126, 126, 128, 129, 130, 128, 129, 130, 128, 127, 127, 127, 127, 128, 127, 124, 126, 127, 126, 127, 128, 129, 129, 130, 127, 126, 128, 127, 127, 128, 128, 128, 128, 128, 125, 126, 127, 126, 127, 127, 127, 128, 128, 128, 127, 129, 129, 128, 128, 127, 126, 127, 128, 127, 125, 127, 127, 126, 127, 127, 127, 128, 129, 127, 128, 128, 127, 128, 128, 127, 128, 129, 128, 125, 126, 127, 125, 126, 127, 127, 129, 129, 128, 127, 129, 128, 127, 129, 127, 127, 127, 128, 125, 125, 128, 127, 128, 128, 127, 128, 129, 128, 126, 128, 128, 127, 127, 127, 127, 128, 128, 127, 125, 127, 127, 126, 127, 126, 127, 129, 130, 127, 127, 129, 127, 127, 128, 127, 127, 129, 128, 125, 125, 127, 126, 127, 128, 127, 128, 129, 128, 126, 128, 128, 127, 129, 128, 126, 127, 128, 127, 125, 127, 127, 126, 128, 126, 127, 128, 128, 128, 128, 129, 128, 128, 128, 126, 127, 128, 128, 126, 126, 127, 126, 127, 127, 127, 129, 130, 128, 126, 128, 127, 127, 129, 128, 127, 128, 128, 126, 125, 127, 126, 127, 128, 127, 127, 128, 128, 127, 128, 129, 128, 128, 128, 126, 127, 128, 127, 126, 127, 127, 126, 127, 127, 126, 128, 130, 128, 128, 128, 127, 127, 128, 126, 127, 128, 129, 126, 126, 127, 126, 127, 128, 127, 128, 129, 128, 127, 128, 128, 127, 128, 127, 126, 126, 128, 127, 126, 127, 128, 128, 128, 127, 127, 128, 128, 126, 127, 128, 127, 127, 128, 126, 126, 128, 129, 127, 127, 127, 126, 127, 127, 126, 128, 129, 128, 127, 128, 128, 127, 128, 128, 127, 128, 129, 126, 126, 127, 127, 127, 128, 128, 127, 128, 128, 126, 127, 128, 127, 128, 129, 127, 127, 128, 127, 125, 127, 127, 127, 127, 127, 126, 128, 129, 128, 128, 129, 128, 128, 128, 127, 126, 127, 128, 126, 126, 126, 126, 127, 128, 128, 128, 130, 128, 126, 128, 127, 126, 127, 128, 127, 127, 128, 127, 126, 127, 126, 127, 128, 127, 127, 128, 128, 126, 128, 128, 128, 128, 128, 127, 126, 128, 128, 126, 127, 127, 127, 127, 127, 126, 127, 129, 127, 127, 128, 127, 127, 128, 128, 127, 128, 129, 127, 126, 126, 126, 126, 127, 127, 127, 128, 127, 127, 128, 128, 128, 128, 129, 128, 127, 128, 127, 126, 127, 127, 127, 127, 127, 127, 126, 127, 126, 127, 135, 138, 138, 138, 144, 138, 138, 138, 136, 131, 137, 133, 125, 126, 115, 103, 99, 90, 90, 78, 77, 77, 77, 81, 84, 91, 98, 102, 108, 114, 126, 132, 141, 138, 155, 159, 171, 174, 184, 188, 191, 190, 189, 195, 193, 191, 189, 180, 176, 169, 157, 154, 141, 132, 124, 120, 109, 105, 96, 93, 87, 86, 83, 83, 88, 83, 86, 85, 87, 90, 92, 90, 96, 91, 98, 98, 108, 115, 115, 120, 116, 120, 115, 115, 115, 121, 119, 131, 131, 142, 147, 150, 155, 159, 167, 170, 169, 168, 166, 161, 164, 160, 163, 154, 149, 138, 131, 127, 125, 122, 119, 117, 108, 107, 97, 98, 90, 91, 81, 86, 85, 87, 83, 86, 84, 88, 95, 99, 109, 110, 113, 110, 115, 117, 124, 126, 134, 131, 138, 139, 144, 153, 156, 160, 160, 163, 161, 161, 158, 160, 156, 162, 162, 167, 169, 173, 172, 169, 173, 175, 177, 179, 179, 174, 176, 168, 171, 166, 168, 158, 155, 150, 144, 139, 142, 142, 138, 138, 131, 132, 122, 119, 109, 110, 104, 102, 96, 99, 93, 92, 91, 90, 93, 91, 91, 83, 82, 77, 74, 68, 72, 68, 71, 70, 72, 73, 76, 81, 84, 91, 93, 95, 94, 101, 99, 104, 105, 115, 119, 124, 125, 127, 132, 133, 133, 138, 144, 143, 144, 143, 148, 144, 149, 147, 148, 148, 145, 141, 143, 145, 148, 151, 151, 155, 150, 149, 140, 137, 135, 132, 126, 132, 130, 130, 127, 127, 128, 125, 129, 120, 120, 120, 115, 111, 117, 115, 122, 122, 127, 126, 125, 128, 128, 134, 137, 136, 137, 141, 138, 140, 142, 148, 148, 153, 156, 154, 157, 162, 153, 155, 163, 160, 166, 163, 164, 158, 157, 152, 148, 150, 149, 138, 139, 137, 138, 142, 143, 148, 138, 139, 130, 124, 122, 121, 112, 115, 115, 115, 114, 115, 115, 108, 110, 104, 106, 105, 102, 91, 94, 91, 95, 95, 97, 99, 95, 93, 88, 89, 92, 93, 85, 93, 88, 91, 92, 95, 97, 96, 100, 100, 105, 111, 109, 107, 118, 116, 125, 130, 136, 138, 139, 141, 140, 148, 154, 155, 155, 163, 161, 166, 171, 177, 178, 180, 177, 172, 169, 167, 159, 157, 159, 152, 156, 151, 150, 144, 139, 130, 126, 125, 120, 108, 107, 102, 94, 95, 92, 96, 92, 91, 85, 83, 87, 89, 86, 93, 93, 93, 99, 97, 99, 100, 106, 102, 109, 114, 115, 113, 120, 118, 125, 132, 135, 142, 140, 142, 138, 145, 150, 151, 150, 160, 155, 158, 160, 164, 168, 166, 168, 162, 165, 164, 159, 154, 156, 149, 154, 155, 153, 152, 148, 143, 135, 136, 135, 130, 126, 127, 118, 120, 118, 121, 122, 121, 116, 110, 112, 110, 107, 106, 111, 107, 112, 108, 111, 107, 106, 102, 100, 105, 105, 104, 106, 109, 103, 111, 110, 117, 117, 117, 112, 113, 113, 115, 114, 119, 122, 120, 127, 122, 130, 132, 135, 132, 136, 138, 137, 132, 135, 133, 134, 139, 137, 143, 142, 143, 138, 140, 140, 141, 139, 143, 137, 137, 138, 135, 140, 138, 137, 133, 133, 129, 127, 126, 130, 126, 131, 131, 128, 131, 127, 121, 117, 119, 119, 118, 115, 120, 113, 118, 115, 116, 122, 123, 119, 115, 116, 115, 114, 115, 119, 116, 123, 121, 123, 128, 131, 130, 133, 137, 136, 137, 139, 139, 135, 142, 139, 143, 148, 148, 145, 144, 145, 145, 145, 148, 149, 145, 148, 140, 142, 143, 141, 138, 138, 137, 134, 129, 132, 130, 128, 135, 128, 133, 131, 126, 120, 119, 117, 115, 113, 117, 114, 114, 116, 110, 115, 117, 117, 112, 113, 108, 106, 103, 107, 105, 108, 112, 107, 114, 112, 109, 109, 113, 113, 112, 113, 117, 110, 114, 114, 111, 120, 121, 121, 120, 126, 122, 123, 125, 130, 129, 135, 134, 133, 137, 137, 138, 137, 140, 139, 140, 138, 142, 139, 148, 146, 148, 152, 151, 147, 143, 142, 139, 137, 137, 139, 135, 140, 134, 134, 136, 134, 131, 130, 130, 123, 121, 119, 119, 116, 121, 116, 120, 120, 117, 113, 116, 117, 116, 117, 118, 118, 117, 122, 115, 120, 122, 122, 118, 122, 123, 124, 124, 128, 129, 131, 137, 133, 138, 138, 138, 135, 139, 140, 139, 139, 142, 137, 140, 144, 141, 147, 147, 144, 140, 142, 137, 135, 132, 134, 130, 134, 137, 132, 135, 133, 130, 127, 129, 126, 125, 120, 120, 116, 121, 120, 119, 123, 120, 116, 112, 117, 114, 114, 114, 117, 112, 117, 114, 112, 116, 114, 112, 113, 117, 114, 115, 114, 118, 116, 124, 124, 125, 126, 124, 121, 121, 124, 125, 124, 124, 128, 120, 124, 142, 134, 123, 143, 127, 134, 122, 139, 122, 140, 127, 142, 133, 146, 131, 138, 136, 127, 125, 130, 125, 122, 122, 121, 121, 131, 126, 123, 127, 123, 119, 142, 127, 114, 137, 114, 126, 122, 127, 128, 134, 113, 134, 133, 121, 118, 134, 129, 140, 121, 141, 136, 136, 128, 124, 116, 130, 110, 125, 122, 121, 116, 122, 142, 121, 125, 146, 121, 144, 120, 114, 131, 134, 107, 126, 127, 138, 117, 133, 118, 148, 134, 145, 128, 143, 132, 137, 144, 141, 121, 135, 135, 144, 134, 126, 134, 140, 136, 127, 136, 129, 126, 133, 136, 133, 134, 127, 123, 121, 137, 132, 115, 133, 127, 111, 126, 110, 118, 118, 117, 114, 114, 114, 122, 117, 119, 123, 123, 130, 122, 118, 116, 115, 121, 107, 114, 123, 116, 117, 140, 115, 130, 144, 135, 132, 140, 128, 136, 123, 134, 118, 133, 129, 130, 121, 135, 132, 137, 134, 141, 132, 140, 125, 136, 133, 130, 126, 134, 141, 119, 134, 127, 129, 128, 127, 126, 136, 124, 126, 132, 129, 135, 133, 140, 126, 130, 120, 129, 118, 115, 120, 122, 109, 118, 118, 120, 120, 116, 119, 116, 125, 124, 118, 124, 120, 125, 125, 124, 126, 138, 120, 127, 121, 130, 128, 131, 127, 135, 136, 131, 140, 129, 136, 141, 134, 126, 140, 129, 129, 127, 127, 121, 137, 134, 123, 126, 141, 119, 130, 126, 135, 136, 129, 129, 135, 138, 134, 126, 141, 124, 129, 129, 126, 125, 122, 125, 125, 135, 137, 122, 135, 133, 130, 114, 128, 113, 131, 119, 114, 124, 125, 122, 124, 116, 129, 120, 131, 117, 114, 132, 123, 118, 131, 128, 134, 123, 130, 132, 115, 125, 132, 122, 123, 117, 128, 133, 121, 140, 125, 132, 138, 122, 123, 136, 120, 130, 125, 124, 125, 126, 125, 120, 130, 136, 128, 131, 134, 131, 119, 132, 121, 135, 130, 132, 131, 137, 126, 126, 123, 130, 129, 125, 123, 126, 132, 118, 126, 135, 135, 118, 124, 132, 134, 121, 111, 126, 116, 127, 126, 126, 125, 123, 121, 129, 128, 130, 129, 130, 124, 132, 134, 126, 122, 143, 137, 126, 124, 131, 142, 128, 132, 131, 128, 132, 135, 129, 132, 129, 131, 129, 131, 131, 129, 119, 124, 122, 129, 120, 125, 125, 128, 120, 123, 124, 132, 124, 121, 125, 129, 116, 128, 124, 124, 123, 125, 119, 133, 121, 125, 124, 121, 123, 127, 125, 124, 129, 126, 125, 117, 133, 122, 125, 127, 125, 120, 120, 129, 123, 130, 121, 129, 129, 129, 130, 137, 127, 124, 132, 126, 127, 129, 127, 133, 119, 132, 131, 134, 134, 124, 125, 136, 128, 127, 132, 135, 128, 124, 135, 128, 131, 126, 128, 132, 118, 125, 132, 131, 127, 121, 128, 127, 132, 127, 131, 124, 136, 118, 124, 134, 124, 124, 126, 120, 122, 125, 134, 125, 124, 129, 121, 129, 121, 122, 135, 118, 124, 118, 129, 132, 123, 128, 132, 122, 128, 124, 129, 129, 126, 125, 129, 125, 135, 125, 132, 135, 133, 126, 129, 132, 133, 126, 129, 129, 131, 126, 130, 132, 135, 130, 133, 128, 130, 130, 126, 127, 128, 123, 127, 122, 131, 128, 130, 125, 128, 122, 128, 125, 122, 130, 123, 126, 123, 127, 127, 131, 127, 131, 119, 126, 123, 123, 124, 124, 124, 125, 128, 127, 128, 131, 125, 124, 124, 123, 126, 124, 123, 129, 124, 130, 124, 130, 130, 130, 125, 124, 123, 128, 121, 123, 130, 128, 126, 132, 132, 132, 134, 128, 130, 125, 127, 127, 127, 127, 124, 130, 132, 130, 128, 135, 129, 130, 125, 126, 123, 128, 126, 126, 127, 127, 130, 127, 132, 126, 124, 128, 124, 123, 125, 121, 130, 127, 128, 131, 129, 127, 131, 126, 125, 124, 121, 126, 125, 130, 125, 128, 129, 132, 125, 131, 127, 126, 129, 127, 129, 121, 126, 129, 125, 128, 133, 126, 129, 128, 128, 129, 127, 131, 125, 132, 125, 132, 130, 130, 128, 126, 124, 127, 127, 127, 130, 126, 130, 128, 132, 129, 130, 130, 126, 125, 128, 124, 126, 129, 122, 131, 128, 127, 126, 128, 126, 128, 120, 127, 122, 123, 124, 126, 129, 125, 131, 127, 126, 128, 126, 125, 128, 125, 132, 121, 128, 132, 127, 132, 128, 128, 127, 128, 121, 131, 129, 126, 124, 131, 127, 128, 130, 129, 127, 129, 123, 126, 129, 123, 130, 122, 129, 129, 130, 131, 131, 128, 129, 125, 126, 127, 125, 127, 125, 130, 126, 129, 129, 131, 129, 129, 128, 127, 127, 124, 127, 120, 129, 128, 124, 125, 128, 128, 127, 127, 128, 125, 126, 124, 126, 126, 126, 130, 127, 132, 126, 129, 128, 128, 127, 128, 129, 122, 128, 129, 129, 128, 127, 129, 125, 129, 126, 131, 129, 126, 125, 130, 125, 126, 128, 129, 127, 127, 126, 130, 132, 128, 123, 119, 126, 122, 128, 132, 132, 132, 134, 130, 132, 125, 125, 120, 127, 121, 119, 126, 130, 125, 131, 131, 134, 132, 126, 125, 128, 127, 120, 120, 121, 122, 129, 130, 134, 133, 131, 124, 132, 128, 122, 123, 124, 122, 128, 123, 135, 130, 135, 130, 133, 130, 122, 121, 119, 128, 130, 121, 127, 125, 120, 132, 132, 133, 132, 127, 127, 131, 127, 123, 125, 126, 126, 127, 129, 131, 130, 127, 129, 133, 128, 125, 126, 123, 128, 125, 125, 132, 123, 125, 134, 134, 139, 127, 129, 120, 127, 125, 123, 126, 124, 123, 131, 132, 131, 130, 129, 132, 129, 127, 121, 123, 121, 120, 126, 129, 130, 130, 129, 133, 136, 132, 128, 127, 120, 121, 126, 123, 127, 127, 127, 136, 134, 132, 127, 128, 126, 124, 126, 123, 126, 125, 125, 134, 132, 130, 128, 127, 132, 130, 127, 129, 124, 121, 126, 135, 127, 131, 127, 125, 134, 130, 129, 128, 125, 126, 127, 131, 126, 126, 125, 126, 130, 130, 124, 129, 126, 128, 131, 134, 129, 124, 124, 124, 128, 126, 125, 124, 124, 128, 130, 132, 130, 130, 125, 130, 127, 125, 124, 123, 123, 123, 128, 130, 133, 125, 125, 131, 136, 129, 129, 124, 120, 128, 128, 128, 127, 127, 127, 132, 131, 131, 126, 126, 126, 130, 124, 128, 124, 123, 124, 128, 129, 131, 125, 125, 130, 131, 130, 131, 125, 124, 123, 125, 126, 124, 123, 126, 129, 131, 130, 133, 129, 128, 127, 127, 125, 126, 119, 124, 128, 130, 127, 131, 129, 131, 130, 128, 128, 125, 121, 122, 128, 129, 127, 129, 134, 129, 131, 128, 128, 127, 122, 125, 124, 126, 125, 126, 131, 133, 132, 128, 126, 126, 125, 127, 127, 127, 126, 122, 128, 133, 129, 127, 127, 130, 125, 125, 126, 126, 126, 125, 128, 128, 127, 125, 126, 130, 129, 125, 129, 127, 125, 125, 132, 130, 128, 124, 122, 129, 129, 127, 127, 129, 130, 124, 130, 130, 127, 124, 126, 128, 127, 123, 128, 128, 127, 129, 132, 130, 132, 120, 124, 130, 130, 122, 125, 125, 128, 130, 133, 132, 128, 129, 127, 130, 127, 123, 121, 126, 128, 129, 128, 129, 128, 128, 130, 131, 126, 124, 120, 124, 127, 128, 127, 130, 126, 129, 128, 131, 129, 126, 124, 124, 125, 126, 126, 127, 127, 130, 129, 129, 129, 127, 123, 129, 126, 127, 126, 125, 123, 131, 127, 128, 132, 128, 123, 129, 129, 129, 127, 127, 124, 127, 127, 125, 130, 128, 125, 132, 130, 128, 128, 127, 129, 130, 124, 125, 127, 124, 126, 130, 130, 129, 128, 128, 130, 131, 126, 125, 127, 124, 123, 126, 126, 125, 129, 130, 131, 131, 127, 124, 129, 126, 126, 122, 125, 125, 125, 129, 132, 127, 130, 125, 126, 128, 127, 123, 127, 127, 127, 126, 132, 127, 127, 125, 127, 129, 127, 124, 126, 128, 128, 127, 129, 127, 127, 122, 125, 130, 131, 125, 128, 125, 128, 131, 128, 127, 128, 125, 124, 128, 126, 123, 125, 129, 130, 131, 128, 129, 130, 128, 126, 127, 126, 124, 123, 126, 130, 132, 131, 130, 129, 127, 127, 128, 126, 122, 123, 125, 129, 130, 127, 129, 132, 132, 127, 128, 126, 124, 122, 127, 127, 127, 124, 125, 129, 132, 128, 130, 129, 126, 122, 128, 126, 127, 125, 125, 127, 130, 127, 127, 128, 128, 127, 130, 126, 126, 126, 127, 128, 129, 125, 125, 125, 128, 128, 131, 130, 129, 128, 126, 130, 128, 125, 123, 125, 125, 127, 128, 129, 127, 130, 128, 131, 129, 126, 124, 126, 128, 126, 125, 128, 123, 128, 130, 131, 132, 130, 124, 125, 127, 127, 124, 127, 124, 126, 127, 129, 129, 129, 127, 129, 132, 128, 124, 126, 124, 126, 127, 127, 128, 128, 125, 127, 133, 130, 127, 129, 124, 126, 126, 125, 128, 127, 124, 127, 130, 128, 124, 128, 128, 130, 128, 126, 127, 127, 125, 127, 130, 127, 124, 126, 129, 129, 131, 128, 130, 126, 125, 126, 128, 128, 125, 124, 128, 127, 130, 127, 131, 129, 128, 126, 125, 127, 125, 124, 129, 127, 130, 127, 127, 130, 130, 128, 127, 127, 125, 123, 127, 126, 128, 128, 128, 132, 132, 137, 142, 141, 143, 142, 142, 141, 144, 140, 136, 141, 129, 118, 114, 103, 97, 87, 89, 84, 82, 85, 83, 87, 86, 89, 89, 96, 104, 106, 115, 121, 134, 139, 145, 162, 162, 172, 177, 182, 192, 195, 191, 194, 191, 191, 190, 187, 179, 175, 166, 161, 154, 147, 133, 129, 122, 115, 109, 101, 94, 90, 88, 87, 89, 83, 81, 85, 85, 92, 90, 92, 97, 96, 96, 99, 104, 106, 104, 107, 110, 118, 117, 116, 120, 122, 127, 134, 137, 140, 143, 147, 149, 159, 161, 163, 170, 173, 171, 170, 168, 166, 159, 157, 153, 152, 146, 140, 135, 128, 123, 116, 109, 106, 100, 95, 94, 92, 88, 88, 89, 86, 86, 82, 81, 83, 84, 85, 89, 90, 94, 97, 103, 109, 114, 118, 123, 128, 130, 134, 138, 139, 143, 144, 149, 152, 152, 153, 155, 159, 160, 160, 162, 161, 163, 165, 170, 172, 173, 172, 172, 173, 175, 173, 174, 171, 171, 166, 165, 163, 157, 153, 149, 147, 146, 140, 138, 136, 134, 132, 131, 129, 124, 120, 119, 118, 118, 114, 113, 111, 110, 109, 107, 108, 103, 100, 96, 97, 95, 90, 87, 87, 86, 86, 84, 86, 84, 85, 85, 90, 93, 93, 95, 100, 105, 110, 113, 119, 121, 124, 128, 132, 135, 137, 136, 139, 140, 144, 142, 143, 143, 142, 140, 142, 140, 140, 138, 139, 140, 142, 137, 137, 138, 138, 136, 136, 135, 135, 130, 129, 129, 130, 124, 124, 122, 119, 117, 114, 114, 113, 111, 111, 110, 111, 110, 113, 115, 116, 118, 116, 115, 118, 117, 117, 120, 123, 126, 127, 133, 135, 138, 138, 141, 143, 145, 145, 148, 150, 152, 152, 155, 155, 153, 151, 151, 152, 150, 149, 150, 147, 149, 147, 149, 149, 149, 149, 150, 151, 149, 147, 147, 143, 144, 141, 140, 137, 133, 129, 127, 124, 122, 115, 114, 110, 110, 107, 107, 106, 101, 99, 98, 96, 95, 91, 91, 88, 88, 86, 86, 88, 87, 88, 90, 92, 93, 92, 94, 97, 101, 104, 106, 109, 110, 114, 115, 119, 124, 126, 131, 138, 143, 150, 154, 159, 161, 165, 167, 169, 171, 171, 172, 176, 178, 183, 183, 185, 185, 184, 181, 178, 175, 170, 164, 158, 152, 148, 140, 136, 131, 125, 119, 115, 112, 108, 103, 101, 99, 97, 93, 91, 89, 87, 83, 81, 79, 78, 76, 78, 79, 81, 84, 88, 93, 98, 105, 108, 113, 120, 123, 127, 130, 133, 136, 138, 141, 141, 141, 141, 141, 142, 143, 143, 144, 143, 145, 145, 150, 154, 155, 157, 159, 161, 162, 162, 162, 159, 158, 153, 151, 147, 142, 138, 136, 136, 135, 133, 132, 127, 125, 123, 122, 121, 118, 117, 116, 117, 117, 113, 113, 110, 109, 106, 105, 103, 101, 99, 99, 100, 103, 103, 106, 106, 110, 111, 111, 110, 106, 104, 103, 103, 104, 102, 104, 106, 110, 114, 116, 119, 122, 125, 127, 131, 133, 133, 134, 136, 140, 144, 145, 150, 151, 153, 154, 153, 153, 149, 144, 142, 141, 139, 136, 137, 138, 140, 141, 142, 144, 142, 140, 138, 136, 135, 129, 128, 128, 127, 127, 127, 129, 128, 128, 130, 130, 130, 126, 123, 122, 120, 117, 115, 114, 114, 114, 116, 115, 117, 115, 116, 115, 115, 115, 115, 116, 121, 123, 127, 128, 132, 132, 134, 136, 137, 135, 134, 135, 138, 139, 141, 142, 144, 143, 142, 141, 140, 137, 138, 141, 146, 147, 150, 149, 148, 145, 140, 138, 135, 134, 134, 137, 142, 142, 140, 139, 134, 131, 125, 120, 115, 112, 109, 108, 110, 110, 108, 109, 109, 110, 107, 107, 105, 103, 101, 102, 105, 108, 108, 111, 111, 113, 112, 110, 108, 107, 104, 103, 103, 103, 101, 103, 104, 108, 109, 112, 116, 120, 124, 126, 129, 131, 128, 129, 128, 129, 129, 130, 133, 136, 139, 142, 143, 145, 142, 140, 139, 138, 139, 140, 144, 147, 149, 147, 145, 144, 140, 139, 141, 143, 147, 145, 144, 139, 133, 125, 119, 118, 118, 120, 126, 129, 133, 131, 128, 125, 120, 115, 112, 113, 115, 118, 123, 125, 130, 131, 132, 130, 127, 124, 121, 122, 124, 126, 129, 129, 132, 132, 134, 137, 139, 140, 140, 141, 141, 138, 137, 135, 138, 140, 145, 149, 150, 151, 150, 149, 149, 145, 144, 142, 140, 140, 139, 138, 134, 132, 129, 128, 130, 130, 130, 131, 132, 132, 129, 126, 122, 121, 120, 121, 125, 124, 122, 122, 118, 115, 111, 109, 108, 109, 111, 116, 121, 121, 121, 119, 115, 115, 112, 110, 110, 112, 114, 117, 119, 120, 118, 118, 116, 117, 116, 115, 119, 124, 127, 130, 132, 133, 130, 129, 127, 128, 126, 127, 128, 130, 130, 130, 128, 128, 125, 124, 125, 127, 127, 128, 131, 134, 135, 133, 132, 131, 128, 126, 125, 123, 122, 119, 119, 117, 118, 116, 117, 120, 120, 121, 122, 122, 124, 123, 124, 126, 126, 124, 122, 122, 120, 119, 119, 118, 121, 122, 123, 123, 122, 121, 121, 125, 128, 131, 135, 135, 139, 137, 137, 136, 132, 130, 128, 127, 130, 130, 132, 130, 132, 132, 133, 134, 134, 136, 138, 139, 141, 138, 138, 135, 135, 135, 135, 135, 134, 134, 131, 130, 131, 130, 131, 132, 133, 135, 136, 135, 133, 133, 131, 130, 130, 126, 125, 125, 123, 125, 124, 124, 124, 125, 123, 123, 123, 122, 122, 122, 121, 124, 123, 121, 122, 122, 122, 122, 122, 122, 121, 123, 124, 127, 127, 128, 130, 130, 130, 129, 129, 129, 128, 129, 130, 132, 132, 134, 136, 137, 137, 137, 136, 137, 134, 135, 134, 136, 136, 136, 137, 136, 135, 133, 130, 132, 130, 130, 129, 129, 130, 129, 129, 130, 130, 128, 127, 128, 125, 125, 123, 120, 122, 121, 122, 122, 122, 121, 120, 121, 122, 123, 123, 122, 125, 125, 126, 126, 125, 123, 122, 121, 121, 120, 121, 121, 124, 124, 126, 128, 128, 129, 130, 131, 133, 132, 133, 131, 133, 132, 132, 132, 131, 131, 131, 131, 131, 128, 129, 129, 130, 131, 132, 132, 131, 130, 129, 128, 129, 124, 124, 123, 123, 124, 125, 125, 126, 127, 127, 128, 129, 126, 126, 126, 125, 126, 125, 124, 125, 124, 123, 124, 125, 124, 124, 124, 123, 126, 125, 125, 126, 126, 126, 126, 127, 125, 124, 125, 124, 125, 123, 123, 124, 125, 124, 124, 124, 126, 125, 127, 127, 130, 129, 130, 129, 128, 127, 125, 124, 125, 124, 126, 127, 129, 129, 129, 129, 129, 128, 125, 126, 128, 126, 128, 127, 127, 129, 128, 126, 127, 125, 124, 124, 126, 124, 126, 125, 125, 126, 125, 125, 126, 126, 125, 125, 126, 125, 124, 122, 120, 123, 123, 123, 125, 125, 125, 126, 128, 129, 129, 129, 128, 131, 129, 130, 130, 130, 130, 130, 132, 134, 133, 134, 133, 134, 134, 135, 134, 134, 135, 134, 134, 135, 132, 132, 131, 132, 131, 131, 131, 131, 131, 128, 128, 129, 126, 127, 125, 126, 127, 127, 127, 127, 126, 125, 125, 125, 123, 124, 124, 124, 125, 124, 123, 125, 124, 123, 123, 124, 123, 124, 123, 123, 126, 125, 125, 126, 126, 127, 127, 127, 127, 126, 127, 127, 129, 128, 129, 130, 130, 130, 129, 129, 131, 130, 130, 130, 131, 132, 132, 132, 132, 132, 130, 131, 131, 129, 131, 130, 130, 130, 129, 128, 129, 128, 127, 127, 129, 127, 127, 125, 125, 126, 126, 125, 126, 125, 125, 124, 126, 124, 126, 124, 124, 124, 123, 124, 125, 125, 125, 124, 125, 124, 125, 123, 122, 125, 124, 123, 123, 122, 122, 122, 123, 124, 125, 124, 124, 126, 125, 126, 124, 124, 125, 124, 126, 128, 127, 128, 128, 129, 129, 130, 128, 128, 130, 129, 130, 131, 129, 130, 129, 130, 131, 132, 131, 132, 132, 130, 131, 131, 128, 129, 128, 129, 131, 131, 130, 130, 129, 127, 128, 129, 127, 129, 128, 129, 129, 128, 127, 128, 126, 126, 125, 126, 125, 126, 125, 125, 126, 125, 126, 126, 126, 127, 127, 128, 129, 128, 128, 128, 129, 127, 127, 128, 128, 128, 126, 126, 128, 127, 128, 128, 129, 129, 129, 128, 128, 128, 127, 127, 128, 127, 129, 129, 130, 130, 129, 128, 129, 129, 128, 128, 130, 129, 130, 128, 128, 129, 128, 127, 127, 127, 127, 128, 128, 127, 128, 126, 126, 127, 126, 126, 127, 127, 128, 127, 127, 127, 127, 125, 126, 128, 127, 127, 126, 124, 126, 125, 126, 127, 127, 126, 127, 128, 127, 127, 126, 125, 126, 124, 126, 128, 127, 128, 127, 127, 127, 128, 126, 127, 128, 126, 127, 128, 125, 126, 126, 126, 127, 127, 126, 127, 128, 127, 127, 127, 126, 126, 126, 127, 128, 128, 127, 127, 126, 126, 126, 126, 124, 126, 124, 125, 125, 124, 125, 126, 125, 126, 126, 126, 126, 127, 125, 125, 125, 124, 125, 125, 124, 126, 125, 126, 127, 126, 125, 127, 127, 127, 128, 128, 128, 128, 126, 127, 128, 127, 128, 128, 128, 129, 129, 129, 129, 129, 128, 128, 129, 127, 129, 129, 129, 131, 131, 129, 130, 126, 124, 125, 126, 128, 132, 129, 130, 131, 129, 128, 128, 129, 128, 127, 126, 123, 123, 123, 125, 127, 131, 133, 132, 129, 130, 131, 127, 128, 124, 109, 125, 139, 105, 134, 126, 123, 132, 128, 139, 127, 140, 135, 132, 135, 134, 124, 135, 128, 120, 125, 123, 124, 125, 127, 119, 131, 126, 124, 115, 127, 109, 127, 141, 117, 118, 140, 117, 140, 124, 138, 141, 130, 124, 144, 122, 115, 126, 132, 145, 127, 137, 139, 135, 146, 113, 128, 138, 136, 109, 141, 115, 120, 101, 134, 125, 118, 131, 124, 121, 137, 111, 126, 136, 126, 125, 126, 142, 120, 110, 129, 115, 140, 121, 125, 121, 124, 124, 134, 146, 130, 137, 137, 133, 130, 123, 125, 135, 129, 128, 117, 133, 110, 125, 127, 140, 133, 141, 129, 131, 122, 139, 122, 125, 130, 122, 119, 117, 118, 123, 122, 135, 127, 130, 129, 133, 123, 122, 128, 127, 127, 125, 120, 115, 116, 126, 112, 132, 136, 133, 135, 139, 116, 129, 132, 128, 128, 131, 131, 127, 122, 121, 118, 130, 135, 133, 132, 135, 135, 128, 127, 126, 129, 120, 124, 131, 119, 123, 119, 133, 133, 128, 133, 131, 144, 124, 129, 127, 137, 122, 132, 123, 125, 128, 131, 128, 129, 139, 129, 138, 126, 127, 121, 125, 112, 119, 122, 125, 114, 123, 115, 130, 128, 128, 131, 132, 123, 126, 120, 116, 130, 128, 123, 133, 120, 130, 132, 130, 135, 136, 137, 142, 130, 124, 133, 125, 122, 124, 129, 122, 127, 127, 113, 125, 133, 129, 119, 144, 136, 122, 124, 124, 132, 123, 124, 128, 132, 126, 121, 119, 132, 125, 138, 133, 141, 132, 126, 124, 127, 131, 120, 122, 131, 134, 120, 112, 127, 124, 134, 122, 130, 136, 133, 121, 120, 125, 128, 129, 133, 112, 125, 129, 118, 122, 132, 136, 133, 135, 136, 127, 120, 134, 130, 124, 123, 124, 138, 120, 124, 127, 126, 134, 136, 122, 139, 121, 122, 119, 119, 122, 126, 124, 123, 117, 126, 135, 130, 132, 139, 128, 126, 127, 119, 123, 129, 123, 128, 133, 130, 126, 126, 131, 131, 127, 133, 134, 137, 116, 129, 124, 126, 111, 130, 128, 139, 114, 120, 121, 119, 130, 128, 130, 133, 120, 130, 123, 127, 122, 131, 121, 127, 125, 131, 120, 128, 133, 134, 134, 133, 134, 133, 121, 123, 120, 124, 126, 137, 124, 126, 125, 126, 131, 122, 141, 125, 130, 124, 120, 127, 116, 124, 129, 127, 131, 126, 130, 134, 120, 127, 128, 127, 127, 131, 123, 123, 130, 124, 132, 137, 128, 133, 124, 125, 128, 126, 128, 131, 131, 133, 123, 122, 131, 120, 132, 126, 127, 122, 132, 120, 125, 125, 129, 130, 130, 131, 132, 131, 119, 119, 130, 124, 129, 125, 132, 127, 119, 130, 135, 130, 135, 124, 126, 130, 122, 120, 129, 128, 124, 129, 133, 126, 129, 123, 133, 125, 127, 132, 131, 130, 122, 122, 129, 127, 132, 131, 128, 132, 122, 122, 129, 128, 126, 133, 130, 127, 129, 132, 133, 123, 132, 129, 123, 127, 115, 130, 126, 122, 125, 126, 139, 130, 124, 134, 122, 126, 127, 129, 129, 127, 124, 123, 123, 128, 128, 134, 132, 131, 129, 121, 126, 127, 129, 125, 128, 134, 119, 130, 127, 129, 131, 127, 126, 129, 128, 128, 123, 125, 125, 127, 128, 131, 128, 129, 122, 123, 125, 126, 134, 128, 129, 128, 121, 124, 128, 125, 133, 130, 127, 121, 124, 127, 121, 129, 126, 132, 125, 133, 126, 126, 128, 127, 124, 128, 123, 124, 122, 126, 122, 130, 128, 129, 130, 134, 125, 126, 126, 126, 124, 130, 122, 127, 130, 120, 124, 134, 129, 135, 131, 126, 129, 124, 124, 131, 126, 128, 128, 128, 127, 125, 128, 131, 128, 129, 127, 125, 129, 125, 128, 122, 130, 131, 127, 131, 126, 121, 127, 127, 123, 130, 124, 130, 129, 123, 126, 129, 124, 134, 131, 129, 124, 123, 124, 124, 129, 125, 128, 131, 126, 126, 126, 130, 126, 130, 131, 129, 124, 123, 124, 128, 122, 130, 125, 129, 131, 126, 127, 125, 131, 126, 131, 126, 128, 128, 123, 126, 123, 126, 129, 131, 128, 131, 131, 124, 127, 128, 132, 126, 131, 126, 125, 127, 126, 125, 129, 129, 130, 129, 126, 126, 125, 129, 130, 127, 125, 128, 119, 127, 125, 128, 128, 127, 130, 125, 126, 128, 128, 128, 125, 132, 128, 126, 131, 129, 127, 131, 128, 126, 131, 127, 125, 131, 125, 126, 130, 130, 125, 130, 124, 124, 124, 130, 131, 131, 127, 126, 126, 124, 128, 128, 132, 128, 128, 127, 123, 123, 128, 126, 134, 128, 132, 131, 137, 135, 145, 148, 150, 145, 142, 142, 131, 133, 126, 122, 128, 119, 93, 89, 76, 73, 74, 85, 90, 91, 80, 81, 77, 81, 99, 110, 120, 133, 136, 142, 137, 143, 156, 168, 178, 187, 191, 194, 189, 178, 188, 193, 195, 195, 179, 176, 161, 149, 151, 146, 144, 134, 128, 112, 106, 93, 89, 91, 93, 87, 87, 75, 78, 76, 78, 83, 85, 97, 95, 98, 100, 92, 101, 106, 108, 119, 120, 120, 121, 113, 115, 118, 125, 135, 142, 139, 144, 137, 138, 147, 166, 168, 180, 176, 174, 163, 158, 152, 164, 166, 169, 161, 146, 138, 124, 117, 123, 121, 121, 114, 101, 94, 77, 76, 86, 91, 100, 95, 90, 86, 67, 72, 79, 88, 107, 112, 100, 99, 90, 82, 93, 119, 139, 156, 153, 155, 139, 131, 136, 150, 160, 178, 162, 153, 139, 133, 142, 157, 175, 195, 184, 171, 162, 148, 154, 171, 186, 201, 187, 175, 161, 144, 149, 162, 173, 196, 186, 162, 144, 121, 115, 123, 140, 159, 164, 147, 125, 104, 89, 94, 112, 131, 141, 121, 101, 80, 64, 69, 92, 109, 125, 104, 81, 57, 42, 48, 70, 95, 114, 100, 79, 61, 49, 53, 76, 103, 126, 112, 98, 76, 65, 69, 93, 124, 153, 151, 139, 122, 102, 101, 116, 145, 171, 169, 151, 132, 108, 102, 114, 140, 175, 179, 161, 149, 124, 114, 124, 143, 171, 179, 157, 145, 119, 102, 112, 130, 160, 175, 156, 140, 117, 93, 98, 114, 138, 160, 142, 126, 105, 83, 86, 110, 138, 165, 154, 136, 121, 101, 100, 118, 145, 170, 165, 148, 131, 112, 111, 129, 149, 177, 177, 165, 152, 133, 126, 142, 161, 189, 188, 170, 155, 133, 122, 133, 149, 176, 179, 162, 144, 121, 111, 121, 137, 163, 165, 148, 131, 103, 91, 100, 113, 143, 150, 134, 119, 92, 81, 92, 103, 135, 144, 126, 111, 81, 65, 77, 89, 121, 131, 115, 103, 77, 61, 75, 86, 116, 130, 113, 103, 79, 65, 75, 87, 113, 134, 122, 115, 94, 80, 90, 101, 129, 150, 148, 140, 125, 106, 115, 127, 156, 181, 178, 169, 151, 133, 135, 149, 171, 198, 195, 182, 166, 144, 143, 152, 170, 187, 185, 165, 149, 121, 113, 119, 134, 153, 153, 134, 118, 94, 82, 89, 104, 123, 126, 107, 90, 66, 58, 69, 88, 112, 118, 105, 93, 77, 67, 80, 97, 122, 128, 116, 105, 91, 83, 97, 114, 139, 155, 147, 137, 123, 110, 122, 136, 160, 174, 167, 156, 143, 128, 138, 153, 177, 192, 187, 171, 155, 137, 140, 150, 169, 182, 177, 162, 143, 125, 125, 135, 152, 166, 160, 149, 127, 108, 104, 111, 128, 145, 143, 131, 114, 93, 89, 97, 115, 133, 134, 126, 106, 90, 82, 90, 107, 127, 128, 124, 105, 91, 85, 89, 108, 126, 130, 129, 113, 99, 94, 99, 113, 136, 138, 136, 124, 109, 103, 107, 118, 142, 146, 146, 136, 118, 116, 117, 128, 149, 154, 153, 143, 127, 119, 121, 128, 149, 156, 152, 147, 128, 122, 123, 127, 144, 154, 148, 143, 124, 115, 114, 119, 132, 145, 141, 136, 123, 110, 110, 114, 125, 140, 137, 130, 117, 104, 101, 104, 113, 130, 127, 127, 114, 102, 101, 103, 114, 130, 132, 130, 122, 110, 106, 109, 117, 137, 140, 140, 136, 123, 120, 125, 130, 148, 154, 154, 149, 136, 132, 132, 139, 152, 159, 156, 153, 138, 132, 132, 135, 148, 155, 152, 149, 135, 125, 128, 128, 138, 149, 140, 140, 126, 113, 115, 118, 124, 137, 132, 127, 119, 106, 106, 112, 117, 129, 128, 121, 114, 100, 97, 104, 110, 122, 123, 118, 110, 101, 97, 105, 113, 125, 128, 119, 114, 102, 98, 106, 113, 123, 127, 121, 116, 109, 104, 113, 120, 131, 138, 133, 129, 122, 116, 117, 128, 136, 146, 145, 139, 133, 126, 127, 137, 147, 156, 156, 146, 138, 133, 127, 139, 147, 154, 153, 144, 136, 131, 126, 134, 143, 148, 146, 136, 124, 120, 113, 118, 127, 133, 132, 124, 115, 111, 107, 113, 122, 128, 128, 120, 111, 108, 105, 108, 119, 125, 129, 122, 116, 115, 113, 117, 129, 136, 141, 136, 127, 124, 123, 122, 133, 140, 146, 143, 139, 133, 132, 130, 140, 148, 155, 150, 140, 134, 132, 128, 139, 146, 150, 147, 136, 127, 128, 122, 131, 141, 143, 139, 130, 118, 119, 118, 122, 131, 132, 128, 121, 112, 111, 110, 113, 124, 127, 127, 118, 110, 106, 110, 111, 121, 126, 127, 117, 108, 105, 109, 113, 130, 132, 152, 135, 125, 124, 128, 126, 140, 147, 142, 132, 117, 105, 106, 104, 103, 107, 106, 91, 81, 73, 78, 78, 84, 94, 102, 101, 99, 99, 104, 117, 126, 148, 157, 164, 161, 161, 165, 179, 193, 209, 213, 211, 199, 190, 188, 188, 188, 188, 183, 172, 151, 135, 125, 125, 125, 125, 123, 118, 98, 81, 75, 73, 79, 83, 85, 89, 82, 73, 75, 79, 92, 101, 109, 115, 107, 100, 99, 103, 114, 118, 125, 129, 123, 114, 114, 122, 133, 146, 157, 164, 165, 154, 151, 155, 168, 180, 188, 194, 187, 169, 161, 153, 156, 162, 160, 159, 152, 132, 120, 112, 113, 121, 119, 116, 112, 91, 77, 72, 74, 89, 94, 94, 97, 84, 72, 70, 76, 92, 103, 110, 118, 109, 98, 96, 98, 117, 130, 137, 148, 139, 126, 121, 120, 136, 151, 158, 169, 165, 150, 142, 141, 150, 168, 176, 183, 183, 167, 158, 158, 164, 180, 187, 191, 191, 174, 164, 161, 165, 177, 183, 183, 180, 162, 143, 132, 132, 138, 145, 143, 141, 127, 110, 102, 102, 111, 125, 127, 128, 116, 95, 81, 78, 81, 92, 94, 94, 84, 64, 51, 50, 58, 72, 80, 83, 80, 65, 55, 55, 64, 81, 96, 102, 103, 92, 83, 82, 91, 107, 125, 131, 136, 124, 117, 116, 123, 138, 154, 160, 165, 153, 142, 134, 137, 148, 161, 165, 166, 157, 141, 134, 137, 146, 163, 170, 170, 162, 144, 134, 132, 137, 149, 153, 152, 142, 120, 106, 102, 109, 123, 136, 137, 135, 119, 108, 106, 111, 127, 143, 146, 146, 129, 116, 111, 112, 125, 145, 150, 153, 143, 130, 125, 131, 144, 164, 172, 172, 165, 150, 140, 142, 150, 166, 172, 169, 160, 140, 127, 127, 134, 149, 159, 160, 153, 135, 122, 120, 126, 138, 150, 149, 142, 124, 106, 100, 103, 113, 128, 131, 127, 113, 98, 93, 98, 107, 121, 125, 121, 108, 92, 82, 84, 93, 107, 114, 110, 97, 83, 74, 75, 86, 103, 114, 114, 104, 91, 84, 85, 96, 113, 125, 127, 119, 105, 97, 97, 110, 129, 144, 150, 146, 137, 130, 130, 141, 158, 172, 178, 174, 163, 153, 149, 155, 169, 182, 188, 187, 172, 160, 153, 153, 163, 172, 173, 170, 153, 135, 123, 119, 125, 133, 136, 132, 116, 97, 86, 83, 89, 101, 109, 110, 98, 82, 74, 73, 81, 96, 106, 112, 104, 89, 81, 78, 85, 102, 116, 127, 123, 112, 105, 102, 109, 124, 137, 149, 147, 135, 127, 123, 125, 138, 151, 161, 164, 154, 146, 141, 142, 155, 167, 176, 177, 162, 151, 143, 141, 147, 156, 162, 164, 151, 138, 128, 123, 127, 136, 142, 149, 140, 126, 117, 109, 113, 123, 129, 138, 132, 120, 111, 101, 103, 111, 118, 127, 125, 112, 105, 99, 100, 109, 117, 125, 126, 114, 107, 101, 100, 109, 115, 123, 126, 115, 111, 106, 105, 114, 123, 131, 139, 129, 121, 117, 115, 122, 131, 136, 144, 137, 127, 124, 119, 124, 135, 140, 150, 147, 139, 133, 129, 130, 138, 145, 153, 152, 141, 135, 130, 128, 135, 139, 145, 148, 138, 132, 126, 125, 131, 136, 141, 142, 132, 125, 121, 118, 122, 127, 129, 132, 124, 115, 112, 110, 113, 119, 123, 130, 124, 117, 111, 108, 111, 118, 124, 131, 129, 122, 118, 117, 119, 125, 133, 140, 141, 134, 131, 129, 131, 136, 141, 148, 150, 142, 138, 135, 135, 138, 142, 147, 148, 142, 136, 133, 131, 134, 139, 143, 146, 138, 131, 126, 124, 125, 129, 133, 135, 129, 121, 115, 113, 115, 119, 123, 126, 123, 116, 111, 108, 107, 111, 115, 120, 117, 111, 107, 104, 104, 109, 111, 116, 116, 112, 107, 105, 105, 108, 112, 115, 118, 115, 112, 110, 111, 114, 118, 121, 125, 123, 119, 119, 120, 123, 127, 133, 137, 138, 134, 132, 133, 135, 141, 145, 150, 149, 144, 141, 140, 140, 145, 149, 153, 151, 147, 143, 142, 140, 142, 145, 147, 147, 141, 136, 134, 130, 131, 133, 134, 133, 129, 124, 121, 119, 121, 123, 126, 125, 123, 118, 117, 116, 116, 119, 122, 122, 119, 114, 111, 113, 115, 120, 122, 125, 124, 122, 119, 120, 122, 126, 131, 133, 133, 131, 129, 129, 131, 134, 139, 143, 143, 140, 136, 136, 137, 140, 142, 145, 144, 142, 138, 136, 136, 136, 138, 141, 139, 135, 131, 129, 129, 129, 129, 131, 131, 127, 124, 121, 121, 122, 123, 125, 125, 122, 119, 115, 113, 114, 117, 119, 119, 116, 113, 111, 113, 114, 116, 118, 120, 117, 117, 115, 115, 115, 116, 118, 121, 121, 121, 120, 120, 122, 123, 127, 129, 128, 129, 132, 126, 126, 130, 129, 130, 129, 130, 133, 137, 137, 135, 132, 131, 128, 129, 131, 134, 133, 130, 129, 125, 126, 128, 130, 130, 136, 129, 130, 129, 126, 121, 127, 126, 130, 132, 130, 129, 125, 120, 121, 127, 129, 135, 128, 123, 123, 120, 121, 123, 124, 132, 136, 128, 127, 123, 121, 123, 129, 131, 137, 132, 127, 129, 123, 118, 124, 128, 125, 128, 128, 129, 140, 141, 137, 137, 132, 126, 131, 129, 130, 137, 130, 123, 125, 120, 122, 132, 130, 143, 144, 132, 137, 137, 124, 131, 132, 131, 146, 135, 128, 131, 119, 116, 128, 124, 134, 139, 124, 122, 121, 113, 120, 131, 133, 145, 142, 128, 123, 113, 102, 111, 119, 125, 139, 129, 115, 115, 106, 106, 123, 126, 135, 142, 126, 123, 122, 112, 117, 126, 124, 139, 132, 121, 120, 118, 114, 129, 132, 139, 146, 132, 124, 123, 123, 125, 137, 136, 149, 145, 133, 128, 128, 123, 131, 134, 135, 144, 129, 124, 126, 127, 130, 140, 135, 141, 138, 124, 127, 127, 124, 129, 131, 125, 135, 124, 117, 123, 122, 122, 132, 128, 128, 132, 117, 117, 122, 121, 127, 136, 128, 131, 127, 109, 113, 118, 118, 131, 138, 128, 135, 123, 111, 122, 125, 127, 142, 136, 129, 136, 117, 117, 128, 125, 132, 142, 128, 132, 131, 115, 124, 128, 124, 138, 139, 130, 140, 127, 118, 126, 123, 125, 139, 132, 133, 137, 122, 121, 128, 123, 130, 136, 127, 134, 132, 123, 127, 130, 124, 131, 129, 127, 136, 131, 126, 129, 123, 120, 126, 124, 131, 136, 127, 124, 121, 116, 121, 127, 131, 139, 135, 126, 122, 116, 116, 123, 127, 133, 134, 126, 120, 120, 117, 124, 129, 134, 138, 135, 127, 125, 122, 121, 129, 130, 136, 135, 128, 120, 121, 116, 126, 134, 139, 143, 137, 126, 121, 119, 119, 134, 137, 140, 135, 124, 114, 115, 115, 127, 139, 141, 138, 126, 116, 112, 115, 122, 136, 142, 139, 128, 116, 110, 110, 119, 131, 145, 143, 135, 119, 112, 108, 115, 127, 141, 149, 140, 127, 114, 113, 113, 129, 139, 152, 147, 131, 115, 110, 111, 122, 138, 146, 155, 139, 124, 112, 114, 117, 136, 143, 153, 148, 127, 114, 108, 109, 123, 137, 144, 150, 133, 117, 110, 108, 120, 138, 145, 150, 140, 116, 105, 99, 106, 125, 139, 147, 144, 126, 111, 108, 108, 124, 137, 148, 144, 134, 114, 105, 102, 113, 128, 144, 147, 138, 125, 108, 106, 110, 125, 139, 153, 142, 133, 113, 103, 107, 119, 133, 152, 149, 137, 124, 107, 107, 120, 130, 149, 152, 140, 128, 114, 107, 117, 128, 141, 152, 144, 133, 118, 111, 112, 126, 135, 149, 146, 140, 123, 118, 111, 121, 131, 144, 147, 144, 129, 117, 113, 112, 125, 136, 144, 141, 134, 115, 113, 110, 119, 131, 142, 138, 137, 122, 113, 113, 116, 125, 140, 138, 135, 127, 114, 114, 119, 122, 135, 141, 134, 134, 123, 116, 120, 122, 127, 141, 133, 132, 127, 118, 118, 126, 125, 140, 140, 134, 132, 123, 117, 124, 125, 133, 140, 134, 131, 124, 117, 119, 126, 130, 139, 134, 131, 123, 121, 119, 125, 126, 135, 130, 130, 124, 119, 119, 122, 126, 134, 135, 129, 130, 119, 120, 122, 124, 129, 134, 125, 128, 123, 118, 124, 125, 128, 138, 132, 129, 128, 117, 118, 126, 125, 135, 132, 125, 125, 121, 117, 127, 129, 134, 138, 128, 125, 121, 116, 120, 129, 132, 139, 131, 126, 123, 120, 120, 130, 134, 140, 135, 126, 123, 118, 118, 124, 132, 138, 140, 128, 124, 120, 117, 124, 130, 138, 142, 134, 123, 122, 114, 120, 126, 132, 140, 137, 127, 122, 117, 114, 128, 130, 139, 139, 130, 122, 121, 114, 121, 131, 133, 140, 131, 125, 121, 120, 118, 131, 134, 141, 138, 127, 120, 117, 119, 123, 132, 135, 139, 131, 126, 119, 122, 124, 131, 138, 137, 135, 127, 119, 115, 121, 124, 135, 136, 136, 130, 125, 118, 120, 124, 131, 138, 137, 133, 124, 118, 112, 118, 124, 133, 137, 137, 130, 124, 119, 117, 126, 130, 136, 136, 132, 123, 119, 114, 119, 127, 131, 136, 133, 129, 122, 123, 120, 128, 131, 134, 134, 131, 124, 121, 119, 123, 130, 132, 133, 132, 129, 121, 122, 121, 130, 134, 134, 134, 131, 127, 120, 121, 121, 130, 131, 133, 133, 128, 124, 122, 122, 125, 131, 131, 133, 132, 127, 123, 122, 120, 124, 127, 130, 133, 135, 130, 126, 125, 122, 127, 129, 131, 132, 132, 123, 120, 117, 121, 122, 124, 124, 129, 137, 140, 116, 129, 118, 123, 123, 133, 138, 130, 134, 135, 120, 125, 124, 127, 144, 138, 133, 126, 123, 115, 125, 127, 124, 134, 129, 118, 120, 116, 103, 142, 135, 122, 139, 126, 111, 129, 108, 129, 154, 132, 144, 153, 119, 111, 125, 120, 144, 129, 141, 151, 129, 122, 108, 112, 122, 140, 121, 160, 128, 124, 98, 127, 118, 115, 144, 133, 145, 129, 91, 121, 117, 113, 117, 129, 152, 125, 127, 113, 126, 122, 131, 140, 130, 134, 134, 133, 128, 111, 118, 133, 143, 133, 138, 128, 127, 134, 114, 125, 140, 124, 136, 137, 124, 116, 127, 117, 124, 145, 145, 122, 134, 126, 117, 122, 119, 122, 142, 132, 131, 128, 107, 125, 122, 122, 126, 135, 137, 133, 116, 116, 108, 120, 119, 124, 135, 135, 134, 133, 123, 113, 132, 131, 139, 137, 138, 138, 114, 118, 112, 112, 135, 139, 130, 143, 135, 121, 120, 130, 125, 144, 132, 137, 140, 115, 117, 114, 121, 121, 132, 130, 142, 138, 124, 127, 124, 133, 130, 143, 137, 146, 129, 126, 116, 120, 119, 131, 143, 124, 133, 116, 118, 108, 120, 123, 142, 130, 137, 122, 121, 122, 112, 117, 133, 129, 126, 128, 116, 127, 121, 116, 128, 137, 138, 137, 138, 124, 125, 119, 130, 129, 138, 144, 138, 125, 115, 118, 105, 119, 136, 125, 136, 142, 121, 104, 130, 122, 127, 139, 135, 140, 129, 115, 119, 117, 119, 125, 140, 136, 138, 135, 116, 124, 121, 122, 137, 137, 146, 128, 116, 125, 127, 109, 125, 135, 130, 142, 119, 120, 120, 122, 118, 129, 141, 129, 140, 126, 105, 125, 122, 117, 133, 140, 136, 128, 119, 124, 117, 116, 140, 139, 134, 129, 133, 128, 115, 124, 127, 130, 141, 138, 130, 132, 111, 119, 113, 124, 135, 135, 133, 128, 118, 122, 126, 126, 133, 144, 127, 139, 121, 119, 119, 121, 124, 136, 139, 140, 134, 130, 126, 128, 122, 130, 140, 133, 127, 131, 117, 124, 110, 128, 135, 135, 121, 129, 114, 116, 122, 120, 122, 132, 127, 141, 128, 131, 122, 124, 121, 127, 129, 135, 120, 134, 129, 125, 127, 128, 142, 139, 132, 134, 125, 118, 126, 121, 125, 129, 130, 134, 134, 121, 130, 113, 120, 116, 134, 129, 133, 125, 125, 120, 123, 125, 134, 141, 128, 132, 125, 120, 119, 120, 127, 129, 139, 136, 137, 124, 127, 122, 124, 127, 137, 131, 128, 129, 119, 122, 119, 122, 139, 131, 139, 131, 119, 108, 124, 118, 132, 129, 140, 135, 128, 123, 121, 127, 120, 127, 140, 128, 131, 120, 122, 115, 121, 131, 143, 137, 135, 122, 125, 122, 116, 125, 134, 135, 126, 137, 126, 117, 125, 121, 132, 132, 128, 132, 137, 121, 117, 123, 127, 132, 135, 134, 133, 133, 115, 117, 126, 130, 126, 134, 133, 132, 123, 126, 126, 125, 128, 132, 125, 133, 123, 123, 126, 121, 120, 127, 140, 131, 128, 133, 114, 121, 125, 120, 131, 133, 127, 129, 123, 127, 126, 127, 132, 135, 129, 125, 129, 124, 123, 122, 128, 133, 127, 131, 134, 136, 123, 122, 124, 127, 130, 133, 126, 131, 122, 120, 122, 131, 127, 134, 127, 127, 130, 121, 127, 121, 129, 127, 133, 131, 133, 128, 124, 124, 122, 124, 126, 136, 126, 134, 123, 122, 123, 131, 129, 135, 132, 129, 129, 119, 119, 125, 123, 130, 129, 128, 130, 125, 124, 128, 126, 128, 132, 126, 126, 129, 120, 125, 125, 123, 128, 138, 132, 130, 129, 122, 122, 125, 128, 133, 131, 128, 127, 127, 121, 125, 129, 131, 136, 131, 126, 125, 124, 121, 125, 126, 130, 134, 127, 129, 125, 119, 124, 124, 125, 133, 128, 129, 131, 124, 124, 127, 124, 136, 133, 131, 125, 125, 121, 119, 126, 126, 129, 134, 129, 130, 129, 126, 125, 127, 128, 130, 127, 126, 128, 126, 119, 126, 125, 131, 131, 131, 128, 128, 129, 120, 128, 127, 131, 133, 128, 127, 123, 125, 124, 128, 128, 132, 132, 126, 126, 127, 127, 125, 134, 132, 133, 131, 128, 123, 127, 120, 125, 128, 127, 127, 125, 129, 125, 120, 123, 126, 129, 132, 129, 128, 127, 125, 124, 119, 128, 133, 127, 128, 126, 128, 126, 122, 131, 129, 132, 131, 127, 129, 129, 127, 125, 133, 127, 127, 126, 127, 123, 127, 125, 125, 126, 134, 125, 131, 124, 130, 126, 126, 130, 128, 129, 127, 125, 127, 124, 127, 127, 129, 131, 128, 128, 127, 127, 129, 129, 132, 130, 131, 126, 127, 122, 124, 121, 126, 128, 130, 127, 129, 128, 127, 127, 128, 128, 128, 121, 128, 123, 125, 125, 127, 130, 130, 138, 137, 135, 126, 126, 126, 120, 123, 130, 132, 133, 125, 126, 121, 119, 122, 126, 134, 131, 134, 130, 123, 127, 121, 125, 123, 130, 127, 133, 128, 130, 125, 126, 120, 127, 124, 131, 124, 131, 130, 126, 126, 127, 123, 129, 126, 125, 129, 130, 135, 125, 133, 122, 118, 121, 121, 127, 124, 133, 129, 127, 132, 128, 128, 127, 134, 130, 137, 140, 141, 134, 120, 106, 113, 107, 112, 112, 131, 139, 146, 151, 141, 137, 123, 127, 128, 131, 140, 138, 142, 128, 107, 106, 98, 103, 109, 131, 138, 151, 145, 130, 124, 122, 117, 119, 129, 135, 140, 144, 138, 124, 121, 106, 106, 104, 121, 122, 139, 139, 140, 129, 136, 119, 119, 118, 135, 137, 152, 150, 136, 129, 113, 105, 103, 113, 121, 133, 145, 140, 128, 125, 116, 124, 122, 139, 142, 156, 151, 142, 125, 118, 108, 107, 102, 124, 119, 135, 126, 125, 123, 125, 117, 126, 133, 142, 143, 147, 146, 130, 132, 114, 118, 107, 118, 118, 129, 132, 131, 119, 131, 119, 125, 116, 134, 128, 146, 146, 132, 137, 135, 120, 117, 110, 117, 117, 129, 129, 127, 134, 123, 126, 116, 129, 125, 134, 150, 144, 131, 139, 120, 121, 108, 123, 116, 133, 137, 123, 123, 125, 114, 119, 120, 134, 133, 148, 144, 130, 135, 126, 128, 118, 133, 126, 129, 134, 121, 114, 124, 115, 123, 118, 136, 125, 140, 136, 130, 128, 130, 127, 124, 123, 125, 121, 134, 129, 118, 125, 124, 122, 115, 127, 122, 133, 142, 139, 127, 135, 125, 123, 117, 130, 121, 137, 137, 127, 119, 121, 112, 112, 122, 130, 128, 148, 145, 128, 131, 127, 122, 119, 134, 128, 137, 142, 132, 118, 122, 115, 111, 118, 128, 125, 142, 146, 133, 125, 131, 122, 119, 124, 129, 131, 142, 141, 123, 123, 121, 114, 116, 124, 124, 133, 141, 139, 123, 130, 125, 123, 124, 129, 125, 131, 138, 132, 122, 128, 122, 118, 120, 121, 119, 130, 139, 128, 133, 133, 126, 121, 125, 123, 128, 138, 142, 129, 133, 126, 118, 114, 118, 120, 128, 139, 135, 126, 131, 125, 119, 124, 127, 128, 137, 144, 130, 128, 125, 123, 119, 123, 120, 125, 132, 135, 123, 127, 127, 125, 124, 128, 127, 128, 137, 132, 125, 127, 125, 119, 122, 123, 122, 128, 135, 127, 129, 128, 129, 121, 129, 125, 126, 131, 134, 126, 128, 125, 124, 118, 123, 120, 126, 136, 135, 130, 134, 131, 125, 123, 124, 122, 130, 138, 131, 130, 125, 124, 115, 121, 118, 125, 133, 140, 133, 135, 128, 125, 121, 127, 126, 129, 135, 133, 128, 127, 121, 119, 119, 124, 124, 131, 136, 131, 131, 127, 129, 124, 129, 126, 129, 132, 137, 128, 130, 121, 127, 116, 125, 121, 126, 132, 129, 129, 130, 126, 128, 126, 132, 128, 131, 136, 130, 131, 123, 124, 122, 124, 123, 123, 124, 128, 125, 131, 125, 131, 126, 131, 126, 128, 132, 134, 131, 132, 125, 127, 120, 121, 119, 123, 128, 129, 133, 127, 122, 122, 123, 128, 129, 135, 138, 134, 136, 122, 125, 119, 125, 122, 128, 130, 130, 126, 126, 118, 125, 124, 132, 128, 133, 135, 130, 131, 128, 123, 126, 126, 126, 124, 128, 129, 126, 129, 121, 123, 124, 128, 127, 128, 132, 134, 130, 133, 123, 124, 123, 128, 125, 129, 131, 129, 129, 128, 121, 125, 122, 125, 124, 131, 131, 130, 135, 128, 126, 125, 127, 124, 127, 131, 130, 132, 132, 121, 124, 121, 123, 124, 128, 135, 129, 134, 129, 121, 123, 126, 128, 130, 135, 131, 126, 132, 119, 116, 125, 124, 126, 133, 132, 126, 126, 131, 119, 126, 128, 129, 130, 134, 130, 122, 129, 128, 119, 128, 128, 125, 127, 132, 123, 123, 134, 126, 125, 132, 128, 127, 130, 131, 122, 130, 134, 122, 127, 129, 124, 124, 131, 124, 123, 130, 129, 121, 133, 130, 130, 132, 135, 122, 129, 134, 126, 121, 130, 121, 122, 128, 125, 120, 129, 132, 123, 129, 131, 125, 129, 137, 126, 126, 133, 127, 116, 131, 125, 123, 130, 130, 119, 127, 131, 124, 125, 136, 125, 130, 135, 124, 123, 128, 130, 120, 129, 132, 125, 130, 131, 120, 123, 127, 128, 122, 138, 130, 127, 132, 128, 121, 127, 131, 128, 129, 134, 126, 128, 127, 118, 120, 127, 127, 123, 134, 134, 129, 134, 137, 132, 140, 148, 146, 138, 148, 141, 137, 137, 133, 119, 124, 117, 106, 105, 100, 86, 91, 82, 78, 78, 86, 87, 88, 94, 95, 96, 103, 118, 123, 136, 142, 147, 165, 175, 178, 188, 188, 186, 184, 188, 182, 181, 190, 184, 179, 177, 168, 155, 154, 152, 136, 140, 132, 122, 115, 110, 96, 88, 95, 87, 83, 90, 77, 77, 77, 76, 85, 87, 102, 103, 108, 112, 106, 111, 107, 109, 110, 107, 112, 105, 114, 111, 116, 120, 122, 130, 129, 143, 149, 156, 170, 170, 176, 169, 170, 166, 166, 171, 167, 165, 160, 147, 139, 128, 125, 125, 127, 128, 121, 122, 119, 109, 101, 96, 96, 88, 85, 82, 77, 81, 74, 74, 71, 76, 79, 81, 94, 97, 107, 115, 116, 116, 116, 123, 122, 126, 137, 138, 141, 142, 138, 134, 132, 137, 141, 152, 160, 162, 168, 172, 165, 162, 163, 167, 164, 171, 172, 168, 170, 168, 164, 160, 161, 163, 161, 168, 162, 162, 163, 158, 151, 145, 146, 139, 140, 142, 132, 126, 126, 117, 109, 106, 112, 113, 120, 124, 118, 122, 122, 114, 106, 107, 104, 94, 98, 89, 82, 85, 85, 80, 76, 84, 80, 82, 93, 92, 98, 103, 106, 99, 100, 104, 103, 115, 128, 127, 132, 137, 132, 124, 125, 130, 133, 144, 150, 144, 153, 150, 142, 134, 140, 138, 136, 143, 141, 135, 139, 137, 129, 128, 131, 129, 131, 141, 137, 139, 141, 135, 123, 123, 118, 114, 119, 127, 118, 119, 120, 110, 101, 102, 104, 107, 116, 122, 116, 127, 123, 115, 114, 117, 114, 116, 125, 125, 124, 135, 133, 129, 134, 137, 135, 144, 154, 153, 156, 163, 156, 151, 154, 146, 147, 154, 162, 155, 161, 160, 148, 141, 142, 140, 147, 155, 158, 153, 163, 155, 146, 143, 144, 137, 139, 141, 136, 129, 132, 122, 113, 117, 112, 109, 112, 116, 109, 106, 110, 98, 93, 97, 87, 88, 92, 97, 87, 94, 92, 81, 80, 84, 81, 88, 96, 98, 93, 107, 103, 97, 103, 106, 102, 108, 114, 116, 116, 132, 126, 127, 139, 138, 143, 152, 164, 163, 166, 176, 163, 166, 169, 164, 169, 179, 188, 182, 190, 187, 170, 168, 166, 159, 163, 167, 165, 155, 160, 147, 132, 131, 123, 115, 117, 118, 111, 104, 109, 93, 88, 92, 85, 88, 92, 98, 90, 89, 90, 76, 80, 81, 77, 85, 96, 102, 99, 108, 110, 104, 113, 117, 122, 134, 142, 144, 143, 152, 145, 141, 147, 141, 141, 143, 148, 143, 142, 148, 138, 143, 146, 144, 149, 157, 166, 163, 168, 168, 155, 155, 146, 139, 139, 144, 144, 139, 143, 135, 123, 121, 116, 115, 120, 125, 125, 125, 130, 119, 115, 116, 109, 107, 108, 111, 103, 101, 100, 88, 90, 89, 90, 95, 104, 112, 112, 119, 117, 109, 110, 104, 100, 102, 109, 109, 109, 112, 108, 106, 108, 110, 116, 125, 132, 135, 138, 141, 135, 136, 136, 135, 138, 144, 151, 152, 156, 156, 150, 151, 145, 145, 146, 147, 148, 148, 148, 145, 141, 141, 139, 140, 144, 145, 145, 142, 135, 129, 123, 118, 120, 123, 130, 131, 135, 133, 133, 127, 126, 122, 121, 119, 119, 119, 119, 116, 114, 111, 113, 111, 117, 119, 123, 123, 123, 120, 117, 115, 116, 120, 127, 135, 140, 144, 141, 136, 132, 130, 128, 133, 140, 148, 148, 150, 146, 142, 138, 139, 135, 139, 139, 141, 144, 148, 146, 144, 144, 142, 136, 137, 136, 136, 139, 142, 138, 139, 139, 133, 131, 131, 129, 124, 125, 115, 107, 104, 104, 98, 106, 114, 115, 114, 117, 105, 101, 101, 102, 99, 110, 110, 109, 113, 112, 102, 102, 106, 102, 104, 111, 108, 106, 111, 102, 98, 101, 104, 101, 112, 121, 125, 131, 138, 128, 128, 128, 124, 119, 131, 133, 135, 142, 140, 135, 141, 146, 144, 146, 152, 143, 142, 143, 134, 135, 140, 144, 142, 149, 148, 142, 146, 143, 136, 141, 144, 142, 138, 141, 130, 124, 124, 115, 114, 120, 124, 124, 127, 133, 126, 128, 121, 110, 110, 111, 116, 120, 131, 134, 133, 139, 128, 123, 120, 118, 118, 122, 130, 128, 136, 135, 130, 130, 133, 136, 138, 146, 146, 143, 147, 137, 134, 133, 136, 139, 143, 152, 151, 157, 155, 144, 143, 141, 142, 143, 147, 147, 139, 142, 128, 124, 123, 123, 123, 128, 134, 130, 135, 136, 126, 126, 122, 121, 120, 126, 126, 122, 130, 119, 114, 111, 104, 100, 100, 108, 108, 119, 129, 123, 125, 120, 114, 109, 115, 115, 113, 124, 121, 116, 118, 115, 110, 108, 115, 111, 116, 127, 122, 131, 136, 137, 137, 141, 138, 130, 131, 128, 120, 127, 126, 124, 123, 126, 120, 120, 128, 124, 126, 133, 133, 132, 139, 142, 136, 139, 137, 124, 123, 119, 114, 109, 114, 111, 110, 118, 117, 113, 121, 121, 120, 124, 129, 125, 129, 130, 123, 121, 124, 119, 115, 119, 115, 112, 116, 121, 118, 125, 128, 128, 128, 136, 131, 136, 141, 139, 135, 139, 133, 128, 127, 125, 122, 125, 129, 128, 129, 136, 134, 135, 140, 137, 136, 141, 141, 136, 139, 140, 133, 133, 133, 125, 127, 130, 133, 132, 138, 137, 135, 137, 137, 133, 140, 141, 136, 133, 136, 128, 125, 126, 120, 121, 124, 124, 123, 126, 130, 126, 129, 131, 125, 128, 130, 127, 123, 123, 122, 116, 118, 117, 110, 117, 118, 122, 122, 127, 126, 125, 127, 126, 126, 133, 132, 131, 128, 129, 122, 121, 122, 117, 123, 129, 130, 132, 137, 138, 137, 139, 140, 134, 141, 139, 137, 136, 136, 134, 131, 133, 128, 123, 129, 127, 130, 132, 135, 133, 132, 132, 126, 129, 133, 130, 130, 130, 127, 121, 121, 118, 113, 118, 119, 119, 123, 126, 124, 123, 125, 123, 118, 127, 125, 126, 129, 129, 127, 123, 124, 117, 115, 119, 116, 120, 124, 125, 126, 127, 129, 126, 130, 135, 132, 136, 136, 133, 130, 129, 124, 122, 127, 128, 127, 134, 133, 132, 131, 133, 130, 127, 134, 131, 132, 135, 131, 129, 126, 126, 118, 119, 123, 118, 124, 127, 126, 127, 128, 129, 125, 130, 132, 126, 131, 128, 124, 123, 123, 119, 120, 124, 123, 122, 129, 125, 125, 127, 129, 124, 125, 130, 126, 128, 131, 126, 125, 124, 124, 118, 122, 124, 121, 127, 129, 124, 126, 126, 125, 123, 129, 131, 127, 133, 129, 125, 125, 125, 121, 122, 126, 125, 127, 134, 129, 131, 133, 132, 127, 128, 130, 125, 129, 131, 126, 127, 128, 124, 120, 124, 123, 122, 130, 129, 126, 128, 129, 125, 124, 130, 128, 125, 130, 124, 122, 123, 123, 118, 121, 122, 118, 121, 126, 121, 125, 128, 129, 125, 129, 129, 127, 131, 131, 127, 128, 129, 125, 124, 129, 126, 128, 135, 133, 132, 135, 136, 132, 135, 139, 136, 137, 140, 134, 132, 133, 130, 127, 131, 131, 128, 131, 133, 127, 129, 132, 129, 127, 131, 128, 126, 129, 129, 124, 126, 128, 121, 123, 125, 121, 123, 128, 126, 122, 127, 127, 122, 127, 127, 124, 124, 126, 121, 121, 125, 122, 122, 128, 125, 124, 128, 129, 125, 128, 131, 128, 127, 130, 127, 128, 132, 133, 128, 132, 131, 127, 130, 130, 128, 130, 133, 132, 129, 133, 130, 129, 133, 132, 131, 131, 132, 127, 126, 129, 125, 126, 130, 127, 126, 129, 130, 125, 126, 129, 125, 126, 127, 124, 125, 127, 128, 124, 126, 126, 121, 124, 124, 122, 123, 127, 125, 121, 126, 122, 122, 127, 125, 124, 125, 126, 122, 122, 125, 120, 123, 126, 122, 122, 126, 127, 123, 126, 128, 124, 127, 127, 126, 128, 131, 132, 126, 131, 128, 126, 130, 128, 127, 129, 132, 130, 128, 133, 127, 130, 133, 130, 131, 133, 135, 129, 130, 131, 125, 130, 131, 125, 127, 130, 131, 126, 129, 129, 126, 130, 127, 126, 128, 131, 129, 125, 129, 125, 126, 127, 125, 125, 127, 128, 124, 124, 126, 122, 127, 126, 125, 126, 129, 129, 126, 129, 127, 127, 129, 128, 126, 128, 129, 127, 124, 126, 126, 129, 128, 127, 128, 130, 132, 128, 127, 127, 128, 130, 127, 128, 127, 131, 130, 127, 129, 127, 128, 129, 128, 129, 130, 133, 130, 129, 129, 128, 129, 127, 127, 126, 128, 129, 127, 125, 125, 128, 128, 126, 127, 126, 128, 129, 126, 125, 125, 128, 126, 125, 128, 127, 129, 128, 126, 125, 125, 127, 124, 125, 127, 127, 129, 127, 126, 124, 127, 127, 125, 127, 126, 127, 129, 128, 124, 126, 130, 127, 126, 127, 127, 128, 131, 126, 123, 126, 128, 124, 125, 127, 125, 130, 129, 125, 124, 129, 127, 125, 127, 127, 126, 129, 127, 125, 124, 128, 124, 124, 126, 125, 124, 129, 125, 122, 126, 128, 124, 124, 126, 123, 127, 130, 124, 123, 127, 126, 122, 125, 125, 123, 129, 127, 124, 125, 128, 125, 125, 128, 126, 126, 130, 127, 125, 128, 129, 126, 128, 128, 126, 128, 131, 126, 126, 131, 129, 127, 128, 128, 126, 130, 132, 127, 128, 132, 129, 127, 129, 127, 126, 130, 129, 125, 127, 129, 125, 126, 127, 125, 127, 131, 128, 127, 131, 130, 128, 130, 127, 127, 128, 130, 124, 126, 130, 125, 127, 128, 123, 108, 136, 144, 108, 140, 126, 123, 121, 125, 132, 123, 135, 139, 128, 147, 130, 124, 136, 126, 119, 127, 127, 128, 131, 142, 115, 141, 115, 116, 115, 117, 119, 127, 140, 115, 127, 136, 126, 131, 130, 138, 134, 130, 129, 148, 123, 112, 134, 119, 140, 132, 144, 146, 141, 139, 104, 121, 124, 130, 116, 145, 118, 121, 110, 140, 128, 117, 136, 121, 119, 137, 110, 124, 138, 125, 121, 129, 136, 118, 122, 121, 122, 142, 127, 127, 125, 131, 119, 136, 142, 122, 128, 131, 132, 130, 126, 125, 130, 128, 133, 124, 137, 130, 128, 128, 136, 120, 124, 119, 128, 126, 151, 125, 134, 131, 121, 119, 118, 119, 121, 116, 135, 117, 123, 126, 131, 125, 127, 129, 132, 132, 128, 120, 122, 127, 124, 108, 129, 126, 119, 137, 138, 121, 134, 132, 126, 124, 133, 131, 126, 134, 130, 117, 132, 130, 115, 125, 132, 134, 131, 139, 128, 132, 120, 124, 124, 123, 125, 121, 134, 125, 120, 126, 129, 130, 131, 133, 134, 140, 131, 136, 129, 130, 124, 135, 117, 125, 135, 131, 142, 126, 132, 125, 123, 113, 116, 122, 127, 124, 133, 127, 121, 128, 120, 122, 126, 123, 133, 125, 123, 137, 130, 124, 129, 120, 134, 128, 129, 134, 136, 127, 135, 127, 125, 134, 132, 124, 127, 131, 121, 129, 134, 114, 126, 126, 127, 112, 138, 130, 120, 127, 132, 131, 132, 124, 133, 128, 132, 126, 127, 130, 126, 135, 127, 136, 134, 128, 130, 130, 140, 120, 120, 130, 135, 124, 124, 130, 126, 130, 112, 125, 123, 129, 131, 119, 133, 134, 129, 132, 111, 129, 128, 123, 119, 133, 140, 131, 126, 135, 130, 115, 137, 127, 125, 122, 130, 132, 124, 129, 129, 124, 129, 131, 116, 141, 129, 125, 124, 119, 125, 125, 121, 124, 122, 130, 128, 126, 126, 131, 122, 132, 125, 126, 132, 135, 121, 129, 129, 129, 125, 127, 133, 128, 130, 127, 134, 132, 118, 130, 133, 128, 116, 124, 132, 137, 113, 123, 125, 115, 125, 123, 119, 123, 130, 134, 125, 133, 123, 126, 120, 128, 126, 139, 127, 131, 136, 122, 130, 128, 133, 139, 124, 135, 129, 122, 131, 125, 126, 126, 124, 120, 132, 128, 138, 119, 128, 120, 125, 128, 119, 122, 126, 129, 126, 125, 128, 139, 119, 130, 131, 122, 133, 131, 125, 125, 128, 125, 129, 129, 126, 127, 130, 126, 129, 128, 121, 129, 127, 132, 128, 122, 142, 127, 129, 120, 127, 116, 132, 122, 127, 126, 132, 125, 126, 128, 134, 130, 124, 124, 129, 130, 129, 122, 131, 125, 123, 127, 133, 128, 126, 129, 126, 129, 126, 123, 130, 127, 122, 129, 131, 132, 129, 125, 130, 126, 124, 125, 129, 129, 132, 123, 131, 122, 128, 127, 128, 134, 131, 126, 130, 130, 121, 129, 122, 126, 127, 132, 131, 128, 138, 123, 128, 128, 120, 129, 129, 126, 124, 125, 131, 131, 124, 134, 124, 129, 125, 122, 128, 135, 126, 124, 124, 125, 127, 129, 130, 130, 132, 130, 123, 127, 129, 126, 126, 129, 124, 124, 131, 129, 128, 130, 128, 124, 129, 130, 124, 129, 127, 125, 123, 130, 125, 127, 129, 126, 122, 126, 133, 124, 128, 125, 126, 125, 129, 129, 128, 134, 128, 127, 123, 122, 124, 127, 128, 121, 122, 136, 123, 132, 128, 130, 124, 128, 125, 126, 128, 128, 121, 128, 124, 125, 123, 132, 128, 125, 130, 126, 122, 132, 120, 125, 134, 129, 123, 134, 128, 133, 130, 129, 126, 125, 125, 126, 126, 127, 124, 132, 130, 126, 131, 129, 130, 131, 127, 127, 128, 128, 130, 122, 125, 125, 125, 128, 127, 126, 128, 128, 124, 127, 122, 129, 128, 125, 132, 128, 124, 131, 127, 126, 128, 124, 122, 123, 128, 126, 126, 130, 128, 129, 128, 131, 126, 130, 128, 130, 129, 124, 124, 129, 123, 128, 125, 126, 132, 128, 132, 125, 126, 126, 129, 125, 126, 131, 130, 130, 128, 124, 125, 129, 128, 127, 128, 128, 127, 129, 126, 127, 132, 130, 128, 124, 130, 123, 130, 128, 125, 127, 128, 129, 123, 126, 129, 127, 128, 127, 122, 125, 126, 130, 123, 129, 130, 124, 130, 128, 124, 126, 128, 130, 124, 126, 130, 128, 134, 130, 126, 130, 130, 128, 123, 134, 125, 125, 130, 128, 125, 131, 129, 127, 126, 130, 122, 130, 126, 128, 125, 125, 129, 124, 129, 130, 127, 131, 128, 127, 127, 127, 122, 125, 129, 126, 129, 130, 127, 132, 128, 132, 125, 130, 125, 129, 124, 124, 128, 123, 125, 125, 126, 125, 129, 129, 128, 127, 126, 127, 128, 122, 125, 129, 125, 127, 130, 132, 131, 131, 133, 127, 126, 123, 123, 129, 129, 129, 125, 130, 126, 122, 128, 131, 127, 125, 130, 124, 131, 124, 128, 125, 130, 124, 126, 129, 128, 122, 130, 121, 124, 123, 132, 125, 128, 134, 129, 129, 131, 128, 127, 125, 127, 124, 126, 132, 130, 132, 129, 124, 120, 122, 127, 120, 124, 126, 130, 128, 134, 129, 136, 132, 131, 124, 136, 124, 125, 123, 124, 122, 124, 133, 122, 131, 131, 131, 126, 133, 124, 128, 127, 128, 124, 136, 128, 131, 136, 130, 122, 122, 127, 121, 116, 119, 125, 122, 133, 131, 134, 138, 137, 133, 130, 137, 124, 125, 120, 124, 118, 124, 121, 128, 128, 128, 124, 135, 133, 129, 126, 133, 131, 123, 134, 129, 134, 132, 130, 120, 124, 124, 121, 119, 121, 122, 126, 132, 128, 139, 134, 136, 129, 133, 131, 130, 121, 127, 117, 121, 124, 124, 128, 124, 126, 126, 128, 132, 127, 127, 133, 128, 130, 129, 136, 131, 131, 127, 119, 122, 124, 118, 117, 122, 119, 132, 127, 132, 135, 139, 131, 130, 132, 129, 128, 124, 125, 117, 120, 124, 127, 124, 129, 126, 129, 129, 130, 122, 132, 127, 127, 131, 130, 133, 132, 131, 125, 122, 124, 125, 117, 122, 120, 126, 126, 131, 132, 129, 137, 129, 133, 130, 130, 127, 128, 121, 122, 122, 126, 126, 126, 128, 125, 127, 131, 124, 127, 128, 126, 131, 132, 134, 132, 132, 127, 123, 122, 124, 120, 122, 123, 125, 126, 127, 133, 130, 136, 128, 130, 128, 129, 123, 128, 124, 125, 121, 126, 128, 128, 129, 127, 130, 128, 127, 121, 128, 123, 127, 130, 130, 135, 131, 131, 128, 124, 127, 121, 123, 122, 124, 130, 127, 130, 130, 135, 128, 127, 132, 129, 128, 125, 125, 122, 128, 124, 129, 130, 132, 126, 128, 129, 129, 124, 127, 124, 126, 128, 128, 134, 132, 134, 129, 126, 127, 121, 123, 125, 122, 127, 125, 128, 133, 134, 131, 126, 128, 129, 127, 126, 126, 125, 125, 125, 122, 131, 131, 129, 127, 128, 128, 124, 125, 128, 125, 129, 127, 131, 132, 133, 126, 129, 128, 125, 121, 123, 126, 124, 127, 126, 129, 134, 134, 127, 129, 128, 132, 126, 127, 125, 124, 130, 122, 124, 130, 130, 129, 127, 127, 128, 124, 129, 126, 126, 129, 125, 134, 132, 130, 125, 128, 128, 125, 121, 128, 124, 124, 129, 125, 131, 129, 127, 127, 128, 129, 130, 125, 129, 122, 127, 129, 124, 130, 129, 129, 126, 129, 128, 126, 124, 128, 125, 129, 126, 129, 132, 130, 128, 125, 128, 128, 125, 124, 128, 125, 129, 127, 129, 129, 128, 127, 126, 130, 128, 128, 125, 128, 124, 127, 125, 128, 128, 130, 128, 129, 127, 128, 124, 125, 128, 123, 130, 125, 133, 130, 128, 127, 126, 128, 127, 122, 125, 126, 125, 131, 125, 131, 129, 130, 125, 126, 128, 127, 127, 127, 125, 126, 127, 124, 129, 129, 129, 129, 129, 127, 128, 121, 129, 124, 125, 128, 125, 133, 128, 128, 127, 128, 129, 126, 124, 127, 124, 129, 128, 127, 130, 128, 130, 123, 127, 127, 126, 127, 128, 124, 128, 127, 127, 128, 128, 129, 128, 131, 127, 126, 123, 128, 122, 129, 126, 126, 131, 129, 129, 125, 129, 129, 125, 125, 126, 124, 131, 126, 130, 129, 128, 128, 124, 130, 126, 125, 127, 125, 126, 130, 126, 128, 127, 130, 127, 128, 129, 127, 126, 125, 127, 123, 129, 124, 128, 131, 130, 127, 129, 129, 127, 124, 126, 126, 124, 130, 124, 129, 128, 129, 127, 126, 129, 125, 127, 128, 126, 129, 131, 126, 128, 128, 129, 124, 130, 127, 127, 125, 126, 125, 126, 129, 125, 128, 132, 130, 128, 131, 128, 127, 124, 127, 122, 126, 128, 125, 131, 129, 127, 124, 127, 127, 126, 127, 131, 126, 131, 129, 127, 130, 128, 126, 125, 129, 126, 125, 126, 127, 123, 127, 128, 126, 130, 131, 129, 130, 130, 129, 127, 126, 127, 122, 128, 125, 128, 130, 129, 125, 124, 126, 127, 126, 129, 130, 127, 132, 127, 130, 130, 128, 125, 126, 128, 126, 125, 126, 125, 124, 128, 126, 129, 131, 130, 127, 129, 130, 128, 127, 127, 126, 125, 128, 124, 129, 128, 127, 125, 126, 127, 126, 124, 129, 127, 130, 131, 128, 131, 129, 128, 123, 127, 126, 126, 125, 127, 124, 125, 128, 126, 130, 129, 130, 126, 131, 128, 128, 126, 128, 123, 127, 127, 125, 129, 128, 128, 125, 128, 127, 127, 126, 127, 124, 132, 129, 129, 130, 130, 126, 123, 127, 125, 128, 127, 128, 124, 128, 126, 127, 128, 127, 127, 129, 131, 128, 127, 127, 127, 123, 129, 125, 129, 129, 129, 126, 126, 127, 128, 126, 128, 126, 127, 132, 127, 131, 129, 130, 125, 126, 126, 126, 126, 128, 126, 125, 128, 126, 130, 128, 128, 127, 132, 129, 128, 126, 128, 125, 125, 128, 123, 130, 129, 128, 126, 126, 126, 127, 126, 129, 125, 130, 131, 127, 132, 128, 129, 124, 127, 125, 125, 127, 127, 124, 128, 127, 127, 131, 128, 126, 127, 130, 128, 128, 126, 129, 124, 130, 125, 126, 130, 129, 127, 126, 126, 126, 126, 126, 127, 124, 133, 128, 130, 131, 129, 127, 126, 127, 125, 126, 128, 127, 125, 129, 126, 129, 129, 127, 125, 127, 128, 127, 127, 128, 128, 125, 130, 125, 128, 130, 128, 125, 127, 126, 126, 125, 128, 124, 126, 132, 127, 130, 129, 128, 125, 127, 125, 126, 127, 129, 126, 129, 129, 126, 128, 128, 126, 125, 129, 126, 127, 126, 129, 125, 128, 129, 126, 130, 130, 127, 126, 126, 124, 126, 126, 128, 125, 130, 130, 129, 130, 129, 127, 126, 126, 125, 126, 127, 127, 126, 129, 127, 127, 129, 129, 126, 127, 128, 128, 128, 126, 128, 125, 129, 127, 127, 129, 129, 127, 127, 125, 125, 126, 127, 127, 125, 131, 128, 131, 130, 130, 127, 126, 125, 125, 126, 127, 126, 127, 129, 126, 129, 129, 128, 125, 127, 126, 129, 127, 127, 126, 127, 129, 127, 129, 129, 129, 126, 126, 125, 126, 126, 126, 125, 128, 130, 129, 131, 129, 129, 126, 126, 125, 128, 126, 128, 126, 129, 127, 128, 129, 128, 127, 125, 126, 127, 127, 125, 128, 127, 130, 129, 129, 130, 130, 128, 126, 125, 125, 126, 125, 126, 125, 129, 129, 130, 130, 129, 129, 127, 126, 127, 127, 126, 128, 126, 130, 126, 128, 128, 127, 126, 125, 126, 128, 126, 126, 127, 128, 130, 128, 131, 130, 130, 126, 125, 124, 126, 124, 124, 125, 126, 129, 129, 131, 129, 129, 129, 126, 125, 127, 126, 127, 128, 127, 129, 127, 129, 127, 127, 125, 124, 126, 128, 125, 127, 128, 129, 128, 128, 130, 129, 130, 127, 126, 125, 127, 123, 125, 125, 128, 128, 130, 130, 129, 129, 128, 125, 124, 127, 125, 128, 127, 130, 128, 128, 129, 127, 127, 126, 124, 127, 127, 126, 127, 127, 130, 126, 129, 129, 129, 129, 126, 126, 126, 127, 124, 125, 127, 128, 128, 131, 129, 129, 128, 128, 124, 126, 126, 125, 128, 127, 129, 127, 130, 128, 127, 127, 126, 125, 129, 126, 127, 126, 129, 129, 126, 130, 128, 129, 128, 126, 125, 127, 125, 125, 125, 128, 127, 128, 131, 130, 130, 128, 127, 124, 127, 126, 127, 127, 128, 128, 127, 130, 128, 127, 127, 125, 125, 128, 126, 128, 126, 130, 127, 127, 130, 128, 129, 127, 126, 126, 127, 126, 125, 125, 129, 126, 129, 130, 130, 128, 128, 126, 124, 127, 126, 127, 127, 130, 127, 129, 130, 128, 126, 127, 125, 127, 127, 127, 127, 126, 131, 126, 128, 130, 128, 128, 127, 127, 127, 127, 127, 124, 126, 130, 126, 130, 130, 129, 127, 127, 125, 125, 127, 127, 126, 128, 130, 126, 130, 130, 128, 126, 127, 125, 128, 127, 128, 125, 128, 129, 125, 129, 129, 128, 127, 127, 127, 127, 127, 127, 124, 129, 128, 127, 130, 130, 128, 126, 126, 125, 126, 126, 127, 125, 129, 129, 127, 130, 130, 127, 126, 126, 125, 127, 126, 127, 124, 130, 127, 127, 129, 129, 127, 127, 127, 127, 126, 127, 126, 124, 130, 127, 128, 130, 130, 127, 127, 126, 126, 125, 127, 126, 126, 130, 127, 129, 130, 129, 127, 126, 126, 126, 126, 128, 126, 127, 130, 127, 128, 129, 129, 127, 127, 127, 127, 126, 127, 125, 127, 130, 126, 128, 129, 129, 126, 127, 126, 126, 125, 128, 125, 128, 129, 127, 129, 130, 128, 127, 127, 126, 127, 125, 127, 124, 127, 128, 126, 129, 129, 128, 127, 127, 127, 127, 126, 128, 124, 129, 128, 127, 128, 128, 128, 126, 126, 126, 126, 126, 127, 126, 129, 128, 129, 130, 130, 128, 127, 126, 126, 126, 125, 127, 124, 129, 127, 127, 129, 129, 127, 127, 127, 128, 127, 127, 127, 125, 130, 126, 128, 128, 129, 126, 126, 126, 126, 125, 128, 125, 128, 128, 128, 129, 129, 130, 126, 128, 125, 125, 123, 123, 130, 131, 141, 144, 149, 146, 149, 148, 142, 136, 135, 125, 122, 109, 102, 94, 84, 80, 80, 81, 85, 84, 86, 82, 88, 87, 95, 108, 113, 126, 133, 143, 143, 147, 160, 163, 171, 175, 180, 184, 186, 182, 181, 184, 185, 185, 181, 176, 168, 159, 149, 141, 133, 131, 120, 118, 111, 101, 98, 90, 86, 83, 80, 81, 78, 77, 83, 84, 91, 91, 99, 99, 104, 101, 101, 103, 104, 107, 111, 112, 112, 115, 117, 121, 119, 127, 134, 143, 143, 149, 150, 154, 158, 162, 167, 166, 170, 171, 167, 163, 160, 159, 158, 156, 149, 144, 135, 131, 119, 117, 109, 104, 99, 95, 86, 82, 80, 83, 84, 90, 94, 92, 93, 92, 90, 90, 93, 97, 97, 102, 103, 105, 110, 120, 126, 139, 145, 150, 150, 154, 151, 148, 149, 153, 155, 157, 159, 159, 163, 165, 166, 167, 173, 172, 172, 172, 173, 169, 170, 173, 174, 173, 172, 174, 175, 175, 174, 173, 173, 172, 162, 157, 150, 143, 140, 134, 132, 124, 119, 112, 108, 105, 108, 107, 114, 112, 108, 100, 94, 89, 86, 83, 82, 80, 78, 73, 66, 69, 71, 76, 80, 83, 83, 78, 75, 71, 70, 72, 79, 80, 85, 85, 89, 93, 103, 108, 121, 128, 135, 132, 132, 131, 130, 132, 134, 138, 139, 138, 138, 137, 136, 140, 146, 152, 156, 154, 153, 152, 149, 144, 145, 145, 148, 144, 139, 133, 134, 131, 133, 137, 139, 141, 136, 132, 126, 120, 117, 119, 118, 119, 116, 113, 111, 116, 116, 121, 127, 132, 131, 131, 126, 124, 125, 126, 131, 137, 138, 143, 141, 145, 148, 150, 156, 161, 161, 163, 158, 158, 154, 157, 155, 159, 159, 160, 155, 157, 151, 153, 155, 155, 155, 152, 148, 145, 139, 136, 132, 130, 129, 126, 121, 121, 116, 120, 120, 124, 121, 120, 116, 113, 107, 107, 100, 104, 102, 98, 97, 94, 96, 98, 99, 104, 103, 101, 98, 92, 90, 90, 87, 90, 93, 93, 91, 92, 94, 97, 101, 107, 106, 111, 110, 108, 111, 113, 118, 122, 127, 133, 132, 135, 140, 143, 152, 157, 162, 167, 169, 168, 164, 165, 168, 168, 174, 173, 168, 168, 164, 161, 162, 163, 164, 164, 160, 153, 142, 134, 129, 123, 123, 119, 114, 109, 104, 98, 95, 95, 97, 96, 99, 93, 89, 87, 83, 84, 88, 93, 97, 96, 97, 97, 98, 102, 105, 110, 116, 117, 117, 115, 119, 120, 125, 131, 137, 139, 143, 140, 144, 148, 150, 157, 162, 164, 164, 160, 160, 159, 159, 162, 164, 164, 165, 160, 160, 159, 161, 160, 159, 158, 153, 146, 141, 133, 133, 131, 130, 129, 126, 123, 122, 119, 121, 121, 120, 120, 117, 112, 109, 105, 107, 107, 108, 109, 107, 106, 105, 104, 106, 106, 111, 111, 110, 110, 106, 107, 108, 107, 114, 116, 116, 114, 112, 114, 116, 120, 123, 125, 126, 126, 122, 122, 124, 127, 130, 134, 136, 133, 132, 133, 134, 139, 142, 143, 146, 144, 138, 134, 134, 138, 137, 142, 141, 138, 135, 132, 130, 135, 136, 140, 137, 136, 133, 125, 124, 125, 124, 130, 130, 127, 125, 121, 118, 117, 120, 122, 120, 122, 117, 114, 109, 108, 110, 115, 118, 118, 114, 113, 112, 111, 116, 120, 123, 128, 127, 125, 125, 124, 126, 126, 134, 136, 136, 138, 136, 136, 138, 142, 147, 150, 153, 152, 144, 146, 143, 140, 145, 149, 147, 146, 140, 140, 140, 141, 139, 139, 142, 139, 134, 131, 129, 127, 127, 128, 128, 126, 125, 122, 118, 119, 119, 118, 121, 119, 114, 113, 111, 111, 111, 112, 110, 109, 109, 104, 104, 107, 108, 109, 110, 111, 111, 109, 112, 110, 110, 114, 114, 112, 113, 112, 113, 115, 117, 121, 123, 125, 121, 120, 122, 123, 127, 130, 132, 130, 129, 130, 131, 134, 139, 142, 145, 147, 143, 140, 143, 142, 146, 146, 148, 150, 146, 142, 136, 139, 142, 143, 145, 144, 141, 136, 131, 133, 131, 133, 137, 134, 131, 125, 119, 117, 120, 119, 121, 122, 123, 119, 116, 112, 113, 117, 118, 120, 117, 117, 114, 112, 112, 118, 121, 126, 128, 125, 124, 124, 124, 127, 131, 133, 138, 136, 136, 133, 135, 133, 137, 142, 143, 144, 144, 143, 144, 140, 142, 147, 146, 145, 141, 138, 137, 134, 133, 135, 136, 133, 133, 129, 129, 129, 129, 129, 130, 128, 128, 125, 122, 119, 121, 119, 120, 121, 120, 118, 115, 113, 112, 111, 113, 117, 117, 118, 117, 117, 119, 118, 119, 117, 119, 117, 116, 114, 115, 113, 115, 114, 117, 119, 123, 125, 129, 131, 129, 135, 130, 131, 129, 123, 130, 117, 118, 145, 127, 109, 140, 117, 141, 124, 144, 132, 139, 139, 146, 133, 156, 126, 140, 138, 132, 125, 129, 122, 122, 129, 115, 126, 129, 124, 112, 123, 121, 122, 140, 134, 120, 133, 123, 123, 126, 127, 131, 134, 110, 124, 133, 104, 113, 130, 122, 148, 127, 154, 140, 149, 125, 122, 122, 143, 111, 130, 133, 117, 113, 107, 125, 117, 113, 140, 117, 142, 122, 124, 139, 157, 126, 146, 145, 156, 112, 132, 107, 134, 123, 137, 123, 136, 138, 135, 151, 150, 129, 153, 143, 152, 138, 130, 124, 135, 129, 118, 126, 131, 111, 117, 127, 119, 117, 131, 126, 124, 145, 136, 120, 134, 132, 117, 121, 115, 115, 109, 113, 108, 110, 108, 122, 113, 117, 119, 133, 125, 130, 126, 121, 120, 132, 112, 117, 130, 120, 113, 136, 117, 120, 136, 129, 126, 142, 127, 130, 130, 136, 121, 128, 139, 137, 127, 138, 130, 131, 123, 133, 120, 124, 128, 127, 128, 131, 120, 130, 141, 123, 142, 137, 142, 131, 130, 128, 131, 124, 127, 134, 124, 132, 128, 128, 112, 139, 131, 141, 138, 123, 124, 125, 115, 105, 122, 116, 119, 115, 119, 112, 115, 122, 119, 126, 126, 128, 128, 125, 118, 139, 121, 136, 132, 122, 135, 129, 119, 125, 138, 128, 149, 130, 139, 142, 129, 125, 136, 136, 131, 145, 134, 116, 132, 130, 111, 111, 144, 127, 124, 128, 134, 131, 125, 121, 138, 139, 134, 131, 140, 133, 130, 126, 123, 132, 129, 125, 128, 129, 136, 119, 130, 131, 136, 119, 129, 123, 131, 126, 116, 126, 128, 124, 120, 123, 124, 119, 132, 113, 116, 133, 122, 115, 130, 130, 130, 126, 130, 133, 124, 125, 134, 126, 121, 114, 131, 128, 118, 134, 123, 129, 135, 131, 122, 138, 121, 132, 119, 133, 129, 128, 134, 124, 119, 131, 130, 125, 135, 127, 124, 127, 122, 128, 128, 130, 130, 140, 137, 134, 133, 124, 128, 127, 114, 124, 133, 123, 124, 129, 121, 124, 118, 132, 137, 139, 115, 130, 119, 116, 128, 121, 125, 127, 122, 129, 122, 127, 121, 130, 118, 137, 134, 135, 126, 140, 131, 133, 136, 135, 143, 137, 128, 126, 124, 126, 133, 133, 130, 132, 129, 135, 131, 129, 137, 123, 132, 123, 136, 121, 116, 122, 117, 123, 130, 121, 134, 129, 113, 122, 124, 121, 130, 125, 123, 127, 132, 115, 127, 118, 129, 121, 120, 121, 129, 118, 119, 125, 121, 129, 125, 132, 130, 126, 131, 123, 123, 125, 128, 122, 131, 121, 132, 126, 127, 130, 133, 129, 122, 133, 137, 129, 129, 129, 139, 127, 129, 137, 138, 128, 130, 117, 133, 130, 127, 126, 132, 133, 129, 132, 134, 131, 131, 124, 136, 127, 125, 129, 129, 124, 120, 123, 126, 128, 134, 130, 127, 131, 124, 123, 124, 127, 125, 131, 119, 125, 123, 131, 126, 123, 131, 123, 127, 124, 115, 130, 121, 127, 122, 127, 135, 126, 128, 129, 121, 131, 122, 126, 132, 129, 125, 129, 126, 130, 129, 130, 135, 135, 129, 126, 126, 131, 132, 132, 132, 134, 127, 131, 127, 132, 128, 133, 126, 129, 129, 129, 126, 126, 124, 126, 126, 134, 129, 131, 123, 128, 117, 124, 128, 122, 127, 126, 125, 122, 124, 125, 128, 128, 128, 123, 126, 128, 124, 126, 126, 120, 125, 128, 125, 128, 131, 126, 122, 119, 127, 122, 126, 125, 126, 125, 128, 123, 130, 132, 129, 126, 128, 122, 126, 126, 120, 133, 129, 126, 129, 132, 129, 134, 127, 131, 127, 129, 130, 135, 127, 127, 123, 127, 127, 126, 129, 133, 133, 130, 123, 124, 127, 128, 125, 125, 130, 131, 125, 131, 123, 122, 128, 124, 129, 130, 122, 129, 123, 124, 127, 125, 127, 134, 130, 131, 126, 121, 127, 121, 130, 126, 128, 128, 130, 124, 126, 127, 126, 129, 132, 130, 128, 125, 130, 125, 125, 131, 125, 130, 131, 126, 129, 126, 130, 126, 134, 124, 136, 128, 130, 127, 125, 126, 132, 128, 132, 131, 127, 126, 124, 127, 126, 130, 129, 127, 126, 127, 123, 124, 128, 123, 129, 130, 129, 125, 127, 123, 130, 122, 127, 125, 127, 125, 125, 124, 122, 130, 125, 125, 128, 129, 127, 127, 128, 130, 124, 127, 131, 129, 132, 128, 128, 127, 128, 122, 128, 131, 126, 124, 129, 125, 128, 132, 128, 130, 129, 128, 126, 129, 124, 131, 125, 125, 127, 127, 130, 128, 127, 130, 126, 130, 128, 126, 130, 126, 128, 127, 127, 124, 128, 128, 129, 130, 125, 126, 123, 126, 120, 127, 129, 130, 128, 127, 129, 125, 126, 123, 125, 124, 123, 126, 124, 123, 127, 126, 129, 127, 131, 131, 132, 127, 131, 128, 124, 125, 127, 129, 128, 125, 130, 125, 127, 124, 131, 130, 127, 126, 129, 127, 129, 126, 129, 132, 127, 129, 125, 127, 128, 127, 129, 128, 126, 128, 125, 125, 126, 125, 125, 129, 132, 133, 132, 134, 126, 124, 123, 126, 125, 124, 123, 123, 127, 126, 129, 130, 131, 129, 131, 129, 128, 124, 126, 122, 123, 128, 123, 131, 129, 128, 128, 128, 124, 125, 117, 128, 129, 134, 131, 135, 131, 134, 125, 125, 125, 123, 117, 127, 125, 126, 124, 130, 126, 133, 126, 133, 131, 127, 127, 126, 125, 122, 124, 124, 131, 127, 131, 131, 134, 131, 130, 130, 124, 126, 121, 121, 127, 130, 127, 131, 128, 132, 132, 130, 127, 130, 122, 124, 125, 127, 120, 124, 125, 127, 128, 133, 134, 133, 127, 130, 127, 126, 121, 124, 123, 126, 127, 129, 125, 131, 125, 133, 132, 126, 128, 122, 123, 127, 126, 123, 127, 127, 127, 138, 132, 130, 129, 124, 120, 130, 120, 127, 128, 126, 126, 134, 130, 132, 130, 129, 130, 128, 120, 122, 122, 121, 125, 131, 127, 130, 131, 128, 137, 130, 129, 128, 124, 121, 126, 124, 128, 123, 127, 124, 132, 134, 128, 130, 125, 130, 124, 125, 126, 124, 122, 128, 128, 131, 125, 126, 128, 131, 136, 130, 130, 127, 120, 124, 125, 127, 123, 126, 125, 133, 129, 129, 128, 132, 128, 132, 129, 124, 123, 119, 126, 128, 127, 128, 133, 127, 131, 132, 128, 127, 126, 118, 124, 129, 128, 126, 130, 127, 133, 127, 128, 130, 128, 122, 130, 128, 126, 125, 126, 125, 128, 126, 127, 129, 126, 126, 134, 131, 129, 125, 123, 124, 130, 126, 127, 128, 127, 125, 128, 131, 131, 126, 127, 131, 130, 126, 123, 125, 125, 126, 124, 127, 127, 124, 128, 138, 136, 131, 127, 125, 123, 123, 125, 123, 128, 125, 130, 132, 131, 129, 128, 129, 130, 125, 124, 124, 126, 126, 127, 129, 131, 128, 124, 125, 132, 129, 124, 125, 126, 122, 129, 132, 130, 131, 126, 128, 131, 129, 124, 126, 125, 126, 125, 127, 125, 128, 127, 127, 133, 129, 125, 126, 125, 130, 129, 130, 127, 125, 122, 127, 131, 128, 126, 127, 129, 134, 129, 127, 124, 127, 123, 125, 127, 125, 124, 125, 129, 130, 128, 130, 130, 129, 129, 127, 129, 124, 122, 124, 127, 129, 126, 131, 131, 127, 128, 126, 128, 128, 122, 125, 126, 125, 128, 127, 131, 132, 132, 127, 129, 126, 119, 125, 126, 127, 126, 130, 128, 129, 131, 124, 131, 129, 124, 123, 128, 124, 127, 126, 128, 131, 131, 128, 129, 130, 128, 126, 127, 125, 125, 122, 130, 132, 132, 126, 128, 127, 128, 126, 127, 128, 128, 124, 128, 130, 126, 126, 125, 130, 129, 126, 127, 127, 131, 127, 131, 129, 126, 125, 122, 128, 130, 126, 127, 127, 125, 128, 129, 130, 128, 126, 124, 124, 128, 122, 126, 130, 128, 132, 129, 128, 128, 129, 125, 127, 125, 123, 122, 124, 123, 131, 130, 131, 131, 130, 125, 128, 128, 124, 124, 124, 124, 132, 127, 129, 128, 131, 128, 128, 128, 126, 126, 127, 126, 128, 126, 127, 126, 128, 131, 128, 131, 129, 122, 126, 127, 128, 128, 128, 127, 127, 131, 124, 127, 128, 126, 130, 131, 129, 126, 127, 128, 128, 130, 124, 125, 124, 122, 128, 130, 129, 131, 129, 130, 132, 129, 123, 124, 126, 123, 127, 127, 124, 129, 127, 131, 132, 131, 126, 127, 126, 125, 125, 126, 123, 125, 126, 131, 133, 133, 128, 127, 127, 127, 124, 124, 123, 126, 125, 129, 130, 130, 128, 126, 130, 131, 128, 127, 127, 128, 125, 127, 126, 125, 125, 123, 130, 132, 128, 130, 128, 126, 127, 128, 129, 126, 125, 123, 127, 129, 126, 130, 131, 128, 132, 131, 127, 125, 124, 123, 127, 127, 126, 125, 127, 127, 132, 130, 132, 129, 127, 125, 127, 126, 124, 123, 125, 125, 131, 130, 130, 130, 129, 126, 129, 128, 126, 124, 126, 126, 128, 126, 127, 128, 129, 129, 129, 130, 128, 124, 126, 127, 127, 126, 126, 127, 128, 128, 126, 130, 129, 126, 129, 128, 127, 127, 126, 128, 129, 127, 125, 126, 125, 126, 129, 130, 129, 129, 126, 127, 129, 126, 124, 125, 125, 125, 129, 127, 127, 130, 128, 129, 130, 127, 125, 127, 127, 126, 128, 130, 130, 141, 135, 142, 148, 146, 139, 144, 144, 136, 137, 130, 122, 117, 109, 102, 100, 92, 89, 86, 83, 83, 74, 78, 81, 88, 91, 98, 104, 110, 114, 123, 138, 138, 147, 157, 163, 171, 179, 185, 193, 193, 192, 191, 194, 195, 185, 183, 177, 170, 164, 151, 145, 140, 129, 123, 120, 111, 102, 93, 87, 84, 83, 82, 85, 85, 83, 83, 89, 90, 89, 93, 97, 102, 105, 103, 107, 107, 108, 110, 112, 111, 113, 114, 118, 122, 126, 128, 133, 136, 142, 148, 151, 155, 160, 162, 167, 169, 170, 166, 167, 163, 159, 155, 150, 144, 140, 133, 131, 124, 118, 111, 110, 106, 104, 99, 93, 92, 89, 87, 88, 85, 86, 83, 83, 85, 86, 88, 88, 93, 97, 99, 106, 109, 115, 122, 124, 130, 133, 135, 136, 142, 143, 146, 149, 149, 153, 156, 154, 159, 161, 161, 160, 163, 165, 169, 169, 172, 173, 176, 174, 179, 176, 175, 171, 170, 170, 166, 161, 158, 154, 153, 148, 147, 144, 141, 135, 135, 133, 133, 127, 125, 123, 123, 119, 119, 117, 115, 111, 108, 109, 106, 101, 100, 99, 98, 97, 94, 92, 90, 87, 84, 85, 83, 81, 80, 82, 86, 89, 90, 94, 97, 98, 101, 107, 109, 113, 116, 122, 128, 132, 134, 139, 142, 142, 142, 143, 141, 141, 140, 140, 140, 141, 139, 140, 139, 139, 138, 137, 135, 134, 131, 131, 131, 133, 130, 132, 131, 131, 127, 126, 125, 123, 120, 119, 116, 114, 113, 112, 111, 111, 109, 110, 111, 112, 112, 116, 116, 118, 117, 116, 116, 115, 115, 116, 121, 124, 127, 131, 134, 139, 142, 144, 147, 148, 147, 150, 153, 155, 155, 156, 155, 156, 156, 153, 156, 155, 151, 149, 148, 148, 147, 146, 148, 148, 150, 149, 151, 148, 146, 145, 142, 141, 139, 132, 131, 130, 128, 124, 124, 120, 117, 112, 110, 109, 107, 103, 102, 99, 98, 94, 94, 92, 92, 89, 89, 89, 87, 85, 87, 89, 93, 94, 94, 94, 96, 95, 96, 100, 103, 106, 110, 113, 118, 121, 122, 128, 131, 135, 140, 147, 153, 157, 161, 164, 168, 169, 170, 173, 175, 177, 179, 179, 181, 183, 182, 181, 182, 180, 176, 174, 169, 163, 156, 150, 145, 139, 133, 127, 122, 118, 112, 110, 107, 103, 98, 96, 94, 91, 88, 88, 86, 84, 82, 81, 80, 78, 77, 79, 83, 88, 90, 96, 101, 109, 113, 119, 125, 128, 130, 132, 135, 138, 137, 138, 139, 141, 142, 142, 145, 146, 144, 143, 145, 146, 146, 147, 150, 154, 157, 157, 161, 160, 160, 159, 158, 157, 152, 147, 143, 140, 138, 135, 134, 132, 130, 126, 124, 124, 121, 118, 117, 118, 119, 117, 117, 116, 114, 112, 109, 107, 104, 100, 98, 97, 98, 97, 99, 102, 103, 105, 107, 110, 110, 110, 109, 107, 108, 106, 105, 105, 105, 105, 106, 109, 112, 114, 118, 122, 126, 129, 131, 133, 133, 133, 134, 139, 143, 146, 150, 152, 155, 155, 154, 153, 149, 146, 143, 140, 139, 136, 137, 138, 140, 143, 143, 145, 143, 140, 136, 134, 133, 129, 128, 128, 128, 129, 127, 128, 128, 127, 126, 127, 128, 125, 122, 121, 119, 119, 118, 119, 119, 117, 116, 116, 117, 117, 115, 115, 115, 117, 117, 121, 124, 127, 129, 132, 135, 136, 135, 135, 135, 137, 136, 138, 139, 141, 142, 143, 145, 144, 139, 138, 136, 136, 137, 139, 144, 148, 149, 148, 147, 145, 138, 135, 133, 135, 136, 138, 141, 142, 142, 138, 134, 131, 123, 118, 114, 112, 110, 107, 109, 109, 108, 109, 109, 110, 107, 105, 104, 103, 104, 103, 107, 109, 111, 112, 112, 112, 110, 108, 108, 107, 108, 105, 104, 104, 104, 103, 103, 106, 109, 110, 116, 121, 126, 128, 131, 132, 131, 129, 127, 127, 129, 129, 133, 137, 142, 143, 146, 146, 144, 140, 137, 136, 137, 139, 143, 145, 148, 147, 144, 143, 142, 140, 139, 142, 145, 144, 142, 137, 131, 124, 118, 117, 118, 121, 123, 128, 132, 130, 126, 122, 118, 115, 113, 114, 117, 119, 122, 125, 130, 133, 131, 130, 127, 126, 123, 125, 127, 129, 130, 132, 135, 136, 135, 137, 140, 144, 144, 144, 142, 140, 135, 135, 138, 142, 143, 149, 151, 154, 153, 151, 149, 145, 142, 140, 140, 140, 136, 134, 132, 131, 130, 128, 129, 131, 132, 131, 132, 131, 126, 123, 121, 121, 122, 121, 124, 125, 124, 122, 119, 115, 109, 106, 106, 110, 115, 118, 123, 125, 124, 121, 118, 115, 111, 110, 110, 113, 116, 117, 120, 121, 121, 119, 116, 116, 117, 117, 122, 126, 131, 132, 133, 133, 132, 128, 124, 124, 125, 124, 128, 129, 131, 130, 131, 130, 128, 125, 123, 123, 126, 126, 130, 131, 133, 133, 131, 131, 130, 126, 123, 122, 121, 119, 119, 116, 116, 116, 116, 118, 119, 118, 117, 120, 124, 124, 124, 124, 125, 124, 121, 121, 119, 118, 117, 118, 122, 122, 120, 121, 122, 123, 124, 128, 131, 133, 134, 136, 139, 138, 134, 132, 132, 132, 129, 130, 130, 130, 130, 132, 134, 134, 132, 134, 135, 139, 140, 140, 140, 139, 135, 135, 136, 135, 133, 134, 133, 135, 133, 131, 129, 130, 130, 131, 132, 134, 132, 133, 132, 134, 132, 130, 129, 127, 125, 124, 122, 123, 123, 122, 122, 125, 125, 123, 123, 123, 124, 123, 122, 123, 124, 123, 123, 124, 124, 121, 122, 122, 122, 120, 120, 125, 127, 127, 129, 130, 131, 129, 130, 130, 131, 130, 129, 132, 133, 132, 135, 134, 135, 135, 136, 136, 136, 133, 132, 135, 137, 136, 136, 134, 135, 133, 131, 130, 129, 127, 126, 126, 128, 127, 128, 128, 129, 128, 128, 129, 127, 124, 123, 123, 124, 122, 122, 120, 121, 122, 121, 121, 122, 122, 123, 124, 127, 126, 126, 126, 126, 125, 124, 124, 122, 122, 120, 120, 123, 123, 123, 125, 127, 130, 131, 132, 132, 134, 133, 132, 133, 132, 131, 132, 130, 131, 129, 127, 127, 128, 126, 127, 130, 131, 131, 132, 130, 132, 130, 127, 127, 127, 125, 123, 123, 122, 121, 123, 124, 126, 127, 127, 128, 128, 126, 124, 125, 126, 125, 126, 126, 127, 126, 124, 124, 124, 123, 124, 122, 124, 124, 125, 126, 127, 127, 127, 127, 127, 126, 125, 124, 126, 124, 123, 123, 122, 124, 124, 124, 126, 127, 127, 127, 129, 129, 129, 130, 128, 128, 128, 127, 127, 127, 125, 125, 127, 128, 127, 128, 126, 127, 127, 127, 127, 128, 127, 127, 128, 129, 128, 128, 126, 126, 125, 124, 125, 125, 123, 123, 124, 125, 124, 124, 123, 125, 126, 126, 126, 126, 124, 122, 121, 122, 121, 121, 123, 124, 126, 127, 128, 129, 129, 128, 128, 131, 131, 129, 130, 132, 133, 133, 133, 133, 133, 133, 132, 135, 134, 133, 135, 135, 135, 135, 134, 133, 133, 132, 131, 134, 133, 130, 130, 128, 130, 129, 127, 127, 128, 126, 126, 127, 127, 126, 127, 127, 129, 127, 126, 126, 125, 123, 122, 122, 124, 123, 123, 123, 125, 124, 124, 124, 124, 123, 123, 123, 125, 125, 126, 127, 127, 127, 126, 127, 126, 126, 126, 125, 129, 129, 129, 130, 131, 131, 131, 132, 132, 133, 131, 130, 131, 130, 130, 131, 130, 131, 132, 132, 132, 132, 130, 129, 130, 129, 128, 129, 128, 130, 129, 128, 127, 126, 124, 124, 125, 126, 126, 126, 125, 126, 125, 125, 125, 125, 123, 124, 124, 124, 123, 122, 121, 124, 124, 125, 126, 125, 125, 124, 123, 125, 124, 123, 122, 124, 124, 125, 125, 125, 125, 124, 123, 126, 125, 125, 126, 126, 127, 128, 127, 127, 128, 127, 126, 129, 128, 128, 129, 128, 130, 130, 130, 130, 131, 129, 129, 131, 131, 131, 131, 130, 132, 131, 129, 129, 130, 128, 128, 128, 128, 128, 128, 127, 129, 128, 128, 128, 128, 127, 127, 127, 128, 127, 127, 127, 128, 127, 126, 125, 125, 125, 125, 125, 127, 126, 126, 127, 127, 127, 128, 128, 128, 129, 128, 127, 130, 128, 127, 127, 127, 128, 128, 128, 128, 129, 128, 128, 129, 128, 127, 128, 127, 130, 129, 129, 129, 129, 128, 128, 129, 129, 129, 129, 127, 130, 130, 129, 129, 130, 128, 128, 129, 129, 128, 128, 127, 128, 127, 127, 128, 128, 127, 127, 126, 128, 126, 125, 125, 127, 127, 127, 127, 127, 127, 127, 125, 127, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 125, 127, 126, 126, 128, 127, 128, 128, 126, 126, 127, 127, 126, 128, 127, 127, 128, 127, 128, 127, 126, 126, 127, 127, 126, 128, 128, 127, 127, 126, 128, 127, 127, 127, 127, 126, 126, 125, 126, 126, 126, 126, 128, 127, 127, 127, 126, 125, 124, 123, 124, 124, 124, 124, 126, 126, 127, 126, 126, 126, 126, 124, 127, 126, 126, 125, 125, 125, 126, 126, 126, 126, 125, 125, 127, 127, 127, 127, 127, 127, 128, 128, 129, 129, 128, 128, 129, 127, 128, 128, 127, 129, 129, 128, 129, 128, 128, 128, 129, 129, 129, 129, 128, 130, 129, 128, 128, 127, 127, 126, 127, 128, 128, 128, 128, 129, 129, 129, 129, 128, 128, 128, 127, 126, 127, 126, 128, 129, 131, 132, 131, 124, 130, 115, 118, 149, 124, 123, 140, 118, 128, 115, 133, 123, 132, 135, 137, 131, 145, 118, 136, 124, 122, 124, 125, 126, 131, 135, 130, 137, 127, 113, 111, 123, 114, 132, 137, 131, 116, 136, 119, 141, 133, 131, 137, 130, 111, 134, 142, 121, 124, 132, 127, 141, 128, 152, 143, 140, 130, 109, 116, 126, 107, 132, 125, 128, 104, 129, 141, 120, 120, 140, 111, 141, 119, 115, 128, 143, 106, 121, 134, 130, 110, 129, 122, 145, 130, 136, 120, 132, 122, 131, 141, 134, 115, 130, 131, 133, 126, 125, 136, 149, 128, 121, 142, 123, 121, 132, 141, 124, 122, 118, 120, 119, 141, 131, 127, 142, 138, 124, 128, 114, 123, 118, 129, 122, 117, 124, 125, 122, 125, 132, 134, 134, 133, 130, 130, 116, 129, 113, 122, 126, 123, 115, 137, 111, 130, 141, 134, 130, 141, 130, 137, 124, 132, 110, 128, 129, 122, 121, 130, 122, 131, 127, 128, 136, 135, 122, 134, 124, 125, 120, 129, 128, 118, 129, 118, 131, 125, 126, 129, 144, 131, 136, 131, 133, 126, 126, 129, 124, 130, 125, 136, 125, 127, 130, 129, 117, 118, 125, 129, 124, 131, 121, 126, 125, 129, 117, 130, 118, 119, 122, 123, 125, 138, 129, 138, 125, 128, 127, 129, 126, 132, 133, 135, 135, 116, 129, 127, 121, 123, 139, 126, 130, 137, 121, 119, 133, 131, 110, 125, 134, 120, 120, 129, 132, 133, 132, 128, 134, 131, 128, 118, 133, 127, 132, 131, 127, 134, 125, 119, 127, 135, 133, 122, 136, 134, 134, 112, 125, 118, 131, 116, 122, 125, 130, 121, 121, 126, 136, 129, 140, 119, 121, 134, 117, 118, 128, 133, 129, 128, 131, 133, 119, 128, 139, 132, 123, 127, 137, 126, 116, 131, 126, 124, 136, 120, 124, 130, 122, 127, 125, 127, 126, 135, 120, 124, 121, 133, 124, 125, 133, 127, 125, 124, 118, 128, 129, 130, 133, 133, 132, 129, 125, 128, 130, 124, 130, 126, 137, 116, 123, 134, 133, 121, 129, 134, 133, 125, 114, 127, 116, 125, 129, 122, 127, 117, 126, 129, 125, 132, 135, 127, 130, 130, 131, 120, 123, 129, 128, 128, 128, 133, 134, 126, 127, 126, 131, 128, 137, 124, 125, 127, 119, 127, 125, 131, 131, 119, 127, 116, 133, 122, 127, 128, 131, 127, 128, 125, 134, 126, 121, 127, 123, 123, 127, 124, 127, 129, 129, 131, 136, 132, 135, 126, 124, 123, 129, 121, 125, 130, 128, 131, 121, 132, 130, 131, 127, 129, 121, 127, 123, 123, 127, 125, 131, 123, 132, 131, 130, 127, 123, 128, 127, 126, 127, 128, 125, 121, 130, 130, 138, 131, 123, 125, 131, 120, 126, 125, 131, 128, 128, 134, 126, 133, 122, 130, 130, 126, 127, 130, 128, 126, 119, 126, 130, 133, 135, 130, 133, 130, 118, 124, 130, 128, 124, 128, 123, 127, 128, 134, 128, 132, 131, 126, 128, 123, 124, 131, 125, 123, 124, 130, 130, 122, 129, 131, 123, 133, 127, 132, 129, 125, 121, 123, 124, 133, 127, 132, 129, 130, 120, 125, 129, 130, 128, 128, 129, 127, 121, 129, 128, 133, 130, 126, 127, 126, 125, 128, 122, 126, 128, 129, 125, 131, 129, 128, 122, 128, 122, 134, 123, 125, 124, 123, 124, 127, 128, 128, 136, 127, 126, 119, 128, 124, 131, 127, 128, 123, 126, 123, 128, 126, 131, 129, 128, 127, 125, 122, 126, 123, 129, 132, 123, 127, 132, 130, 121, 124, 128, 125, 129, 123, 127, 133, 126, 122, 134, 128, 131, 133, 125, 124, 126, 123, 131, 129, 129, 130, 126, 131, 125, 127, 133, 130, 129, 126, 126, 125, 123, 127, 123, 125, 130, 129, 128, 129, 125, 126, 128, 126, 124, 128, 124, 131, 121, 123, 127, 125, 130, 134, 129, 127, 126, 128, 125, 130, 131, 123, 129, 126, 124, 123, 128, 125, 128, 131, 132, 127, 127, 126, 129, 123, 127, 131, 122, 130, 126, 123, 125, 130, 128, 130, 129, 128, 127, 123, 130, 125, 125, 129, 130, 127, 128, 130, 127, 125, 127, 132, 125, 130, 128, 127, 126, 129, 124, 130, 129, 127, 132, 127, 123, 124, 128, 127, 132, 126, 127, 125, 125, 126, 127, 129, 127, 131, 124, 124, 126, 126, 127, 129, 130, 133, 124, 130, 130, 124, 131, 128, 129, 128, 128, 121, 128, 129, 123, 128, 134, 126, 130, 130, 127, 128, 128, 124, 129, 127, 126, 128, 122, 126, 127, 127, 127, 127, 132, 128, 126, 126, 126, 127, 125, 131, 131, 135, 142, 139, 144, 146, 145, 146, 146, 143, 136, 135, 127, 127, 118, 106, 97, 97, 85, 84, 84, 81, 84, 82, 83, 89, 87, 94, 102, 110, 118, 125, 136, 145, 145, 160, 166, 175, 172, 180, 190, 192, 188, 192, 196, 191, 190, 184, 181, 170, 161, 156, 151, 144, 137, 131, 119, 115, 106, 100, 90, 93, 85, 83, 81, 80, 77, 87, 84, 87, 87, 90, 89, 94, 91, 96, 100, 103, 106, 106, 112, 115, 108, 114, 114, 122, 121, 132, 132, 135, 142, 144, 149, 158, 166, 169, 178, 179, 171, 165, 157, 152, 153, 154, 162, 170, 157, 146, 130, 119, 115, 113, 120, 120, 111, 98, 85, 76, 79, 83, 91, 98, 94, 83, 80, 75, 81, 90, 101, 110, 107, 100, 102, 96, 108, 124, 135, 155, 150, 140, 133, 127, 129, 143, 159, 177, 184, 171, 163, 152, 144, 152, 166, 182, 190, 175, 168, 150, 145, 155, 172, 195, 204, 190, 175, 159, 152, 150, 172, 183, 191, 172, 156, 139, 126, 121, 135, 140, 154, 138, 127, 114, 99, 94, 103, 115, 131, 124, 111, 96, 82, 68, 78, 94, 113, 110, 99, 82, 69, 55, 64, 81, 97, 106, 94, 80, 73, 58, 62, 80, 98, 112, 110, 106, 98, 86, 88, 101, 124, 138, 141, 136, 129, 117, 115, 128, 142, 162, 159, 154, 143, 130, 123, 136, 148, 168, 168, 165, 159, 143, 133, 142, 152, 167, 170, 165, 153, 142, 121, 128, 133, 150, 150, 145, 134, 124, 106, 109, 113, 129, 138, 136, 126, 120, 99, 112, 111, 129, 137, 139, 132, 125, 108, 115, 121, 135, 145, 149, 146, 140, 127, 128, 143, 156, 166, 168, 163, 163, 148, 142, 151, 158, 171, 168, 161, 157, 145, 138, 146, 147, 162, 159, 150, 145, 133, 123, 133, 133, 141, 145, 137, 126, 118, 105, 116, 120, 129, 128, 124, 113, 110, 91, 97, 105, 113, 116, 114, 102, 101, 87, 90, 97, 108, 115, 111, 101, 101, 84, 85, 91, 100, 112, 113, 102, 100, 88, 86, 96, 104, 114, 123, 114, 112, 103, 95, 106, 119, 129, 143, 139, 135, 132, 125, 134, 147, 160, 168, 167, 163, 156, 144, 148, 158, 171, 179, 177, 169, 162, 149, 147, 151, 159, 163, 160, 148, 141, 120, 111, 117, 122, 130, 131, 119, 113, 98, 88, 91, 99, 104, 110, 101, 97, 84, 76, 78, 93, 102, 111, 110, 104, 98, 92, 93, 103, 114, 122, 123, 121, 113, 106, 111, 124, 136, 147, 149, 146, 142, 133, 136, 143, 155, 158, 166, 160, 157, 147, 144, 152, 167, 168, 174, 166, 157, 151, 143, 143, 155, 156, 157, 152, 146, 133, 129, 125, 138, 142, 142, 137, 128, 118, 114, 111, 118, 125, 124, 124, 119, 110, 104, 102, 110, 114, 118, 119, 115, 108, 102, 98, 103, 115, 114, 121, 116, 111, 103, 102, 106, 118, 119, 125, 125, 117, 111, 109, 108, 120, 126, 129, 131, 126, 116, 119, 118, 129, 135, 140, 142, 136, 129, 126, 127, 136, 143, 143, 145, 139, 133, 131, 131, 138, 144, 142, 145, 140, 133, 134, 129, 129, 139, 134, 137, 136, 130, 125, 124, 121, 132, 131, 132, 131, 123, 119, 121, 115, 124, 125, 123, 125, 119, 110, 111, 106, 116, 117, 120, 125, 119, 112, 114, 108, 117, 126, 125, 128, 125, 117, 123, 122, 126, 136, 132, 140, 142, 129, 134, 134, 135, 146, 146, 146, 149, 140, 140, 142, 138, 145, 147, 147, 149, 139, 133, 136, 130, 141, 141, 138, 140, 134, 129, 133, 127, 133, 132, 127, 128, 124, 115, 120, 115, 118, 123, 120, 120, 121, 110, 117, 113, 113, 118, 115, 116, 118, 109, 110, 108, 108, 115, 114, 114, 119, 111, 111, 112, 111, 116, 115, 114, 121, 113, 112, 117, 115, 121, 120, 119, 125, 123, 120, 126, 125, 127, 130, 126, 134, 133, 128, 135, 135, 137, 140, 136, 139, 143, 138, 143, 145, 145, 144, 141, 140, 144, 139, 141, 144, 141, 142, 138, 137, 141, 136, 135, 137, 133, 131, 126, 125, 127, 123, 121, 126, 125, 122, 120, 117, 120, 118, 115, 120, 121, 118, 116, 112, 116, 118, 116, 121, 125, 124, 120, 118, 120, 124, 123, 128, 133, 132, 129, 128, 129, 134, 133, 137, 142, 141, 139, 134, 134, 139, 139, 143, 146, 147, 145, 138, 137, 139, 139, 139, 143, 144, 140, 132, 131, 129, 132, 131, 136, 137, 134, 126, 121, 119, 121, 121, 125, 128, 126, 118, 116, 113, 117, 118, 120, 126, 122, 116, 111, 108, 111, 114, 116, 119, 120, 117, 108, 113, 114, 120, 143, 142, 147, 139, 133, 125, 129, 130, 127, 136, 134, 121, 110, 104, 93, 97, 91, 95, 95, 88, 81, 78, 82, 86, 96, 104, 117, 122, 115, 118, 121, 138, 145, 164, 177, 185, 179, 180, 185, 194, 199, 205, 206, 205, 197, 185, 175, 172, 167, 162, 158, 151, 136, 123, 111, 106, 104, 102, 97, 95, 84, 75, 71, 71, 74, 81, 86, 92, 89, 80, 83, 87, 94, 101, 106, 117, 116, 108, 107, 104, 112, 121, 126, 136, 136, 127, 125, 128, 137, 150, 160, 168, 174, 167, 164, 165, 171, 179, 185, 186, 183, 166, 152, 144, 142, 142, 148, 144, 139, 124, 107, 101, 99, 101, 110, 109, 107, 96, 82, 75, 75, 82, 91, 95, 98, 93, 82, 78, 82, 90, 105, 115, 123, 127, 117, 113, 118, 123, 137, 145, 150, 153, 142, 131, 130, 133, 145, 156, 162, 166, 158, 148, 149, 153, 164, 179, 182, 187, 179, 167, 164, 166, 171, 180, 182, 184, 175, 163, 155, 155, 158, 165, 165, 164, 155, 140, 132, 130, 128, 137, 135, 134, 127, 109, 101, 97, 97, 106, 107, 105, 102, 89, 79, 76, 77, 87, 92, 87, 82, 67, 56, 57, 58, 66, 76, 75, 79, 72, 65, 66, 74, 86, 104, 108, 114, 111, 104, 103, 111, 117, 135, 138, 141, 135, 123, 119, 125, 131, 149, 157, 160, 157, 146, 140, 144, 148, 161, 170, 166, 161, 146, 135, 137, 142, 151, 161, 156, 154, 140, 128, 126, 130, 137, 147, 144, 141, 129, 117, 113, 116, 121, 133, 135, 133, 125, 113, 111, 114, 121, 136, 141, 142, 138, 127, 123, 128, 134, 148, 156, 157, 152, 143, 135, 138, 144, 155, 165, 167, 163, 154, 146, 146, 150, 160, 167, 168, 161, 146, 136, 131, 132, 140, 148, 150, 145, 131, 120, 116, 117, 124, 135, 138, 135, 123, 112, 106, 107, 113, 123, 125, 122, 110, 99, 91, 91, 97, 107, 114, 113, 104, 95, 87, 87, 92, 100, 105, 105, 98, 87, 81, 80, 86, 95, 104, 108, 105, 97, 92, 92, 97, 108, 119, 126, 126, 120, 116, 118, 123, 135, 147, 155, 156, 150, 146, 145, 150, 160, 170, 177, 178, 171, 165, 162, 163, 168, 175, 180, 179, 170, 159, 152, 149, 151, 154, 157, 154, 143, 130, 121, 117, 116, 120, 122, 120, 109, 98, 89, 85, 87, 92, 97, 99, 94, 86, 81, 80, 86, 93, 100, 104, 102, 97, 95, 95, 99, 107, 114, 120, 122, 118, 117, 116, 119, 127, 136, 143, 146, 142, 140, 140, 142, 148, 156, 160, 164, 159, 155, 152, 151, 155, 160, 164, 166, 161, 154, 150, 148, 148, 152, 154, 154, 148, 139, 134, 130, 128, 130, 130, 132, 129, 120, 117, 115, 115, 120, 123, 124, 122, 114, 111, 110, 110, 113, 115, 115, 115, 109, 106, 106, 106, 108, 113, 115, 118, 113, 110, 108, 110, 113, 118, 121, 123, 118, 115, 114, 115, 118, 123, 125, 128, 127, 123, 123, 124, 128, 133, 136, 138, 136, 132, 131, 132, 134, 138, 139, 140, 138, 134, 133, 134, 136, 139, 142, 143, 142, 136, 133, 132, 135, 138, 140, 139, 138, 131, 129, 129, 131, 133, 134, 134, 134, 128, 124, 123, 121, 122, 123, 123, 124, 119, 115, 114, 115, 117, 119, 118, 120, 118, 115, 115, 117, 119, 122, 122, 124, 125, 123, 124, 128, 131, 133, 134, 133, 135, 132, 134, 137, 139, 141, 142, 142, 144, 142, 141, 142, 143, 144, 145, 144, 142, 138, 135, 136, 137, 138, 138, 136, 134, 131, 128, 127, 128, 128, 128, 126, 125, 122, 119, 119, 119, 119, 118, 116, 114, 113, 111, 111, 112, 112, 111, 110, 110, 109, 107, 108, 111, 111, 112, 111, 109, 108, 106, 107, 110, 113, 114, 114, 113, 112, 111, 113, 116, 119, 121, 122, 123, 123, 122, 124, 127, 131, 134, 135, 136, 136, 134, 135, 138, 142, 144, 145, 144, 145, 143, 144, 146, 148, 149, 149, 147, 146, 142, 141, 143, 145, 145, 143, 140, 137, 133, 131, 132, 133, 134, 133, 130, 127, 124, 121, 121, 123, 125, 124, 121, 117, 114, 112, 114, 117, 120, 119, 118, 116, 115, 114, 115, 119, 122, 123, 123, 121, 120, 119, 122, 126, 130, 132, 132, 131, 131, 130, 131, 136, 140, 142, 142, 141, 139, 137, 137, 140, 143, 146, 144, 141, 137, 135, 134, 136, 139, 141, 140, 137, 134, 131, 129, 131, 132, 134, 131, 129, 124, 121, 119, 120, 122, 125, 124, 121, 117, 114, 113, 116, 118, 120, 120, 117, 114, 112, 110, 111, 114, 118, 119, 118, 115, 114, 112, 113, 118, 122, 124, 123, 122, 120, 119, 119, 122, 125, 129, 129, 127, 125, 124, 124, 128, 132, 135, 134, 132, 129, 127, 126, 130, 133, 135, 135, 132, 130, 128, 126, 128, 130, 134, 134, 133, 129, 127, 124, 126, 130, 133, 135, 133, 128, 126, 124, 124, 129, 130, 131, 129, 126, 124, 122, 123, 127, 131, 133, 131, 127, 123, 120, 120, 124, 127, 128, 127, 126, 124, 123, 122, 126, 129, 131, 131, 128, 127, 125, 127, 136, 130, 126, 125, 119, 118, 118, 125, 141, 150, 153, 148, 136, 126, 121, 122, 131, 145, 145, 138, 127, 113, 109, 114, 129, 143, 154, 144, 135, 120, 114, 115, 126, 136, 151, 147, 133, 125, 108, 103, 110, 122, 131, 145, 137, 128, 119, 105, 106, 116, 131, 145, 156, 139, 129, 103, 90, 98, 114, 130, 148, 144, 124, 118, 99, 103, 116, 129, 132, 145, 130, 125, 121, 112, 118, 125, 128, 136, 141, 124, 125, 113, 109, 121, 128, 133, 148, 143, 129, 133, 118, 120, 127, 132, 140, 157, 144, 141, 135, 118, 123, 127, 131, 142, 147, 125, 133, 120, 116, 129, 137, 137, 152, 137, 123, 129, 113, 119, 130, 134, 134, 142, 118, 119, 116, 107, 116, 127, 127, 136, 139, 121, 131, 117, 113, 122, 131, 127, 144, 129, 118, 122, 105, 110, 128, 133, 137, 151, 122, 127, 119, 110, 125, 140, 133, 148, 137, 116, 124, 109, 114, 130, 138, 136, 151, 128, 123, 120, 111, 120, 138, 141, 147, 151, 122, 121, 109, 108, 121, 143, 141, 156, 139, 118, 117, 105, 112, 134, 145, 146, 154, 122, 117, 109, 103, 117, 139, 141, 153, 144, 122, 119, 105, 105, 124, 138, 143, 152, 130, 118, 107, 95, 106, 132, 143, 155, 154, 130, 119, 105, 101, 120, 140, 143, 151, 134, 115, 108, 99, 106, 132, 142, 149, 154, 132, 122, 116, 108, 121, 138, 138, 150, 141, 118, 115, 105, 105, 128, 139, 145, 155, 134, 122, 120, 109, 121, 140, 140, 147, 140, 116, 116, 111, 107, 129, 139, 139, 146, 128, 116, 121, 112, 117, 137, 137, 139, 138, 117, 117, 119, 110, 127, 139, 135, 139, 127, 112, 118, 113, 118, 139, 145, 143, 142, 124, 116, 117, 114, 127, 142, 143, 139, 130, 114, 114, 116, 122, 137, 148, 144, 138, 128, 116, 117, 119, 124, 137, 143, 133, 130, 117, 108, 113, 117, 128, 146, 143, 135, 128, 112, 112, 118, 121, 139, 142, 130, 123, 111, 105, 115, 117, 129, 142, 136, 129, 122, 112, 117, 122, 125, 136, 135, 127, 121, 111, 110, 120, 124, 136, 138, 131, 122, 117, 110, 120, 128, 139, 145, 137, 125, 117, 114, 117, 129, 135, 144, 136, 127, 114, 113, 116, 130, 141, 149, 144, 135, 123, 113, 116, 123, 137, 149, 144, 133, 122, 110, 112, 121, 130, 152, 153, 141, 130, 113, 110, 119, 126, 141, 154, 136, 131, 112, 105, 114, 127, 135, 157, 145, 131, 121, 102, 107, 119, 129, 146, 153, 130, 125, 107, 104, 115, 128, 139, 156, 141, 124, 112, 100, 108, 123, 135, 151};&lt;br /&gt;
const uint16_t sizeMusique=sizeof musique;&lt;br /&gt;
// pour lire le tableau, avec i variant de 0 à sizeMusique&lt;br /&gt;
// OCR4A=pgm_read_byte(musique+i)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_ampliAudio&amp;diff=20878</id>
		<title>Cours:TPS 2103 tp ampliAudio</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:TPS_2103_tp_ampliAudio&amp;diff=20878"/>
				<updated>2026-03-10T12:18:11Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* {{Rouge|Matériel}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;{{Rouge|!! Attention, utiliser un programmateur AVR avec les cartes leonardo !!!}}&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPs_2103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
[[Cours:TPS_2103_tp_ampliAudio_Corrige|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
={{Rouge|Matériel}}=&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons :&lt;br /&gt;
*1 carte arduino Leonardo ([https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7766-8-bit-AVR-ATmega16U4-32U4_Datasheet.pdf#page=414 ATmega32U4])&lt;br /&gt;
*1 plaque à essais&lt;br /&gt;
*1 résistance 39k&lt;br /&gt;
*3 condensateur&lt;br /&gt;
**1n&lt;br /&gt;
**10n&lt;br /&gt;
**100n&lt;br /&gt;
*fils M-M&lt;br /&gt;
*1 oscilloscope&lt;br /&gt;
*1 sonde de tension&lt;br /&gt;
*1 ampli audio&lt;br /&gt;
&lt;br /&gt;
=PWM du TIMER4 d'un atmega32u4=&lt;br /&gt;
&lt;br /&gt;
==Configuration de la PLL de l'atmega32u4==&lt;br /&gt;
&lt;br /&gt;
La gestion de l'horloge de l'atmega32u4 est plus complexe que les µcontroleurs que nous utilisons habituellement.&lt;br /&gt;
&lt;br /&gt;
La fréquence d'horloge du CPU est ici de 16MHz.&lt;br /&gt;
&lt;br /&gt;
Cependant, il existe dans le µcontrôleur différentes horloges dont les fréquences sont gérées par un module PLL.&lt;br /&gt;
&lt;br /&gt;
Ceci est documenté dans les pages 27 à 42 de la datasheet officielle.&lt;br /&gt;
&lt;br /&gt;
Nous ne nous intéresserons pas à cette partie, on utilisera juste le code suivant qui permettra d'avoir une fréquence de {{Rouge|64MHz}} pour l'horloge du Timer4.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
PLLCSR |= (1&amp;lt;&amp;lt;PLLE)|(1&amp;lt;&amp;lt;PINDIV);&lt;br /&gt;
PLLFRQ =0;&lt;br /&gt;
PLLFRQ |= (1&amp;lt;&amp;lt;PDIV3)|(1&amp;lt;&amp;lt;PDIV1)|(1&amp;lt;&amp;lt;PLLTM1);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Mode PWM Timer4==&lt;br /&gt;
&lt;br /&gt;
On va utiliser la sortie OC4A sur la broche PC7. Cela correspond dans la numérotation arduino à la broche n°13 de la carte.&lt;br /&gt;
&lt;br /&gt;
Il est à noter qu'une led est déjà connectée sur cette broche : c'est une led orange sérigraphiée L sur la carte arduino Leonardo.&lt;br /&gt;
&lt;br /&gt;
===PWM rapide sur broche OC4A===&lt;br /&gt;
&lt;br /&gt;
{{Todo|Compléter votre programme en configurant le registre TCCR4A afin de :}}&lt;br /&gt;
* activer le mode PWM sur la sortie OC4A (bit PWM4A)&lt;br /&gt;
* faire en sorte que la sortie soit à l'état 1 tant que la valeur du timer est inférieure à la valeur de comparaison (bits COM4xx)&lt;br /&gt;
&lt;br /&gt;
===Prédiviseur===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On souhaite avoir la fréquence de MLI la plus grand possible.&lt;br /&gt;
&lt;br /&gt;
{{Todo|Choisir le prédiviseur le plus adapté (p168) et modifier en conséquence votre programme}}&lt;br /&gt;
&lt;br /&gt;
==Fréquence de la MLI==&lt;br /&gt;
&lt;br /&gt;
La fréquence de la MLI dépend bien évidemment de la fréquence de l'horloge du Timer (64MHz ici) de la valeur du prédiviseur (définie précédemment) mais également de la valeur maximum que peut prendre le compteur du TIMER (cf p.153 Fast PWM mode)&lt;br /&gt;
&lt;br /&gt;
Comme détaillé dans le tableau 15-18 p171, la valeur maximum du Timer (notée TOP) doit être définie dans le registre OCR4C.&lt;br /&gt;
&lt;br /&gt;
{{Todo|Calculer la valeur de OCR4C (rappel valeur maximum 255) pour obtenir une fréquence de MLI de 250kHz.}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Modifier le programme}}&lt;br /&gt;
&lt;br /&gt;
==Test==&lt;br /&gt;
&lt;br /&gt;
{{Question|Vérifier le fonctionnement du mode PWM :}}&lt;br /&gt;
*Il faudra utiliser un oscilloscope !&lt;br /&gt;
*Incrémenter le rapport cyclique toutes les 500µs par exemple&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Génération de signal et MLI=&lt;br /&gt;
&lt;br /&gt;
==Filtrage==&lt;br /&gt;
&lt;br /&gt;
On souhaite mettre en place un filtre passe bas passif du 1er ordre dont la fréquence de coupure sera de l'ordre de 4kHz (beaucoup plus petite que la fréquence de la mli).&lt;br /&gt;
&lt;br /&gt;
La résistance utilisée aura pour valeur 39k.&lt;br /&gt;
&lt;br /&gt;
{{Question|Choisir le condensateur adapté, câbler sur plaque à essais, et visualiser le signal après filtrage en conservant le programme précédent.}}&lt;br /&gt;
&lt;br /&gt;
==Sinusoïde==&lt;br /&gt;
&lt;br /&gt;
On souhaite désormais générer un signal sinusoïdal.&lt;br /&gt;
&lt;br /&gt;
Il s'agit donc de faire varier le rapport cyclique régulièrement de sorte à ce que le signal filtré soit de forme sinusoïdal.&lt;br /&gt;
&lt;br /&gt;
{{Todo|On va utiliser un tableur pour calculer les valeurs successives du rapport cyclique (donc de OCR4A) :}}&lt;br /&gt;
*Faire une colonne pour les valeur d'angle variant de 0° à 350° tous les 10°&lt;br /&gt;
*Calculer alors {{Rouge|Amplitude x sin(angle) + offset}}&lt;br /&gt;
**la valeur doit être entre 0 et 255 ( valeur de OCR4A)&lt;br /&gt;
**la sinusoïde tracée sur le tableur doit avoir une amplitude maximale ( entre 0 et 255)&lt;br /&gt;
**l'offset permet d'avoir une valeur toujours positive&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Modifier votre programme en :}}&lt;br /&gt;
*déclarant un tableau contenant les valeurs précalculées dans le tableur&lt;br /&gt;
*modifiant le rapport cyclique toutes les 500µs grâce au tableau&lt;br /&gt;
&lt;br /&gt;
{{Todo|Vérifier que vous obtenez bien une sinusoïde après filtrage}}&lt;br /&gt;
&lt;br /&gt;
=Suppression du &amp;quot;delay&amp;quot;=&lt;br /&gt;
&lt;br /&gt;
On souhaite utiliser un Timer pour modifier régulièrement la valeur du rapport cyclique. Le principe sera le suivant :&lt;br /&gt;
&lt;br /&gt;
*On utilise le Timer1 (16 bits)&lt;br /&gt;
*On place le timer en mode CTC (datasheet p133)&lt;br /&gt;
*On prendre la valeur 1 comme prédiviseur (datasheet p134)&lt;br /&gt;
*Choisir la valeur de OCR1A pour avoir une sinusoïde à 440&lt;br /&gt;
*On autorise l'interruption de comparaison OCIE1A (p137)&lt;br /&gt;
*La routine d'interruption sera de la forme suivante :&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
ISR(TIMER1_COMPA_vect)&lt;br /&gt;
{&lt;br /&gt;
  // déclarer une variable static sur 8 bits qui sera la valeur d'angle (entre 0 et 35)&lt;br /&gt;
  ...&lt;br /&gt;
  // changer la valeur du rapport cyclique en utilisant le tableau&lt;br /&gt;
  OCR4A = ...;&lt;br /&gt;
  // incrémenter la valeur de l'angle, en ne dépassant pas 35 !&lt;br /&gt;
  ...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous pouvez utiliser ce fichier :&lt;br /&gt;
&lt;br /&gt;
 *** [[Media:CalculTimer.ods|{{Rouge|feuille de calcul pour les TIMERS}}]] ***&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications et valider le fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Modification du volume=&lt;br /&gt;
&lt;br /&gt;
Vous pouvez éventuellement modifier le volume en modifiant l'amplitude du signal.&lt;br /&gt;
&lt;br /&gt;
On utilise une entrée analogique qui servira à modifier les valeurs du rapport cyclique.&lt;br /&gt;
&lt;br /&gt;
=Musique !=&lt;br /&gt;
&lt;br /&gt;
La musique suivante est encodée à une fréquence d'échantillonnage de 40kHz.&lt;br /&gt;
&lt;br /&gt;
Le tableau est déclaré dans la mémoire programme en utilisant le mot clé [https://www.arduino.cc/reference/en/language/variables/utilities/progmem/ PROGMEM].&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme qui joue en boucle cette musique}}&lt;br /&gt;
&lt;br /&gt;
{{Todo|Constatez l'espace mémoire disponible lors de la compilation}}&lt;br /&gt;
&lt;br /&gt;
Rque :&lt;br /&gt;
*Vous pour utiliser le logiciel [http://highlowtech.org/?p=1963  EncodeAudio] pour créer un tableau de valeur.&lt;br /&gt;
** dans un terminal : /usr/local/bin/EncodeAudio-linux/EncodeAudio&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
const uint8_t musique[] PROGMEM=&lt;br /&gt;
{125, 124, 126, 126, 128, 128, 130, 129, 130, 130, 131, 129, 130, 128, 129, 128, 126, 125, 125, 123, 124, 122, 123, 122, 124, 123, 125, 125, 126, 128, 128, 130, 131, 130, 131, 131, 130, 131, 129, 129, 126, 126, 124, 125, 123, 123, 122, 123, 123, 122, 124, 123, 125, 125, 128, 128, 130, 131, 131, 132, 131, 132, 130, 131, 130, 128, 128, 125, 124, 123, 122, 122, 121, 122, 121, 123, 122, 125, 125, 128, 128, 131, 132, 132, 133, 132, 133, 133, 131, 131, 129, 128, 126, 123, 123, 121, 119, 119, 118, 119, 121, 122, 123, 125, 126, 129, 131, 133, 133, 136, 137, 136, 137, 134, 132, 132, 129, 126, 124, 121, 119, 116, 116, 115, 116, 115, 118, 119, 123, 125, 130, 132, 138, 139, 144, 145, 147, 147, 147, 145, 141, 138, 132, 128, 121, 116, 110, 103, 99, 95, 92, 91, 89, 92, 93, 99, 103, 110, 117, 126, 133, 144, 151, 160, 164, 171, 176, 178, 179, 179, 177, 174, 170, 162, 157, 148, 142, 133, 126, 118, 113, 106, 101, 95, 93, 89, 88, 87, 88, 87, 89, 91, 91, 94, 95, 96, 100, 100, 102, 104, 104, 108, 109, 109, 113, 114, 117, 119, 121, 124, 126, 130, 133, 134, 138, 140, 140, 142, 142, 145, 145, 145, 144, 144, 142, 142, 142, 140, 141, 140, 141, 141, 144, 145, 146, 147, 149, 151, 152, 154, 154, 155, 154, 155, 153, 152, 149, 146, 145, 140, 138, 134, 131, 128, 123, 122, 118, 118, 116, 116, 116, 115, 116, 117, 118, 117, 119, 118, 119, 118, 116, 116, 113, 111, 108, 106, 101, 99, 95, 93, 89, 89, 87, 87, 86, 88, 89, 93, 95, 100, 103, 107, 113, 115, 121, 123, 128, 130, 133, 136, 136, 137, 137, 138, 137, 136, 137, 134, 136, 136, 134, 137, 138, 138, 141, 144, 145, 148, 152, 154, 157, 160, 163, 164, 167, 167, 169, 168, 168, 167, 166, 162, 161, 157, 155, 152, 148, 146, 141, 140, 138, 134, 133, 131, 130, 128, 126, 124, 124, 122, 122, 119, 119, 117, 116, 114, 113, 109, 108, 104, 103, 99, 98, 94, 93, 91, 88, 87, 85, 85, 85, 84, 85, 85, 85, 86, 87, 89, 91, 92, 93, 95, 96, 99, 100, 102, 102, 104, 106, 106, 108, 108, 110, 111, 110, 113, 114, 116, 116, 119, 122, 124, 125, 130, 132, 137, 140, 144, 147, 152, 154, 159, 162, 166, 169, 171, 175, 176, 179, 179, 182, 182, 184, 183, 183, 184, 183, 183, 182, 179, 178, 176, 175, 171, 170, 167, 163, 160, 156, 151, 147, 141, 138, 132, 129, 123, 118, 113, 109, 104, 102, 98, 95, 93, 89, 89, 88, 86, 87, 86, 87, 86, 87, 87, 88, 87, 88, 87, 88, 87, 86, 86, 85, 84, 84, 81, 83, 83, 81, 83, 84, 84, 87, 88, 92, 95, 99, 101, 106, 108, 113, 117, 119, 124, 126, 130, 133, 134, 138, 139, 142, 144, 146, 146, 149, 149, 153, 154, 157, 157, 161, 162, 166, 167, 170, 172, 174, 176, 177, 177, 179, 178, 179, 178, 178, 177, 175, 175, 171, 171, 169, 166, 164, 161, 160, 156, 155, 153, 151, 148, 146, 144, 139, 137, 133, 131, 126, 123, 118, 115, 109, 107, 101, 99, 93, 91, 86, 85, 80, 79, 77, 77, 76, 73, 74, 74, 73, 74, 74, 76, 76, 78, 78, 79, 80, 80, 83, 83, 84, 84, 87, 88, 88, 92, 93, 96, 98, 102, 104, 109, 111, 116, 119, 124, 128, 133, 136, 141, 145, 147, 152, 154, 159, 161, 163, 167, 167, 170, 171, 174, 174, 176, 177, 177, 178, 178, 179, 179, 178, 179, 178, 179, 177, 177, 175, 175, 174, 171, 170, 167, 167, 164, 161, 160, 156, 154, 151, 149, 145, 144, 140, 137, 134, 130, 129, 125, 121, 118, 113, 110, 106, 102, 99, 94, 91, 86, 84, 80, 76, 73, 70, 69, 66, 63, 63, 61, 61, 61, 59, 62, 61, 64, 65, 66, 70, 72, 74, 78, 81, 84, 88, 91, 95, 99, 103, 106, 110, 113, 117, 119, 124, 125, 130, 132, 136, 139, 140, 145, 147, 151, 154, 156, 160, 163, 167, 170, 171, 176, 178, 182, 183, 186, 186, 190, 189, 191, 190, 191, 191, 190, 187, 186, 184, 182, 179, 177, 174, 171, 167, 166, 161, 160, 156, 153, 151, 146, 145, 140, 138, 133, 131, 126, 124, 118, 115, 111, 106, 103, 99, 93, 91, 85, 83, 78, 77, 72, 71, 70, 68, 66, 64, 65, 64, 63, 64, 64, 65, 66, 68, 66, 69, 69, 72, 72, 74, 77, 79, 80, 85, 86, 91, 94, 98, 103, 107, 113, 116, 122, 126, 131, 137, 140, 145, 149, 152, 156, 159, 163, 164, 168, 170, 171, 175, 175, 178, 178, 182, 182, 185, 185, 187, 189, 189, 191, 190, 192, 190, 191, 189, 189, 186, 183, 181, 176, 174, 169, 166, 162, 156, 154, 149, 145, 141, 138, 133, 131, 128, 125, 122, 119, 115, 113, 109, 107, 102, 100, 95, 92, 88, 84, 80, 77, 72, 69, 66, 63, 62, 58, 58, 58, 58, 58, 59, 61, 63, 64, 68, 69, 72, 74, 77, 80, 81, 85, 86, 87, 91, 92, 95, 98, 99, 102, 104, 109, 111, 117, 121, 126, 131, 137, 142, 147, 154, 159, 164, 169, 172, 178, 181, 184, 185, 189, 189, 191, 190, 191, 191, 190, 191, 190, 190, 190, 189, 187, 189, 186, 187, 185, 184, 184, 182, 181, 177, 175, 171, 169, 164, 159, 155, 151, 146, 139, 136, 129, 125, 121, 116, 110, 108, 103, 101, 96, 95, 93, 88, 87, 84, 83, 80, 77, 73, 72, 68, 66, 64, 61, 59, 56, 56, 54, 54, 53, 55, 54, 57, 59, 62, 64, 69, 71, 77, 80, 85, 88, 94, 96, 101, 107, 109, 114, 116, 122, 125, 128, 132, 134, 139, 144, 147, 152, 155, 159, 164, 168, 171, 176, 179, 184, 185, 190, 191, 193, 194, 194, 196, 194, 196, 193, 193, 191, 191, 189, 187, 185, 184, 182, 181, 178, 176, 175, 171, 170, 167, 164, 160, 157, 154, 148, 145, 139, 134, 129, 122, 117, 110, 106, 99, 95, 88, 85, 80, 78, 74, 71, 70, 66, 66, 65, 63, 64, 63, 64, 62, 63, 63, 62, 63, 62, 63, 63, 64, 63, 65, 65, 68, 69, 72, 73, 78, 80, 85, 89, 93, 99, 102, 109, 113, 119, 124, 130, 134, 138, 144, 147, 152, 155, 160, 162, 167, 168, 172, 174, 178, 179, 183, 184, 189, 189, 192, 193, 196, 196, 198, 198, 199, 199, 198, 196, 196, 193, 192, 189, 186, 183, 181, 176, 174, 169, 167, 163, 157, 155, 152, 147, 144, 139, 136, 131, 128, 123, 119, 115, 110, 103, 100, 94, 91, 85, 81, 77, 71, 69, 64, 62, 59, 56, 56, 54, 53, 54, 53, 54, 54, 56, 56, 59, 59, 63, 65, 68, 70, 72, 73, 77, 79, 80, 85, 86, 91, 92, 96, 100, 103, 108, 111, 117, 121, 128, 132, 138, 142, 147, 153, 159, 163, 168, 172, 176, 179, 183, 185, 189, 190, 192, 194, 194, 196, 197, 196, 197, 197, 196, 196, 194, 194, 192, 192, 190, 189, 186, 185, 182, 181, 177, 176, 171, 169, 166, 160, 157, 153, 147, 144, 137, 133, 128, 123, 117, 111, 108, 101, 98, 92, 88, 83, 80, 74, 72, 70, 66, 64, 62, 58, 58, 57, 56, 56, 54, 55, 54, 56, 56, 58, 58, 61, 62, 64, 65, 70, 71, 74, 77, 81, 83, 87, 91, 95, 98, 102, 106, 110, 114, 118, 122, 128, 131, 136, 140, 144, 149, 154, 157, 162, 166, 171, 174, 178, 182, 185, 189, 190, 193, 194, 197, 198, 198, 199, 199, 198, 199, 197, 197, 194, 192, 191, 187, 186, 184, 179, 178, 175, 171, 169, 166, 161, 159, 154, 152, 147, 145, 140, 136, 132, 126, 123, 118, 114, 108, 104, 99, 95, 91, 85, 83, 78, 73, 71, 66, 65, 63, 59, 58, 56, 56, 55, 56, 56, 56, 57, 57, 59, 61, 62, 65, 65, 69, 71, 73, 77, 78, 83, 85, 88, 91, 95, 98, 102, 106, 110, 113, 118, 121, 126, 131, 134, 139, 142, 148, 152, 156, 160, 164, 168, 172, 176, 178, 182, 184, 187, 190, 190, 193, 194, 193, 196, 194, 196, 194, 193, 193, 191, 190, 187, 186, 183, 182, 178, 176, 172, 170, 167, 164, 160, 157, 153, 151, 146, 144, 138, 136, 131, 126, 123, 118, 113, 110, 104, 101, 98, 92, 89, 85, 83, 78, 76, 73, 71, 68, 68, 64, 64, 63, 63, 62, 63, 62, 63, 63, 65, 65, 68, 68, 70, 71, 73, 76, 77, 80, 84, 86, 88, 92, 94, 100, 102, 107, 110, 115, 118, 124, 126, 132, 136, 140, 144, 149, 153, 156, 161, 163, 168, 170, 172, 176, 177, 181, 182, 185, 185, 187, 187, 190, 189, 191, 190, 190, 190, 189, 186, 186, 183, 183, 179, 177, 176, 172, 169, 167, 162, 160, 155, 153, 148, 146, 142, 137, 134, 130, 128, 122, 119, 116, 111, 108, 103, 101, 98, 93, 91, 86, 84, 81, 78, 77, 74, 71, 71, 69, 69, 66, 68, 66, 68, 69, 69, 70, 71, 72, 74, 76, 78, 79, 81, 84, 85, 87, 89, 92, 95, 96, 101, 102, 107, 110, 113, 117, 119, 124, 129, 131, 137, 139, 144, 147, 152, 155, 160, 163, 166, 169, 172, 174, 177, 178, 181, 183, 183, 185, 185, 186, 185, 186, 186, 186, 185, 183, 183, 181, 181, 177, 176, 172, 171, 168, 167, 163, 159, 156, 153, 151, 146, 144, 138, 136, 132, 128, 125, 121, 118, 115, 110, 108, 103, 101, 96, 94, 89, 88, 84, 83, 80, 77, 76, 72, 72, 71, 69, 70, 69, 70, 70, 69, 71, 71, 73, 76, 76, 79, 79, 83, 84, 87, 89, 92, 93, 96, 98, 101, 102, 106, 109, 110, 115, 117, 122, 125, 129, 131, 137, 139, 145, 147, 152, 155, 160, 162, 166, 168, 171, 172, 176, 176, 179, 179, 181, 181, 182, 182, 181, 182, 179, 181, 178, 179, 177, 177, 176, 174, 174, 170, 170, 168, 164, 163, 160, 157, 154, 152, 148, 142, 140, 136, 132, 129, 123, 121, 117, 111, 109, 104, 102, 99, 96, 93, 91, 87, 86, 84, 83, 79, 79, 78, 76, 76, 73, 73, 72, 73, 73, 73, 73, 73, 76, 77, 77, 79, 80, 84, 86, 87, 91, 93, 96, 100, 101, 106, 107, 111, 113, 117, 118, 122, 125, 128, 131, 133, 136, 140, 142, 146, 148, 153, 156, 159, 161, 166, 167, 170, 172, 174, 177, 177, 179, 179, 181, 181, 181, 181, 178, 179, 177, 176, 175, 172, 171, 169, 168, 164, 162, 162, 159, 157, 155, 152, 151, 146, 145, 140, 139, 134, 132, 128, 125, 119, 117, 113, 110, 107, 102, 100, 95, 93, 89, 88, 85, 84, 80, 80, 78, 78, 77, 77, 77, 76, 77, 77, 78, 77, 79, 79, 80, 80, 83, 85, 85, 87, 89, 91, 94, 95, 99, 100, 104, 106, 110, 113, 115, 119, 122, 126, 129, 131, 136, 137, 141, 144, 146, 149, 151, 155, 157, 159, 162, 164, 166, 168, 168, 171, 171, 174, 174, 176, 176, 177, 176, 177, 176, 176, 174, 174, 172, 171, 169, 168, 164, 163, 160, 157, 155, 152, 149, 146, 145, 141, 138, 136, 133, 129, 128, 123, 121, 117, 115, 113, 108, 106, 102, 101, 98, 94, 93, 89, 88, 85, 84, 81, 81, 79, 79, 79, 77, 78, 77, 79, 78, 80, 80, 83, 83, 85, 85, 87, 88, 89, 93, 94, 98, 99, 102, 104, 106, 109, 111, 115, 117, 122, 123, 128, 131, 134, 138, 140, 144, 147, 149, 153, 155, 159, 161, 162, 166, 167, 169, 169, 171, 172, 171, 174, 174, 172, 174, 172, 172, 172, 170, 170, 169, 167, 167, 164, 164, 161, 161, 159, 155, 154, 151, 149, 146, 145, 142, 138, 137, 133, 131, 128, 124, 122, 118, 116, 113, 110, 107, 103, 102, 99, 96, 93, 92, 89, 88, 85, 85, 83, 83, 80, 81, 81, 80, 81, 80, 81, 81, 84, 85, 85, 87, 87, 91, 91, 94, 95, 98, 100, 101, 104, 106, 109, 111, 113, 116, 117, 122, 123, 126, 130, 132, 133, 138, 139, 142, 146, 148, 149, 153, 154, 157, 159, 162, 163, 166, 167, 168, 169, 170, 170, 171, 170, 171, 170, 169, 170, 168, 169, 167, 167, 164, 163, 161, 161, 157, 157, 155, 152, 151, 147, 146, 142, 141, 139, 134, 133, 130, 128, 124, 122, 119, 115, 114, 109, 108, 104, 103, 100, 96, 96, 93, 92, 89, 88, 86, 86, 84, 84, 83, 83, 83, 81, 83, 84, 83, 85, 84, 86, 87, 88, 91, 91, 94, 94, 98, 99, 102, 104, 106, 109, 110, 114, 116, 118, 122, 124, 126, 130, 132, 134, 138, 140, 142, 145, 147, 149, 152, 154, 156, 159, 161, 162, 162, 166, 166, 168, 168, 168, 170, 170, 170, 169, 170, 169, 169, 167, 168, 166, 163, 163, 161, 160, 157, 156, 153, 152, 148, 147, 144, 142, 138, 137, 133, 131, 129, 125, 123, 119, 118, 115, 113, 110, 108, 106, 102, 101, 98, 96, 94, 93, 91, 89, 87, 87, 86, 86, 85, 84, 85, 84, 85, 85, 86, 86, 88, 88, 91, 92, 94, 95, 95, 99, 99, 101, 104, 104, 108, 109, 113, 115, 116, 119, 121, 124, 125, 130, 132, 133, 138, 139, 142, 146, 147, 151, 153, 154, 157, 159, 161, 163, 164, 164, 167, 168, 168, 168, 167, 168, 167, 168, 166, 167, 166, 163, 163, 161, 161, 159, 159, 156, 155, 154, 152, 149, 148, 146, 145, 141, 140, 138, 134, 132, 130, 126, 124, 121, 119, 116, 113, 111, 107, 106, 103, 100, 99, 96, 94, 93, 91, 91, 88, 88, 87, 87, 86, 86, 85, 86, 85, 87, 87, 87, 88, 88, 91, 91, 93, 93, 96, 98, 100, 100, 103, 104, 108, 109, 113, 114, 118, 121, 122, 125, 126, 131, 133, 134, 138, 139, 144, 145, 148, 151, 152, 154, 156, 157, 160, 161, 163, 164, 164, 167, 166, 168, 167, 168, 167, 167, 166, 166, 163, 163, 161, 161, 159, 157, 155, 154, 152, 151, 148, 147, 145, 144, 140, 139, 137, 136, 132, 132, 129, 128, 125, 122, 121, 117, 116, 113, 109, 108, 104, 103, 101, 98, 96, 93, 92, 91, 88, 88, 86, 86, 85, 86, 85, 86, 85, 87, 87, 88, 88, 91, 91, 94, 94, 96, 99, 99, 102, 103, 104, 108, 110, 113, 115, 117, 118, 122, 123, 126, 129, 132, 133, 138, 139, 142, 145, 146, 149, 151, 154, 154, 157, 157, 160, 160, 162, 163, 162, 164, 164, 163, 164, 164, 163, 164, 163, 163, 162, 162, 160, 161, 159, 159, 155, 155, 154, 151, 149, 147, 146, 144, 139, 138, 134, 133, 129, 128, 123, 122, 119, 116, 113, 111, 108, 107, 104, 102, 101, 99, 99, 96, 94, 94, 93, 93, 91, 92, 91, 89, 91, 89, 91, 89, 91, 91, 92, 92, 94, 93, 95, 95, 98, 100, 100, 102, 104, 106, 108, 109, 113, 115, 115, 118, 119, 123, 124, 128, 130, 131, 134, 136, 140, 141, 145, 145, 148, 149, 153, 155, 155, 159, 159, 161, 161, 163, 164, 164, 164, 166, 164, 164, 164, 164, 163, 161, 161, 160, 159, 157, 155, 155, 153, 152, 151, 147, 147, 144, 144, 141, 139, 137, 136, 132, 131, 129, 125, 123, 119, 118, 116, 111, 110, 108, 106, 103, 100, 99, 96, 95, 93, 91, 91, 89, 89, 88, 89, 88, 89, 89, 91, 91, 92, 93, 93, 94, 95, 96, 96, 99, 99, 102, 103, 103, 107, 108, 109, 111, 113, 116, 118, 119, 123, 124, 128, 130, 131, 136, 137, 140, 142, 144, 147, 148, 152, 153, 155, 157, 157, 160, 160, 162, 163, 164, 163, 164, 163, 164, 164, 163, 163, 162, 162, 160, 160, 157, 157, 155, 153, 153, 149, 148, 147, 144, 142, 140, 139, 136, 134, 132, 129, 129, 125, 123, 122, 118, 117, 114, 114, 110, 109, 107, 106, 102, 102, 99, 99, 96, 95, 93, 94, 92, 92, 92, 89, 91, 89, 91, 91, 92, 93, 92, 94, 94, 96, 96, 99, 99, 102, 102, 104, 106, 108, 109, 111, 113, 116, 117, 119, 122, 124, 125, 129, 130, 133, 134, 138, 140, 141, 145, 146, 149, 151, 153, 154, 156, 157, 160, 161, 160, 162, 162, 163, 162, 163, 162, 163, 162, 162, 161, 161, 159, 159, 156, 156, 154, 154, 152, 151, 148, 147, 144, 144, 141, 138, 137, 133, 132, 130, 126, 125, 122, 121, 117, 116, 113, 111, 108, 108, 104, 103, 102, 99, 99, 98, 95, 95, 93, 92, 93, 91, 92, 91, 92, 91, 91, 92, 92, 93, 93, 94, 96, 96, 99, 100, 100, 103, 104, 104, 108, 109, 111, 113, 116, 117, 118, 122, 123, 126, 128, 131, 132, 136, 137, 140, 141, 145, 147, 147, 151, 153, 154, 154, 157, 157, 160, 160, 160, 161, 162, 162, 162, 161, 162, 160, 161, 160, 159, 159, 157, 156, 155, 154, 153, 151, 151, 148, 147, 145, 144, 141, 140, 139, 137, 133, 132, 129, 128, 124, 123, 119, 118, 115, 113, 111, 108, 107, 103, 103, 100, 99, 96, 96, 95, 93, 93, 91, 92, 89, 91, 91, 89, 92, 92, 92, 94, 94, 96, 96, 99, 99, 101, 102, 104, 104, 108, 108, 110, 113, 113, 116, 116, 119, 121, 123, 123, 126, 129, 131, 132, 133, 137, 139, 141, 144, 145, 147, 149, 152, 153, 155, 155, 157, 157, 160, 161, 161, 162, 162, 161, 162, 161, 161, 159, 160, 157, 157, 155, 156, 154, 152, 152, 151, 148, 147, 146, 144, 142, 140, 139, 136, 134, 132, 131, 128, 126, 123, 122, 119, 116, 115, 111, 111, 109, 106, 106, 102, 102, 99, 99, 96, 96, 94, 95, 93, 93, 93, 92, 93, 93, 92, 93, 93, 94, 94, 96, 98, 99, 100, 101, 102, 102, 106, 106, 109, 109, 113, 113, 116, 117, 119, 121, 123, 126, 128, 129, 132, 133, 136, 138, 139, 142, 144, 146, 147, 149, 152, 152, 155, 155, 157, 157, 160, 159, 161, 160, 161, 161, 160, 161, 160, 160, 159, 159, 157, 156, 154, 154, 153, 151, 151, 148, 147, 146, 144, 142, 140, 137, 137, 134, 131, 130, 126, 125, 122, 121, 117, 116, 113, 111, 109, 108, 104, 104, 101, 101, 99, 99, 96, 96, 95, 94, 94, 93, 94, 93, 92, 93, 93, 94, 93, 95, 95, 95, 98, 98, 100, 101, 102, 103, 106, 107, 109, 110, 113, 114, 117, 117, 121, 122, 125, 128, 129, 132, 133, 136, 138, 140, 141, 144, 145, 147, 148, 151, 152, 154, 154, 156, 156, 159, 159, 160, 160, 161, 161, 161, 160, 161, 160, 160, 157, 159, 156, 156, 154, 154, 152, 151, 148, 148, 145, 145, 142, 141, 139, 137, 136, 132, 131, 130, 126, 125, 122, 121, 116, 115, 111, 110, 108, 104, 103, 101, 100, 96, 96, 95, 93, 93, 92, 92, 91, 92, 92, 91, 92, 92, 93, 93, 95, 95, 96, 98, 98, 100, 102, 102, 104, 106, 107, 109, 110, 113, 114, 116, 117, 121, 122, 125, 126, 130, 132, 133, 137, 138, 140, 142, 144, 147, 148, 151, 151, 153, 153, 156, 157, 157, 159, 160, 160, 161, 160, 161, 161, 160, 161, 160, 160, 159, 159, 156, 156, 154, 154, 152, 151, 148, 147, 145, 144, 140, 139, 138, 134, 133, 131, 128, 128, 125, 122, 121, 117, 117, 115, 113, 111, 109, 106, 106, 102, 101, 101, 98, 98, 95, 95, 94, 94, 92, 93, 91, 92, 92, 92, 93, 93, 94, 94, 96, 96, 99, 99, 101, 101, 104, 104, 108, 109, 110, 114, 114, 117, 119, 121, 124, 125, 126, 130, 131, 134, 136, 139, 140, 142, 145, 146, 148, 148, 152, 152, 154, 155, 155, 157, 156, 159, 160, 159, 160, 159, 161, 159, 160, 159, 160, 159, 157, 157, 155, 155, 153, 153, 151, 149, 148, 145, 144, 141, 140, 138, 134, 133, 130, 130, 126, 125, 122, 121, 118, 116, 115, 111, 110, 108, 107, 104, 103, 102, 101, 99, 99, 98, 95, 95, 93, 94, 92, 92, 93, 92, 93, 94, 94, 95, 94, 96, 96, 99, 99, 101, 103, 103, 107, 107, 109, 111, 113, 114, 117, 117, 121, 122, 125, 125, 129, 130, 133, 134, 137, 139, 140, 144, 146, 147, 149, 151, 153, 154, 154, 157, 156, 159, 160, 159, 161, 160, 161, 160, 160, 159, 160, 157, 159, 156, 156, 154, 154, 153, 151, 151, 149, 146, 146, 142, 142, 139, 138, 136, 134, 131, 130, 126, 125, 122, 121, 118, 117, 114, 113, 109, 109, 106, 104, 102, 102, 99, 99, 98, 95, 95, 95, 93, 94, 92, 93, 93, 93, 93, 93, 94, 95, 95, 96, 98, 99, 100, 102, 103, 104, 107, 107, 110, 110, 114, 114, 117, 119, 121, 123, 124, 128, 128, 131, 133, 136, 137, 138, 141, 142, 145, 146, 149, 149, 153, 153, 155, 155, 157, 159, 160, 161, 161, 160, 161, 160, 161, 160, 160, 159, 159, 156, 156, 155, 154, 153, 149, 149, 147, 146, 144, 142, 140, 139, 137, 136, 133, 132, 129, 129, 126, 123, 122, 118, 118, 115, 114, 111, 110, 108, 106, 104, 102, 101, 100, 99, 96, 96, 94, 94, 93, 93, 92, 93, 92, 93, 93, 94, 94, 94, 96, 96, 99, 99, 101, 101, 103, 106, 106, 109, 109, 113, 115, 115, 118, 119, 123, 125, 126, 130, 132, 132, 136, 137, 139, 141, 142, 146, 147, 148, 151, 152, 154, 154, 156, 157, 157, 160, 159, 161, 160, 161, 160, 161, 160, 161, 161, 159, 159, 157, 157, 155, 154, 152, 151, 149, 147, 146, 144, 141, 140, 137, 136, 132, 132, 129, 128, 124, 123, 119, 119, 117, 114, 113, 111, 108, 108, 106, 103, 102, 100, 100, 98, 98, 95, 95, 93, 94, 93, 92, 93, 92, 93, 93, 94, 93, 95, 96, 96, 99, 100, 100, 102, 103, 104, 107, 109, 109, 113, 114, 116, 117, 121, 121, 124, 126, 128, 130, 131, 134, 136, 139, 139, 142, 144, 146, 147, 149, 151, 153, 154, 154, 156, 156, 159, 157, 160, 159, 161, 161, 161, 161, 160, 160, 160, 159, 159, 156, 156, 154, 154, 152, 151, 149, 148, 146, 144, 140, 140, 137, 136, 132, 131, 128, 126, 124, 122, 118, 117, 114, 113, 111, 109, 108, 106, 104, 103, 101, 101, 100, 98, 99, 96, 96, 94, 95, 94, 94, 94, 94, 92, 94, 93, 94, 93, 94, 96, 96, 99, 99, 101, 103, 104, 107, 108, 110, 111, 115, 117, 118, 122, 123, 125, 129, 129, 132, 134, 137, 137, 140, 140, 144, 145, 146, 148, 149, 152, 153, 154, 154, 156, 156, 159, 159, 161, 161, 161, 162, 162, 160, 161, 160, 160, 159, 156, 156, 154, 154, 152, 151, 148, 147, 145, 144, 141, 140, 137, 136, 133, 132, 129, 128, 126, 124, 122, 119, 117, 116, 114, 110, 110, 107, 106, 104, 102, 101, 99, 99, 98, 95, 96, 95, 95, 94, 94, 93, 94, 93, 94, 93, 94, 95, 94, 96, 98, 98, 100, 100, 102, 103, 106, 107, 109, 110, 114, 116, 117, 119, 121, 124, 125, 129, 130, 133, 134, 138, 138, 141, 141, 145, 146, 147, 149, 149, 152, 154, 154, 156, 156, 159, 159, 159, 161, 160, 161, 161, 161, 160, 161, 159, 160, 157, 157, 155, 155, 152, 152, 149, 148, 145, 145, 142, 140, 138, 137, 134, 133, 131, 128, 126, 124, 123, 121, 118, 117, 114, 113, 110, 109, 106, 106, 103, 101, 100, 98, 98, 96, 94, 94, 92, 93, 92, 92, 91, 93, 92, 93, 94, 94, 95, 96, 98, 99, 99, 102, 102, 104, 107, 107, 110, 111, 113, 115, 116, 119, 121, 124, 124, 128, 130, 131, 134, 137, 138, 141, 142, 144, 147, 148, 148, 152, 153, 153, 155, 155, 157, 157, 159, 157, 160, 159, 160, 160, 159, 160, 160, 157, 159, 156, 156, 154, 155, 152, 152, 151, 148, 147, 144, 144, 140, 139, 137, 136, 133, 130, 130, 126, 125, 123, 121, 119, 116, 116, 114, 110, 110, 108, 106, 104, 102, 102, 99, 99, 96, 96, 95, 94, 94, 93, 92, 93, 92, 93, 93, 94, 93, 95, 95, 98, 98, 100, 100, 102, 104, 104, 108, 108, 111, 111, 114, 116, 117, 121, 122, 124, 125, 129, 130, 133, 134, 138, 140, 140, 144, 145, 148, 148, 152, 152, 154, 154, 156, 156, 159, 157, 160, 159, 160, 159, 160, 159, 160, 157, 159, 156, 157, 155, 155, 155, 153, 153, 151, 149, 148, 146, 145, 141, 141, 139, 137, 133, 132, 129, 128, 125, 123, 121, 118, 116, 114, 113, 109, 109, 106, 106, 103, 102, 100, 100, 98, 98, 95, 96, 95, 94, 94, 93, 93, 94, 93, 94, 94, 94, 96, 95, 98, 98, 100, 100, 102, 103, 106, 108, 108, 111, 111, 115, 116, 118, 119, 123, 123, 126, 129, 130, 133, 134, 136, 139, 140, 144, 145, 147, 147, 151, 151, 154, 155, 156, 156, 159, 157, 160, 159, 160, 161, 160, 160, 160, 160, 157, 157, 156, 156, 155, 153, 153, 151, 151, 147, 147, 146, 142, 142, 141, 138, 137, 134, 133, 130, 129, 126, 125, 123, 121, 118, 115, 114, 111, 110, 107, 107, 103, 103, 100, 100, 99, 96, 96, 95, 95, 93, 94, 94, 92, 93, 93, 94, 94, 94, 95, 95, 98, 96, 98, 100, 101, 103, 104, 106, 108, 108, 111, 113, 115, 117, 118, 121, 122, 125, 126, 130, 131, 133, 137, 137, 140, 142, 144, 147, 149, 149, 153, 153, 156, 156, 159, 159, 161, 161, 161, 162, 161, 162, 161, 161, 160, 160, 157, 157, 155, 155, 154, 152, 152, 148, 148, 146, 146, 142, 142, 141, 138, 138, 134, 134, 131, 130, 128, 126, 124, 121, 119, 116, 116, 113, 111, 109, 106, 104, 102, 100, 100, 98, 98, 95, 95, 93, 93, 92, 93, 92, 93, 93, 92, 94, 93, 95, 95, 96, 98, 99, 100, 100, 103, 103, 106, 107, 109, 110, 114, 115, 116, 119, 121, 123, 124, 128, 129, 132, 132, 136, 137, 140, 141, 142, 146, 146, 149, 151, 152, 154, 154, 156, 156, 159, 159, 160, 161, 160, 161, 160, 161, 160, 160, 160, 157, 157, 155, 155, 153, 153, 151, 151, 147, 147, 145, 144, 141, 140, 138, 137, 134, 132, 130, 129, 125, 124, 122, 118, 117, 114, 113, 110, 109, 106, 104, 102, 102, 99, 99, 96, 96, 94, 95, 93, 94, 93, 94, 93, 94, 93, 95, 95, 95, 96, 98, 98, 99, 99, 101, 102, 103, 106, 107, 107, 110, 110, 114, 115, 118, 118, 122, 123, 125, 129, 130, 133, 134, 138, 139, 141, 144, 146, 147, 147, 151, 151, 153, 153, 155, 156, 156, 157, 157, 159, 159, 160, 159, 160, 160, 159, 160, 157, 159, 157, 155, 156, 155, 153, 152, 149, 149, 146, 146, 142, 141, 139, 137, 136, 133, 131, 129, 126, 124, 122, 119, 116, 116, 113, 111, 108, 108, 106, 104, 103, 100, 100, 98, 98, 95, 95, 95, 94, 94, 94, 94, 93, 94, 93, 95, 94, 95, 96, 96, 99, 100, 100, 102, 102, 106, 107, 107, 110, 111, 113, 115, 116, 119, 121, 122, 125, 126, 130, 131, 133, 134, 138, 139, 142, 144, 146, 148, 148, 152, 152, 154, 154, 156, 157, 159, 160, 160, 160, 160, 161, 159, 160, 159, 160, 157, 157, 157, 156, 154, 154, 153, 151, 151, 147, 147, 145, 144, 141, 140, 139, 137, 134, 132, 131, 128, 126, 124, 122, 119, 116, 115, 114, 110, 109, 106, 106, 102, 102, 100, 99, 98, 95, 95, 94, 94, 93, 93, 92, 92, 93, 92, 94, 93, 95, 95, 95, 98, 99, 99, 101, 101, 104, 106, 106, 109, 109, 111, 115, 115, 118, 121, 122, 125, 125, 129, 130, 133, 134, 137, 139, 140, 144, 145, 147, 148, 151, 152, 152, 154, 154, 156, 157, 157, 159, 159, 160, 160, 160, 161, 161, 159, 160, 159, 159, 159, 156, 156, 154, 154, 153, 149, 149, 147, 145, 144, 140, 140, 138, 134, 133, 131, 129, 125, 124, 121, 119, 117, 114, 113, 110, 108, 107, 103, 103, 101, 100, 99, 96, 96, 94, 94, 93, 93, 93, 92, 93, 93, 93, 94, 94, 94, 95, 95, 98, 98, 100, 100, 102, 103, 106, 106, 109, 109, 113, 113, 116, 116, 119, 122, 124, 126, 126, 130, 132, 134, 137, 138, 141, 144, 145, 146, 149, 149, 153, 154, 154, 156, 156, 157, 157, 160, 159, 160, 159, 160, 159, 160, 159, 159, 159, 156, 157, 155, 155, 154, 152, 152, 149, 149, 146, 146, 145, 141, 140, 138, 137, 133, 132, 129, 128, 124, 123, 121, 118, 116, 114, 110, 110, 107, 106, 104, 102, 101, 100, 99, 96, 96, 94, 94, 94, 92, 93, 92, 93, 92, 93, 93, 94, 94, 95, 96, 98, 99, 100, 102, 103, 104, 106, 108, 109, 111, 113, 115, 116, 119, 121, 124, 125, 126, 130, 131, 134, 136, 138, 139, 142, 145, 146, 147, 149, 151, 153, 153, 155, 155, 157, 159, 157, 160, 159, 160, 159, 160, 159, 160, 157, 159, 156, 157, 155, 154, 154, 152, 152, 149, 149, 147, 147, 144, 144, 140, 139, 138, 134, 133, 130, 129, 126, 124, 122, 119, 117, 114, 113, 110, 109, 107, 104, 103, 102, 100, 99, 96, 98, 95, 95, 94, 94, 93, 93, 92, 93, 92, 94, 93, 94, 94, 96, 95, 98, 98, 100, 101, 103, 106, 107, 108, 110, 111, 115, 116, 119, 121, 123, 124, 128, 129, 132, 133, 136, 137, 140, 140, 144, 145, 146, 148, 149, 152, 153, 153, 155, 155, 157, 157, 159, 160, 160, 160, 160, 159, 160, 159, 159, 159, 156, 156, 154, 154, 153, 151, 151, 148, 147, 146, 145, 141, 141, 139, 136, 136, 132, 131, 130, 126, 125, 123, 121, 119, 117, 114, 113, 109, 109, 106, 104, 103, 102, 100, 99, 98, 96, 94, 95, 93, 94, 93, 94, 93, 94, 93, 93, 95, 94, 96, 96, 99, 99, 101, 101, 103, 103, 107, 107, 110, 110, 114, 116, 116, 119, 122, 123, 126, 128, 131, 133, 133, 137, 138, 141, 142, 145, 146, 148, 148, 152, 152, 153, 155, 155, 156, 157, 159, 157, 159, 157, 160, 160, 159, 159, 157, 157, 156, 156, 154, 154, 152, 152, 149, 149, 147, 146, 145, 142, 141, 139, 138, 136, 134, 132, 129, 128, 126, 124, 122, 118, 117, 115, 114, 111, 108, 108, 104, 104, 101, 101, 99, 99, 96, 96, 94, 95, 93, 94, 93, 94, 94, 93, 95, 94, 95, 95, 96, 99, 98, 100, 100, 102, 103, 106, 106, 109, 109, 113, 113, 116, 118, 121, 122, 125, 126, 130, 131, 134, 137, 137, 140, 142, 144, 147, 147, 151, 151, 153, 154, 154, 156, 156, 157, 157, 159, 160, 159, 160, 159, 160, 160, 159, 157, 157, 156, 156, 154, 155, 152, 152, 149, 149, 147, 146, 142, 142, 139, 138, 136, 133, 132, 129, 128, 125, 123, 121, 117, 117, 114, 113, 111, 108, 108, 106, 103, 102, 100, 100, 98, 98, 95, 96, 94, 94, 94, 93, 94, 94, 93, 94, 94, 95, 96, 98, 98, 100, 100, 102, 102, 104, 106, 107, 109, 110, 113, 114, 116, 117, 121, 121, 124, 125, 129, 130, 133, 133, 137, 139, 141, 142, 146, 146, 148, 151, 152, 154, 154, 156, 156, 159, 157, 160, 159, 160, 160, 159, 160, 159, 159, 157, 157, 156, 156, 154, 154, 153, 152, 149, 149, 147, 146, 144, 142, 140, 139, 136, 134, 131, 130, 128, 126, 124, 121, 119, 116, 115, 111, 111, 108, 108, 104, 104, 102, 101, 99, 99, 96, 98, 95, 95, 94, 94, 93, 94, 93, 94, 93, 94, 95, 95, 96, 95, 98, 99, 100, 101, 103, 103, 107, 108, 110, 113, 115, 117, 118, 119, 123, 125, 126, 129, 130, 133, 134, 137, 139, 141, 142, 144, 147, 147, 151, 151, 153, 154, 155, 157, 156, 159, 159, 160, 161, 160, 161, 160, 161, 159, 160, 159, 156, 156, 154, 154, 152, 152, 148, 148, 147, 144, 142, 140, 139, 137, 136, 132, 132, 129, 128, 124, 124, 121, 119, 117, 115, 114, 110, 110, 108, 106, 104, 102, 102, 101, 99, 99, 98, 95, 96, 95, 95, 94, 95, 94, 95, 94, 96, 95, 98, 98, 98, 100, 100, 100, 102, 103, 106, 107, 107, 110, 110, 114, 116, 116, 119, 121, 124, 126, 128, 131, 132, 134, 137, 138, 141, 141, 145, 146, 147, 149, 149, 152, 154, 153, 155, 155, 157, 157, 156, 159, 157, 159, 159, 157, 159, 157, 157, 155, 155, 154, 154, 152, 152, 151, 148, 146, 146, 142, 142, 139, 139, 137, 134, 133, 130, 130, 126, 125, 123, 119, 119, 116, 115, 111, 111, 108, 108, 104, 104, 102, 101, 99, 99, 98, 98, 95, 96, 96, 94, 95, 94, 95, 95, 96, 95, 98, 98, 99, 99, 101, 101, 103, 103, 106, 106, 109, 109, 111, 113, 115, 117, 119, 121, 122, 125, 128, 130, 131, 133, 136, 138, 139, 141, 144, 145, 147, 148, 149, 151, 152, 154, 153, 155, 155, 156, 156, 157, 157, 159, 157, 159, 159, 157, 157, 157, 156, 154, 155, 153, 153, 151, 151, 147, 147, 145, 144, 142, 140, 138, 136, 134, 132, 130, 126, 125, 123, 122, 118, 117, 115, 114, 111, 109, 107, 107, 103, 103, 101, 101, 99, 99, 96, 96, 95, 96, 95, 94, 95, 95, 95, 96, 95, 98, 96, 99, 99, 101, 102, 102, 104, 104, 107, 108, 109, 111, 111, 115, 116, 117, 121, 121, 124, 125, 128, 129, 132, 133, 137, 137, 140, 142, 144, 146, 148, 148, 151, 152, 154, 155, 154, 156, 157, 157, 159, 157, 159, 157, 157, 159, 157, 157, 156, 155, 156, 154, 154, 152, 152, 149, 148, 146, 146, 144, 141, 140, 137, 136, 133, 132, 129, 128, 124, 123, 122, 118, 117, 114, 114, 111, 109, 108, 106, 106, 103, 103, 101, 101, 99, 99, 98, 98, 96, 98, 95, 96, 96, 95, 96, 98, 96, 98, 98, 99, 99, 101, 101, 103, 104, 104, 107, 108, 110, 110, 114, 115, 117, 119, 122, 123, 124, 128, 129, 132, 133, 136, 138, 140, 141, 142, 146, 147, 148, 151, 152, 153, 153, 154, 155, 156, 155, 157, 156, 157, 157, 156, 157, 156, 155, 156, 155, 154, 154, 152, 152, 151, 149, 148, 147, 145, 145, 142, 141, 138, 138, 134, 133, 131, 130, 126, 125, 123, 121, 119, 116, 116, 113, 111, 109, 109, 106, 106, 104, 102, 102, 100, 100, 99, 98, 98, 96, 98, 96, 95, 96, 95, 96, 96, 98, 99, 98, 100, 100, 101, 101, 104, 106, 106, 108, 110, 110, 114, 116, 116, 119, 121, 123, 124, 128, 129, 130, 133, 133, 137, 138, 140, 142, 142, 145, 146, 148, 148, 151, 152, 153, 153, 155, 154, 156, 155, 157, 156, 157, 156, 157, 155, 156, 156, 155, 153, 154, 152, 151, 151, 148, 147, 145, 145, 141, 141, 139, 138, 134, 134, 132, 131, 129, 126, 125, 123, 121, 118, 117, 115, 113, 111, 108, 108, 106, 104, 103, 101, 101, 99, 99, 99, 96, 98, 96, 98, 95, 98, 96, 96, 98, 98, 99, 99, 100, 102, 102, 104, 104, 107, 107, 109, 111, 113, 114, 116, 118, 118, 122, 122, 125, 125, 129, 129, 132, 133, 136, 137, 139, 140, 142, 144, 145, 147, 148, 149, 149, 152, 152, 153, 154, 153, 155, 155, 156, 156, 155, 156, 156, 155, 155, 154, 153, 153, 151, 151, 148, 148, 146, 146, 145, 144, 140, 140, 138, 137, 134, 133, 131, 130, 128, 126, 124, 123, 121, 118, 116, 115, 113, 111, 109, 108, 107, 104, 103, 101, 101, 100, 99, 99, 96, 98, 98, 95, 96, 96, 98, 98, 98, 99, 99, 100, 100, 102, 103, 103, 106, 106, 108, 109, 110, 113, 113, 116, 117, 118, 122, 123, 124, 128, 128, 131, 133, 133, 137, 139, 139, 142, 144, 145, 147, 147, 149, 149, 152, 152, 154, 153, 155, 155, 154, 156, 155, 156, 155, 155, 154, 155, 154, 154, 153, 153, 152, 149, 149, 148, 147, 145, 144, 141, 140, 139, 136, 134, 133, 130, 129, 128, 124, 123, 121, 119, 116, 116, 113, 113, 110, 110, 108, 106, 106, 103, 103, 101, 102, 100, 100, 99, 99, 98, 98, 98, 96, 98, 96, 99, 99, 98, 100, 100, 102, 102, 104, 104, 107, 107, 110, 110, 113, 115, 115, 118, 119, 122, 123, 125, 128, 128, 131, 131, 133, 136, 137, 139, 140, 142, 144, 146, 146, 148, 149, 151, 152, 153, 153, 155, 154, 155, 156, 155, 156, 156, 154, 155, 153, 154, 152, 153, 151, 151, 148, 148, 146, 146, 144, 144, 141, 140, 139, 137, 136, 133, 132, 130, 128, 128, 124, 123, 122, 118, 117, 116, 113, 113, 109, 109, 108, 104, 104, 102, 102, 102, 100, 100, 99, 99, 98, 99, 99, 98, 99, 98, 99, 98, 100, 99, 100, 101, 101, 103, 103, 106, 106, 108, 109, 110, 113, 115, 115, 118, 119, 122, 123, 126, 128, 130, 131, 134, 136, 138, 138, 141, 141, 145, 145, 147, 148, 148, 151, 151, 153, 154, 154, 155, 156, 155, 156, 155, 156, 156, 155, 156, 154, 154, 153, 153, 151, 151, 148, 148, 146, 145, 142, 141, 139, 139, 136, 136, 133, 132, 130, 129, 126, 125, 124, 123, 119, 119, 116, 116, 113, 113, 110, 109, 107, 106, 103, 103, 101, 101, 99, 100, 98, 99, 98, 98, 98, 98, 98, 99, 98, 99, 99, 101, 100, 101, 103, 103, 106, 106, 108, 108, 111, 111, 114, 115, 117, 118, 122, 122, 125, 126, 130, 130, 133, 134, 137, 138, 140, 141, 144, 145, 146, 148, 148, 149, 149, 152, 151, 153, 153, 153, 154, 153, 154, 153, 154, 154, 153, 154, 153, 152, 153, 151, 152, 149, 149, 147, 147, 146, 144, 144, 141, 139, 138, 136, 134, 131, 130, 128, 126, 123, 122, 119, 118, 116, 115, 114, 110, 110, 108, 107, 106, 103, 103, 102, 102, 101, 99, 100, 99, 99, 99, 98, 99, 99, 98, 100, 100, 99, 101, 101, 103, 102, 104, 106, 106, 109, 109, 111, 113, 114, 116, 117, 119, 121, 122, 124, 126, 128, 129, 131, 132, 134, 136, 138, 139, 141, 142, 145, 146, 146, 148, 148, 151, 152, 153, 152, 154, 153, 155, 155, 154, 155, 153, 154, 153, 153, 152, 152, 151, 149, 149, 147, 147, 145, 145, 142, 142, 141, 138, 138, 136, 134, 132, 131, 130, 126, 125, 123, 122, 121, 117, 117, 114, 114, 110, 110, 108, 108, 106, 103, 104, 102, 102, 101, 101, 100, 100, 99, 100, 99, 100, 100, 99, 101, 100, 102, 101, 103, 102, 103, 106, 106, 108, 108, 110, 110, 114, 115, 115, 118, 119, 122, 122, 125, 126, 129, 130, 132, 132, 136, 136, 139, 139, 142, 144, 144, 146, 146, 148, 148, 151, 152, 153, 153, 153, 154, 154, 154, 155, 154, 153, 154, 153, 153, 152, 152, 149, 149, 149, 148, 145, 145, 144, 141, 141, 138, 138, 136, 134, 133, 131, 130, 129, 126, 125, 123, 122, 118, 118, 115, 115, 114, 110, 110, 109, 108, 106, 106, 103, 103, 101, 102, 100, 101, 100, 99, 100, 99, 100, 99, 100, 100, 101, 101, 102, 102, 104, 106, 107, 107, 109, 109, 111, 113, 114, 116, 116, 119, 119, 123, 124, 126, 128, 130, 131, 134, 134, 138, 138, 141, 141, 144, 144, 147, 147, 149, 148, 151, 151, 152, 153, 152, 153, 153, 154, 153, 154, 153, 153, 152, 153, 152, 151, 151, 148, 149, 148, 146, 146, 144, 144, 141, 140, 138, 138, 134, 134, 132, 130, 129, 125, 125, 122, 122, 118, 118, 115, 115, 113, 110, 110, 107, 107, 104, 104, 103, 103, 101, 102, 101, 100, 101, 100, 101, 100, 101, 101, 100, 101, 102, 101, 103, 102, 104, 104, 107, 107, 109, 109, 111, 113, 114, 114, 117, 117, 121, 121, 124, 125, 128, 129, 131, 133, 136, 137, 138, 140, 141, 144, 144, 146, 147, 147, 149, 149, 151, 151, 152, 153, 152, 153, 153, 152, 153, 152, 153, 151, 152, 152, 149, 149, 148, 148, 146, 146, 144, 144, 142, 140, 140, 137, 137, 134, 132, 132, 129, 129, 126, 125, 123, 122, 119, 118, 116, 116, 113, 113, 110, 109, 109, 107, 107, 104, 104, 103, 102, 101, 101, 100, 100, 99, 100, 100, 99, 101, 100, 102, 101, 103, 104, 104, 106, 106, 108, 109, 111, 111, 114, 114, 117, 118, 119, 121, 123, 123, 126, 126, 129, 130, 132, 133, 136, 136, 139, 139, 141, 142, 145, 145, 147, 148, 148, 149, 151, 151, 152, 151, 153, 152, 153, 152, 153, 153, 152, 152, 151, 151, 151, 148, 149, 147, 147, 145, 145, 142, 142, 139, 139, 136, 136, 132, 132, 129, 129, 126, 123, 123, 119, 119, 117, 115, 115, 114, 110, 110, 109, 109, 107, 107, 107, 104, 104, 103, 104, 102, 103, 102, 103, 101, 102, 101, 102, 103, 102, 103, 102, 104, 104, 104, 107, 107, 109, 110, 110, 113, 113, 116, 117, 119, 121, 122, 124, 125, 128, 129, 131, 132, 134, 136, 137, 139, 139, 142, 144, 144, 146, 146, 148, 147, 149, 149, 151, 151, 151, 152, 151, 152, 152, 152, 151, 151, 149, 149, 148, 148, 146, 147, 145, 145, 144, 144, 142, 140, 140, 138, 138, 134, 134, 132, 131, 129, 129, 125, 124, 122, 121, 119, 117, 115, 114, 111, 111, 108, 108, 106, 107, 104, 104, 103, 103, 103, 102, 103, 102, 103, 102, 102, 103, 103, 103, 104, 103, 106, 104, 107, 107, 107, 109, 109, 110, 111, 114, 114, 116, 116, 119, 121, 122, 124, 124, 128, 128, 131, 132, 133, 136, 136, 138, 139, 141, 141, 144, 144, 145, 145, 147, 148, 148, 149, 149, 151, 151, 149, 151, 151, 152, 151, 149, 151, 151, 151, 149, 148, 148, 147, 145, 145, 142, 142, 141, 139, 139, 138, 134, 134, 132, 131, 129, 129, 126, 125, 124, 121, 121, 117, 117, 116, 113, 113, 110, 110, 108, 108, 106, 106, 104, 103, 103, 102, 102, 102, 101, 102, 102, 101, 102, 101, 103, 102, 104, 103, 106, 106, 108, 108, 108, 110, 111, 111, 115, 115, 117, 117, 121, 121, 122, 125, 125, 129, 130, 130, 133, 133, 136, 137, 139, 139, 141, 141, 144, 145, 145, 147, 146, 148, 148, 148, 151, 149, 151, 151, 151, 152, 151, 152, 151, 151, 149, 151, 149, 149, 147, 147, 147, 146, 144, 144, 140, 140, 139, 136, 136, 132, 132, 129, 129, 126, 125, 123, 122, 118, 118, 116, 116, 114, 111, 111, 109, 109, 108, 108, 106, 107, 104, 104, 103, 104, 102, 103, 102, 103, 103, 102, 103, 102, 103, 102, 104, 104, 106, 106, 107, 108, 108, 110, 110, 113, 113, 115, 116, 118, 119, 122, 123, 124, 126, 128, 130, 132, 132, 136, 136, 138, 139, 141, 142, 142, 145, 145, 147, 147, 148, 148, 149, 149, 151, 151, 149, 151, 151, 149, 151, 149, 149, 148, 149, 147, 148, 147, 146, 145, 145, 142, 142, 140, 140, 139, 137, 137, 134, 133, 131, 131, 128, 128, 124, 124, 122, 119, 118, 116, 114, 114, 111, 110, 108, 108, 106, 106, 106, 103, 103, 102, 103, 101, 102, 101, 102, 101, 103, 102, 103, 103, 104, 104, 106, 107, 106, 108, 108, 108, 110, 110, 113, 113, 115, 115, 118, 118, 121, 122, 124, 125, 128, 129, 131, 132, 134, 137, 138, 139, 140, 142, 144, 144, 146, 146, 148, 147, 149, 148, 151, 149, 151, 149, 151, 149, 151, 151, 149, 151, 148, 149, 147, 148, 146, 146, 144, 144, 142, 142, 141, 139, 138, 137, 136, 133, 133, 130, 130, 128, 128, 124, 124, 122, 122, 118, 118, 116, 115, 113, 113, 111, 109, 109, 107, 107, 104, 106, 103, 104, 102, 103, 102, 103, 103, 102, 103, 103, 104, 103, 106, 104, 107, 107, 108, 108, 110, 110, 113, 113, 114, 115, 117, 118, 118, 121, 122, 123, 125, 125, 129, 129, 132, 132, 136, 136, 138, 140, 140, 142, 142, 145, 146, 147, 146, 148, 147, 149, 148, 149, 149, 148, 149, 148, 149, 149, 148, 149, 148, 148, 147, 147, 147, 146, 146, 144, 144, 141, 141, 139, 139, 137, 134, 133, 131, 131, 128, 128, 124, 124, 121, 121, 118, 117, 115, 115, 114, 111, 111, 109, 109, 108, 108, 106, 107, 106, 106, 104, 103, 104, 103, 104, 103, 104, 104, 104, 106, 104, 107, 107, 107, 109, 108, 110, 110, 113, 114, 113, 115, 115, 117, 118, 118, 121, 122, 123, 125, 125, 129, 129, 132, 132, 136, 136, 139, 139, 142, 144, 145, 145, 147, 147, 148, 148, 149, 149, 148, 149, 149, 148, 149, 147, 148, 148, 147, 147, 146, 147, 146, 145, 145, 145, 145, 144, 141, 141, 139, 139, 137, 137, 134, 132, 131, 129, 128, 124, 124, 122, 119, 118, 117, 115, 115, 113, 113, 113, 110, 110, 109, 109, 108, 109, 107, 108, 106, 107, 104, 104, 104, 103, 103, 102, 103, 102, 103, 103, 104, 106, 106, 108, 108, 110, 110, 114, 115, 115, 117, 118, 121, 121, 123, 123, 125, 125, 125, 128, 129, 129, 131, 132, 134, 137, 138, 141, 142, 146, 147, 151, 152, 154, 154, 156, 156, 157, 156, 156, 153, 152, 149, 146, 144, 139, 137, 134, 131, 129, 125, 125, 124, 125, 125, 128, 129, 133, 136, 140, 142, 148, 152, 155, 157, 160, 160, 161, 159, 159, 154, 151, 146, 140, 133, 126, 117, 111, 102, 95, 89, 83, 78, 72, 71, 68, 68, 66, 69, 70, 74, 77, 81, 85, 91, 95, 99, 103, 107, 110, 114, 115, 117, 117, 119, 118, 121, 119, 121, 119, 121, 121, 122, 122, 125, 126, 128, 132, 133, 137, 139, 142, 146, 147, 151, 152, 155, 156, 156, 157, 157, 159, 156, 157, 156, 156, 155, 154, 153, 153, 153, 152, 153, 153, 152, 154, 153, 154, 154, 155, 154, 154, 154, 152, 152, 149, 148, 146, 142, 140, 137, 134, 131, 128, 123, 121, 118, 115, 113, 109, 107, 106, 103, 102, 100, 100, 99, 99, 98, 96, 96, 95, 95, 94, 94, 94, 92, 93, 92, 92, 91, 92, 91, 93, 93, 94, 94, 96, 96, 100, 102, 102, 106, 108, 109, 113, 115, 118, 119, 123, 123, 126, 128, 130, 131, 133, 134, 137, 139, 140, 141, 141, 145, 146, 147, 147, 151, 151, 153, 153, 155, 155, 157, 156, 159, 159, 160, 160, 160, 159, 159, 159, 156, 157, 155, 155, 154, 152, 152, 149, 149, 147, 147, 146, 144, 144, 141, 141, 140, 138, 137, 134, 134, 131, 131, 130, 126, 126, 123, 123, 119, 119, 116, 116, 114, 111, 110, 108, 108, 104, 104, 102, 102, 101, 98, 98, 95, 95, 94, 92, 92, 89, 89, 89, 88, 88, 88, 89, 89, 91, 93, 93, 96, 98, 101, 103, 106, 110, 113, 115, 119, 122, 125, 128, 131, 132, 136, 136, 139, 140, 141, 141, 142, 141, 142, 142, 144, 142, 144, 142, 145, 144, 145, 146, 145, 147, 147, 148, 148, 149, 149, 151, 151, 149, 149, 147, 148, 146, 146, 142, 142, 140, 138, 138, 136, 134, 133, 131, 131, 130, 130, 130, 129, 130, 129, 130, 130, 131, 130, 131, 130, 131, 129, 130, 128, 129, 126, 126, 123, 123, 122, 119, 118, 116, 116, 114, 115, 113, 113, 113, 113, 113, 113, 113, 111, 113, 111, 113, 114, 113, 114, 114, 113, 114, 114, 115, 114, 115, 115, 115, 117, 117, 118, 118, 121, 123, 123, 125, 126, 129, 129, 131, 132, 134, 134, 134, 137, 136, 137, 136, 137, 136, 137, 134, 136, 133, 134, 133, 132, 132, 131, 132, 130, 131, 131, 130, 131, 129, 130, 130, 129, 130, 128, 129, 126, 128, 126, 125, 125, 123, 123, 122, 122, 119, 119, 118, 118, 118, 116, 117, 116, 117, 117, 116, 118, 117, 118, 118, 121, 119, 122, 122, 124, 124, 125, 125, 128, 128, 129, 129, 131, 131, 131, 132, 131, 132, 132, 133, 132, 133, 132, 133, 132, 133, 132, 134, 133, 136, 136, 136, 138, 138, 140, 141, 141, 144, 144, 146, 147, 146, 148, 147, 148, 146, 147, 145, 145, 142, 141, 139, 137, 136, 132, 132, 129, 129, 125, 125, 125, 123, 124, 122, 123, 123, 122, 123, 122, 123, 121, 121, 121, 117, 117, 114, 113, 110, 108, 103, 102, 98, 96, 94, 91, 89, 87, 88, 87, 88, 89, 91, 93, 94, 98, 100, 104, 106, 110, 111, 116, 117, 119, 121, 123, 122, 123, 122, 123, 121, 121, 119, 119, 119, 118, 119, 118, 121, 122, 125, 126, 131, 133, 138, 142, 146, 151, 154, 160, 163, 164, 169, 171, 172, 172, 172, 172, 170, 170, 167, 166, 162, 160, 157, 155, 153, 151, 147, 147, 145, 146, 146, 145, 146, 146, 147, 148, 147, 149, 148, 149, 147, 147, 145, 144, 140, 138, 133, 131, 126, 123, 117, 114, 108, 106, 101, 99, 94, 93, 91, 89, 88, 88, 88, 88, 89, 89, 92, 92, 94, 94, 95, 96, 95, 96, 95, 95, 94, 92, 92, 89, 89, 87, 87, 86, 86, 87, 86, 88, 91, 92, 95, 99, 101, 106, 109, 115, 118, 124, 126, 132, 136, 138, 142, 145, 148, 148, 151, 151, 153, 152, 153, 152, 153, 151, 152, 151, 153, 152, 154, 153, 155, 157, 159, 161, 161, 163, 166, 167, 169, 169, 171, 171, 170, 171, 169, 169, 167, 166, 162, 160, 156, 154, 152, 147, 145, 142, 139, 137, 133, 133, 131, 130, 129, 126, 128, 125, 125, 124, 124, 122, 122, 121, 117, 117, 114, 113, 108, 107, 103, 99, 98, 93, 92, 88, 85, 84, 81, 81, 80, 80, 79, 80, 80, 81, 85, 86, 89, 91, 94, 98, 100, 102, 103, 107, 108, 111, 111, 115, 115, 117, 118, 117, 119, 118, 121, 119, 122, 121, 122, 124, 124, 126, 126, 130, 130, 133, 136, 137, 140, 141, 145, 147, 148, 151, 152, 153, 155, 154, 156, 155, 156, 155, 155, 156, 154, 154, 154, 152, 152, 149, 149, 148, 148, 147, 147, 147, 146, 145, 146, 145, 144, 145, 142, 144, 142, 140, 141, 139, 139, 136, 136, 132, 132, 129, 128, 125, 124, 121, 121, 117, 116, 116, 113, 114, 111, 111, 110, 111, 110, 111, 110, 113, 111, 113, 113, 114, 115, 114, 115, 115, 115, 116, 115, 116, 115, 116, 115, 116, 116, 115, 116, 115, 116, 117, 116, 118, 117, 119, 119, 119, 122, 122, 122, 124, 124, 124, 125, 124, 126, 126, 126, 126, 125, 126, 125, 126, 125, 125, 125, 125, 125, 124, 123, 124, 123, 123, 123, 123, 122, 123, 122, 123, 123, 123, 124, 123, 125, 124, 125, 126, 126, 126, 126, 128, 126, 128, 126, 128, 128, 126, 128, 126, 128, 126, 128, 128, 126, 128, 128, 126, 129, 129, 129, 131, 131, 133, 133, 136, 137, 138, 140, 140, 142, 145, 146, 147, 147, 148, 148, 148, 149, 148, 148, 148, 147, 145, 145, 144, 144, 142, 140, 141, 140, 139, 139, 138, 139, 139, 138, 139, 139, 138, 139, 137, 138, 136, 137, 134, 133, 131, 130, 128, 126, 123, 122, 118, 116, 113, 111, 110, 107, 106, 104, 102, 102, 100, 101, 100, 99, 100, 99, 100, 99, 100, 99, 99, 98, 99, 96, 98, 95, 96, 95, 95, 94, 94, 93, 94, 93, 95, 95, 98, 99, 99, 102, 103, 107, 108, 111, 114, 117, 119, 123, 124, 128, 129, 132, 133, 137, 138, 139, 140, 142, 142, 145, 146, 146, 148, 148, 152, 152, 154, 155, 159, 159, 162, 163, 166, 168, 169, 170, 172, 172, 174, 175, 174, 175, 174, 174, 172, 172, 169, 169, 166, 164, 162, 160, 157, 155, 152, 149, 146, 145, 142, 139, 138, 134, 132, 131, 128, 126, 123, 122, 118, 117, 114, 113, 109, 108, 104, 103, 100, 98, 94, 93, 89, 88, 85, 84, 83, 79, 79, 78, 76, 76, 74, 76, 74, 76, 76, 77, 77, 79, 79, 83, 83, 85, 86, 88, 89, 92, 93, 95, 95, 99, 99, 102, 102, 106, 106, 109, 110, 114, 116, 117, 122, 124, 126, 131, 134, 137, 141, 144, 148, 152, 154, 159, 161, 164, 166, 169, 169, 172, 172, 174, 174, 175, 175, 174, 175, 174, 174, 172, 172, 172, 170, 171, 170, 169, 170, 168, 169, 168, 167, 167, 166, 166, 164, 161, 161, 159, 155, 154, 149, 148, 145, 140, 138, 133, 131, 126, 124, 121, 117, 114, 110, 109, 106, 104, 102, 101, 101, 99, 99, 96, 98, 95, 95, 95, 93, 94, 93, 92, 91, 88, 88, 87, 87, 85, 85, 84, 84, 83, 83, 81, 84, 83, 85, 85, 88, 89, 92, 94, 96, 98, 101, 103, 107, 110, 113, 115, 117, 118, 122, 124, 124, 126, 128, 130, 131, 131, 133, 132, 134, 134, 137, 138, 138, 141, 141, 144, 145, 148, 148, 152, 153, 156, 157, 159, 161, 162, 162, 164, 164, 163, 164, 164, 162, 162, 161, 157, 157, 155, 152, 152, 148, 147, 146, 142, 142, 141, 139, 140, 139, 138, 139, 138, 139, 138, 139, 138, 139, 138, 137, 137, 134, 134, 132, 131, 128, 126, 123, 122, 118, 117, 114, 113, 110, 108, 108, 106, 106, 106, 104, 107, 107, 108, 108, 110, 110, 114, 114, 116, 115, 117, 116, 117, 117, 117, 115, 115, 114, 114, 111, 109, 109, 108, 108, 106, 107, 106, 107, 108, 107, 109, 109, 113, 113, 116, 117, 117, 121, 121, 123, 123, 124, 123, 125, 124, 124, 124, 122, 123, 122, 122, 121, 121, 119, 121, 119, 121, 121, 122, 123, 124, 126, 128, 129, 130, 132, 132, 134, 136, 136, 138, 138, 138, 139, 138, 139, 138, 138, 137, 138, 136, 137, 137, 137, 137, 137, 138, 138, 138, 140, 140, 142, 142, 145, 146, 146, 148, 148, 149, 151, 149, 151, 149, 151, 149, 151, 148, 148, 147, 147, 145, 145, 144, 144, 141, 141, 139, 139, 139, 137, 138, 136, 134, 134, 134, 132, 132, 130, 130, 129, 125, 125, 122, 122, 118, 118, 115, 114, 111, 110, 108, 107, 104, 103, 101, 100, 99, 98, 96, 95, 95, 93, 94, 94, 92, 93, 93, 92, 93, 92, 93, 92, 93, 92, 93, 92, 92, 94, 93, 94, 94, 96, 95, 98, 99, 101, 101, 104, 106, 107, 110, 111, 116, 117, 121, 124, 125, 129, 131, 134, 137, 139, 142, 144, 147, 148, 151, 152, 154, 155, 157, 159, 159, 162, 163, 163, 166, 167, 167, 169, 170, 170, 172, 171, 174, 175, 174, 175, 175, 176, 175, 174, 174, 171, 171, 169, 168, 166, 164, 162, 160, 156, 154, 152, 148, 145, 144, 139, 138, 136, 132, 131, 126, 125, 122, 121, 117, 116, 113, 111, 107, 106, 102, 101, 98, 95, 93, 89, 87, 84, 83, 79, 78, 76, 74, 73, 72, 72, 72, 71, 72, 72, 72, 74, 74, 77, 77, 80, 80, 84, 85, 86, 88, 91, 92, 94, 96, 96, 100, 101, 102, 106, 107, 108, 111, 113, 117, 118, 122, 124, 129, 130, 134, 138, 140, 145, 147, 149, 154, 155, 160, 161, 164, 166, 169, 170, 171, 174, 174, 175, 176, 175, 177, 177, 176, 177, 176, 175, 176, 175, 175, 172, 174, 171, 171, 171, 169, 169, 166, 166, 164, 161, 161, 159, 155, 153, 149, 148, 144, 141, 139, 134, 132, 128, 126, 122, 119, 116, 115, 111, 110, 108, 104, 103, 101, 101, 100, 99, 98, 96, 95, 94, 93, 93, 91, 91, 89, 89, 87, 88, 86, 85, 86, 84, 85, 84, 85, 85, 85, 86, 87, 88, 88, 91, 91, 94, 95, 99, 101, 102, 106, 107, 110, 111, 115, 117, 118, 122, 123, 125, 126, 129, 129, 131, 131, 133, 134, 136, 137, 138, 139, 140, 141, 144, 145, 146, 147, 148, 149, 149, 152, 152, 154, 154, 155, 155, 156, 155, 156, 155, 156, 156, 155, 155, 153, 154, 153, 151, 151, 149, 149, 147, 147, 145, 145, 144, 144, 141, 141, 139, 140, 139, 138, 137, 136, 136, 133, 133, 131, 131, 130, 129, 126, 126, 125, 124, 123, 123, 121, 121, 118, 118, 117, 117, 116, 115, 116, 115, 116, 115, 116, 116, 116, 116, 116, 116, 116, 116, 116, 115, 116, 115, 116, 115, 115, 115, 113, 114, 113, 113, 111, 110, 110, 109, 110, 109, 110, 109, 110, 109, 111, 110, 113, 111, 114, 114, 114, 115, 115, 117, 116, 117, 117, 118, 117, 118, 117, 118, 117, 118, 117, 116, 117, 116, 118, 118, 117, 119, 118, 121, 122, 123, 123, 125, 126, 128, 130, 131, 131, 133, 134, 137, 137, 138, 138, 140, 140, 140, 142, 142, 141, 144, 144, 144, 145, 145, 146, 145, 147, 146, 148, 147, 148, 151, 149, 152, 153, 152, 154, 154, 154, 153, 154, 153, 154, 153, 153, 152, 152, 151, 149, 148, 147, 144, 144, 141, 141, 138, 138, 137, 134, 134, 131, 131, 130, 128, 128, 125, 125, 123, 122, 119, 119, 117, 116, 115, 111, 111, 108, 107, 106, 102, 101, 99, 98, 95, 94, 93, 91, 91, 88, 88, 86, 87, 86, 87, 86, 87, 87, 88, 88, 91, 91, 93, 94, 95, 95, 98, 98, 100, 100, 102, 102, 104, 106, 107, 107, 110, 110, 114, 115, 116, 119, 121, 124, 126, 130, 132, 136, 137, 141, 142, 147, 148, 152, 153, 156, 157, 161, 161, 163, 164, 167, 167, 168, 169, 170, 170, 171, 170, 171, 171, 172, 171, 172, 171, 172, 171, 172, 171, 171, 170, 170, 168, 167, 164, 163, 161, 160, 155, 154, 149, 148, 144, 141, 137, 134, 132, 129, 125, 123, 118, 117, 114, 113, 110, 107, 106, 102, 102, 99, 99, 96, 95, 94, 91, 91, 89, 87, 86, 85, 83, 83, 81, 79, 79, 78, 78, 77, 78, 78, 78, 77, 79, 79, 79, 81, 83, 85, 86, 88, 89, 93, 95, 96, 101, 102, 106, 107, 110, 113, 116, 118, 119, 123, 125, 126, 131, 133, 136, 138, 140, 141, 145, 146, 149, 151, 154, 154, 157, 159, 162, 164, 166, 168, 169, 171, 171, 174, 174, 175, 175, 176, 175, 175, 175, 172, 174, 171, 171, 168, 168, 164, 164, 161, 161, 157, 156, 153, 153, 149, 148, 146, 145, 141, 140, 138, 137, 133, 133, 130, 129, 126, 123, 122, 118, 117, 114, 113, 110, 107, 106, 102, 101, 98, 98, 94, 94, 92, 92, 89, 91, 89, 89, 88, 89, 89, 89, 91, 91, 92, 92, 93, 94, 93, 95, 95, 98, 98, 99, 99, 101, 100, 102, 102, 104, 106, 108, 108, 111, 111, 115, 115, 117, 121, 122, 124, 125, 129, 130, 132, 133, 136, 137, 139, 140, 140, 142, 142, 142, 144, 144, 144, 146, 145, 146, 145, 147, 146, 147, 147, 148, 148, 149, 149, 149, 151, 151, 151, 152, 152, 151, 151, 149, 151, 148, 148, 147, 146, 145, 144, 141, 140, 139, 137, 136, 133, 133, 132, 130, 130, 130, 128, 129, 128, 128, 128, 126, 128, 126, 128, 126, 128, 126, 128, 126, 125, 126, 124, 124, 123, 122, 122, 119, 119, 117, 117, 116, 116, 115, 116, 115, 116, 115, 116, 115, 117, 117, 117, 118, 118, 119, 118, 121, 119, 121, 118, 119, 118, 118, 118, 116, 117, 116, 114, 115, 113, 114, 113, 113, 113, 113, 113, 114, 113, 115, 114, 116, 115, 117, 116, 118, 118, 117, 119, 118, 119, 118, 118, 117, 118, 118, 117, 117, 117, 117, 116, 117, 116, 118, 117, 119, 119, 122, 122, 125, 125, 128, 130, 130, 133, 133, 136, 136, 139, 139, 139, 141, 141, 142, 144, 142, 145, 144, 145, 146, 145, 146, 147, 146, 148, 147, 149, 151, 149, 152, 151, 153, 153, 154, 154, 155, 154, 155, 154, 154, 153, 153, 151, 152, 148, 148, 146, 146, 142, 142, 139, 139, 137, 136, 132, 132, 129, 129, 125, 125, 124, 122, 122, 118, 118, 116, 116, 114, 113, 111, 109, 108, 107, 103, 103, 100, 99, 96, 95, 93, 92, 89, 89, 87, 87, 86, 84, 85, 84, 85, 85, 85, 87, 87, 89, 89, 92, 94, 95, 98, 98, 101, 101, 104, 104, 108, 108, 111, 111, 114, 115, 117, 118, 119, 122, 124, 124, 128, 129, 132, 134, 137, 140, 144, 145, 149, 151, 155, 156, 160, 162, 166, 166, 169, 170, 170, 172, 172, 174, 174, 172, 172, 171, 171, 170, 170, 169, 168, 166, 166, 163, 163, 162, 162, 160, 160, 159, 159, 157, 156, 155, 154, 151, 151, 147, 146, 142, 140, 137, 134, 131, 126, 124, 119, 117, 113, 111, 107, 104, 101, 100, 96, 95, 92, 92, 89, 89, 87, 88, 86, 87, 87, 87, 86, 86, 86, 86, 86, 85, 84, 85, 85, 84, 84, 83, 84, 84, 85, 85, 86, 86, 88, 88, 92, 94, 95, 99, 100, 104, 107, 109, 114, 116, 119, 123, 125, 128, 131, 132, 137, 138, 140, 141, 145, 145, 147, 148, 151, 151, 153, 154, 156, 156, 159, 159, 162, 163, 164, 166, 167, 167, 169, 169, 170, 169, 171, 170, 170, 169, 169, 167, 167, 166, 163, 162, 160, 159, 155, 154, 151, 149, 146, 146, 144, 140, 140, 137, 136, 134, 131, 131, 129, 128, 125, 124, 122, 121, 118, 117, 115, 114, 111, 109, 108, 104, 103, 101, 100, 98, 98, 95, 95, 93, 93, 93, 92, 93, 92, 93, 94, 93, 95, 95, 98, 98, 99, 100, 100, 102, 103, 103, 106, 104, 107, 107, 108, 109, 109, 111, 111, 111, 114, 114, 116, 118, 119, 119, 123, 123, 126, 126, 130, 132, 133, 133, 137, 137, 139, 140, 140, 142, 142, 141, 144, 142, 144, 142, 144, 142, 142, 142, 141, 142, 141, 142, 141, 142, 141, 144, 144, 142, 144, 144, 144, 145, 144, 145, 144, 145, 144, 142, 142, 141, 141, 140, 138, 138, 136, 136, 133, 134, 133, 131, 131, 130, 130, 129, 129, 128, 129, 129, 128, 129, 128, 129, 128, 129, 128, 129, 126, 128, 126, 126, 126, 124, 124, 124, 122, 122, 122, 119, 121, 118, 119, 117, 118, 117, 118, 118, 118, 119, 118, 119, 119, 121, 121, 121, 122, 121, 122, 121, 122, 119, 121, 118, 119, 117, 118, 116, 116, 116, 114, 114, 113, 113, 113, 113, 111, 113, 111, 113, 111, 114, 113, 115, 114, 115, 115, 116, 116, 117, 116, 117, 116, 117, 118, 117, 118, 118, 117, 118, 118, 117, 118, 118, 119, 121, 121, 123, 123, 125, 126, 128, 131, 131, 134, 134, 137, 139, 140, 140, 142, 142, 145, 145, 146, 147, 147, 148, 147, 148, 148, 148, 148, 148, 148, 149, 149, 148, 151, 149, 151, 151, 152, 152, 153, 152, 154, 153, 153, 152, 153, 151, 151, 149, 147, 147, 144, 142, 141, 138, 137, 133, 132, 129, 128, 125, 124, 122, 121, 118, 118, 116, 116, 114, 114, 111, 111, 110, 110, 108, 108, 106, 104, 103, 101, 100, 98, 98, 94, 93, 93, 91, 88, 89, 87, 87, 86, 87, 87, 87, 88, 89, 89, 92, 94, 94, 98, 99, 100, 102, 104, 104, 108, 108, 111, 111, 114, 115, 117, 117, 121, 122, 123, 125, 126, 129, 130, 133, 134, 138, 140, 144, 146, 147, 151, 152, 156, 156, 160, 161, 163, 166, 167, 168, 169, 169, 168, 170, 169, 170, 168, 169, 167, 168, 167, 166, 166, 164, 163, 163, 161, 161, 160, 160, 159, 156, 156, 154, 152, 152, 148, 147, 144, 142, 140, 137, 134, 132, 128, 125, 121, 119, 115, 113, 109, 107, 103, 102, 99, 98, 95, 94, 92, 92, 89, 89, 89, 87, 88, 88, 86, 87, 86, 87, 86, 87, 86, 86, 85, 86, 86, 86, 87, 87, 87, 88, 88, 91, 91, 94, 94, 98, 100, 101, 104, 108, 109, 114, 115, 119, 122, 124, 128, 130, 132, 134, 136, 139, 139, 141, 142, 145, 146, 147, 148, 148, 151, 151, 153, 154, 155, 156, 157, 159, 160, 161, 162, 163, 163, 166, 166, 167, 166, 166, 167, 166, 166, 163, 163, 161, 160, 157, 156, 153, 152, 149, 148, 145, 144, 142, 139, 139, 137, 134, 134, 132, 132, 131, 129, 129, 128, 126, 124, 123, 121, 121, 117, 116, 115, 113, 111, 109, 107, 106, 103, 102, 101, 99, 99, 96, 98, 95, 96, 96, 95, 96, 96, 98, 98, 100, 100, 101, 102, 103, 103, 106, 106, 107, 107, 109, 109, 110, 110, 111, 111, 113, 113, 115, 115, 116, 117, 117, 119, 119, 123, 123, 125, 126, 129, 129, 131, 132, 134, 134, 137, 137, 138, 138, 140, 139, 140, 139, 140, 140, 139, 140, 139, 139, 138, 139, 138, 139, 139, 138, 139, 138, 139, 139, 140, 140, 140, 140, 141, 140, 141, 141, 140, 141, 139, 140, 140, 138, 138, 138, 136, 136, 133, 134, 132, 132, 132, 130, 131, 129, 130, 130, 129, 130, 130, 129, 130, 129, 130, 129, 130, 130, 130, 130, 130, 129, 129, 128, 128, 128, 128, 126, 125, 124, 123, 124, 122, 123, 122, 123, 122, 122, 122, 122, 122, 122, 122, 121, 122, 121, 121, 119, 121, 119, 119, 118, 118, 117, 117, 116, 116, 116, 114, 114, 113, 113, 113, 111, 111, 111, 110, 110, 109, 111, 110, 111, 111, 110, 113, 113, 113, 114, 115, 114, 115, 116, 115, 117, 116, 118, 117, 119, 118, 121, 121, 122, 122, 123, 123, 124, 125, 126, 125, 128, 129, 130, 131, 132, 133, 136, 137, 138, 139, 139, 141, 141, 144, 145, 146, 146, 147, 147, 148, 149, 149, 148, 149, 148, 151, 149, 151, 149, 151, 149, 151, 151, 149, 151, 149, 151, 149, 151, 149, 149, 149, 147, 148, 146, 146, 144, 144, 141, 139, 138, 136, 134, 131, 131, 128, 126, 124, 121, 121, 117, 117, 114, 114, 111, 110, 110, 108, 108, 106, 106, 106, 104, 103, 102, 102, 101, 100, 98, 99, 96, 96, 95, 94, 94, 93, 94, 92, 93, 92, 93, 93, 94, 95, 96, 96, 99, 99, 101, 102, 104, 104, 108, 108, 111, 113, 114, 116, 117, 119, 121, 123, 124, 126, 126, 130, 131, 132, 134, 136, 138, 139, 141, 144, 145, 147, 148, 151, 152, 154, 156, 156, 159, 159, 161, 161, 163, 163, 164, 163, 164, 164, 164, 164, 163, 163, 163, 162, 161, 159, 159, 157, 156, 155, 153, 153, 151, 149, 147, 147, 146, 144, 141, 140, 138, 137, 134, 133, 131, 129, 128, 125, 123, 121, 118, 116, 113, 113, 110, 108, 106, 104, 102, 101, 100, 99, 96, 96, 94, 94, 94, 92, 93, 92, 93, 92, 91, 92, 91, 91, 92, 93, 92, 93, 92, 94, 94, 93, 95, 95, 98, 98, 100, 100, 101, 104, 104, 108, 110, 113, 114, 117, 118, 122, 123, 125, 128, 129, 132, 133, 136, 137, 139, 139, 141, 141, 145, 145, 147, 148, 148, 149, 149, 152, 152, 154, 154, 156, 157, 157, 160, 159, 161, 160, 161, 162, 161, 161, 161, 160, 160, 157, 157, 155, 155, 153, 153, 149, 149, 147, 146, 145, 142, 141, 139, 139, 137, 137, 134, 134, 131, 131, 129, 129, 128, 124, 124, 123, 119, 119, 116, 116, 113, 113, 110, 108, 108, 107, 106, 103, 103, 103, 101, 102, 100, 101, 100, 101, 100, 102, 102, 102, 102, 102, 103, 102, 104, 104, 103, 106, 104, 106, 106, 107, 107, 108, 109, 108, 110, 111, 111, 114, 115, 116, 117, 118, 118, 121, 122, 124, 124, 126, 128, 130, 131, 132, 133, 133, 133, 136, 136, 136, 137, 137, 138, 139, 138, 139, 139, 139, 140, 139, 140, 140, 141, 140, 141, 140, 142, 141, 142, 141, 142, 141, 144, 142, 144, 142, 142, 142, 142, 141, 141, 141, 140, 140, 138, 139, 138, 137, 137, 134, 134, 134, 133, 133, 132, 133, 131, 132, 131, 132, 130, 131, 130, 131, 129, 130, 130, 129, 129, 128, 128, 128, 125, 126, 124, 125, 123, 124, 122, 122, 121, 121, 121, 119, 118, 119, 118, 117, 118, 116, 117, 117, 116, 116, 115, 116, 116, 114, 115, 114, 115, 114, 114, 113, 114, 114, 111, 113, 111, 113, 113, 111, 113, 111, 113, 111, 113, 113, 111, 113, 111, 113, 113, 114, 114, 114, 115, 114, 116, 115, 117, 117, 118, 118, 121, 121, 121, 123, 124, 124, 124, 126, 126, 129, 130, 129, 131, 131, 133, 134, 134, 137, 137, 139, 138, 140, 141, 141, 144, 144, 146, 145, 147, 148, 148, 148, 149, 149, 151, 149, 151, 149, 151, 151, 151, 149, 149, 148, 149, 147, 148, 146, 147, 146, 145, 145, 144, 144, 144, 141, 141, 140, 140, 138, 138, 136, 136, 133, 132, 130, 130, 128, 126, 124, 123, 121, 119, 117, 116, 115, 111, 111, 109, 109, 107, 107, 106, 103, 104, 103, 101, 102, 101, 101, 100, 100, 98, 99, 96, 98, 95, 96, 95, 96, 95, 96, 96, 98, 98, 99, 100, 100, 101, 101, 104, 106, 106, 109, 109, 111, 113, 115, 116, 118, 121, 121, 123, 124, 126, 128, 130, 130, 133, 133, 136, 138, 139, 141, 141, 144, 146, 147, 148, 151, 151, 153, 153, 154, 156, 156, 159, 157, 160, 160, 161, 161, 160, 161, 161, 159, 160, 159, 159, 157, 157, 155, 155, 155, 153, 153, 151, 151, 148, 148, 146, 146, 142, 142, 140, 139, 137, 136, 132, 132, 129, 128, 125, 124, 122, 119, 118, 116, 115, 111, 111, 110, 107, 107, 104, 104, 102, 102, 100, 100, 98, 99, 96, 98, 95, 96, 96, 94, 95, 94, 95, 94, 95, 94, 96, 95, 96, 96, 98, 99, 100, 99, 101, 101, 103, 103, 106, 107, 109, 109, 113, 113, 116, 116, 119, 119, 123, 123, 126, 126, 130, 131, 133, 134, 136, 136, 139, 139, 141, 142, 142, 145, 144, 146, 147, 147, 149, 148, 151, 149, 152, 153, 153, 154, 154, 154, 155, 155, 155, 155, 155, 155, 155, 155, 154, 154, 153, 152, 152, 149, 149, 147, 147, 145, 144, 141, 141, 139, 138, 136, 136, 133, 133, 130, 130, 129, 126, 126, 124, 124, 123, 123, 122, 121, 118, 118, 116, 117, 116, 114, 114, 111, 111, 110, 110, 108, 108, 107, 107, 106, 104, 106, 104, 103, 104, 103, 104, 104, 106, 104, 107, 107, 107, 108, 108, 110, 110, 111, 111, 111, 113, 113, 113, 114, 113, 114, 114, 114, 115, 115, 116, 116, 116, 118, 118, 121, 122, 122, 124, 124, 126, 126, 129, 129, 131, 131, 133, 133, 136, 136, 136, 138, 138, 137, 138, 138, 139, 139, 138, 139, 138, 139, 139, 138, 139, 139, 138, 139, 139, 140, 139, 141, 140, 141, 141, 142, 142, 141, 144, 142, 144, 142, 144, 141, 142, 141, 141, 140, 140, 139, 139, 138, 138, 136, 137, 136, 134, 134, 134, 132, 133, 131, 132, 132, 130, 131, 130, 130, 130, 129, 129, 128, 126, 126, 125, 125, 124, 122, 123, 122, 119, 119, 117, 117, 117, 115, 115, 113, 114, 113, 110, 111, 110, 110, 110, 109, 109, 108, 109, 108, 109, 108, 109, 108, 109, 109, 108, 109, 108, 109, 108, 108, 108, 109, 109, 108, 109, 108, 110, 109, 111, 110, 113, 114, 114, 115, 117, 117, 119, 121, 121, 123, 123, 125, 125, 128, 128, 130, 131, 131, 133, 133, 136, 134, 137, 137, 139, 139, 140, 140, 142, 144, 144, 146, 145, 147, 147, 149, 151, 151, 151, 152, 152, 153, 153, 154, 153, 154, 153, 153, 152, 152, 151, 151, 149, 149, 147, 147, 147, 145, 145, 142, 144, 141, 140, 140, 138, 138, 138, 136, 136, 133, 131, 131, 129, 128, 126, 123, 123, 121, 118, 117, 115, 113, 111, 109, 108, 107, 104, 104, 102, 102, 100, 100, 99, 99, 99, 98, 98, 96, 98, 98, 96, 98, 99, 98, 99, 98, 99, 100, 99, 100, 101, 100, 102, 101, 103, 102, 104, 104, 107, 107, 109, 110, 110, 114, 115, 116, 118, 121, 122, 124, 125, 129, 129, 132, 134, 134, 138, 138, 141, 142, 142, 146, 146, 148, 148, 151, 151, 151, 153, 153, 154, 154, 155, 156, 155, 157, 156, 157, 157, 159, 159, 157, 159, 157, 159, 157, 156, 156, 155, 155, 154, 152, 152, 149, 149, 148, 146, 145, 142, 141, 140, 137, 136, 133, 132, 130, 129, 126, 125, 123, 122, 119, 118, 116, 116, 115, 111, 111, 109, 109, 108, 107, 104, 104, 102, 102, 101, 101, 99, 100, 98, 99, 98, 96, 98, 98, 98, 98, 98, 96, 98, 98, 99, 99, 100, 101, 101, 102, 103, 103, 106, 106, 108, 109, 110, 110, 113, 113, 116, 116, 118, 119, 122, 123, 124, 125, 128, 128, 130, 131, 133, 133, 137, 138, 139, 139, 142, 144, 145, 146, 147, 147, 148, 148, 151, 151, 152, 152, 152, 151, 152, 151, 152, 151, 152, 152, 151, 149, 151, 148, 149, 148, 148, 147, 147, 145, 146, 144, 145, 142, 142, 142, 140, 140, 140, 138, 138, 137, 136, 133, 133, 131, 131, 129, 129, 126, 126, 125, 123, 123, 121, 121, 118, 118, 116, 117, 116, 115, 115, 113, 114, 113, 111, 111, 111, 109, 110, 109, 109, 108, 109, 108, 108, 107, 108, 107, 106, 107, 106, 107, 107, 108, 107, 108, 109, 108, 110, 109, 111, 111, 113, 113, 115, 114, 116, 116, 117, 117, 119, 121, 121, 121, 122, 122, 123, 123, 124, 125, 125, 126, 126, 126, 128, 128, 129, 129, 131, 131, 132, 132, 133, 133, 134, 134, 136, 137, 137, 138, 138, 139, 139, 140, 139, 141, 140, 141, 140, 142, 141, 142, 141, 142, 141, 142, 141, 144, 142, 144, 142, 144, 144, 142, 144, 144, 144, 142, 144, 142, 142, 141, 142, 141, 140, 140, 139, 139, 138, 137, 134, 134, 133, 133, 132, 131, 130, 130, 128, 128, 125, 125, 124, 124, 123, 122, 122, 119, 121, 118, 118, 116, 117, 115, 115, 114, 114, 111, 111, 109, 110, 109, 107, 108, 107, 106, 106, 104, 104, 104, 103, 104, 103, 104, 103, 104, 103, 104, 103, 106, 104, 106, 107, 106, 107, 107, 108, 108, 110, 109, 111, 113, 113, 115, 116, 116, 118, 118, 121, 122, 124, 124, 126, 128, 129, 131, 131, 134, 134, 137, 138, 140, 140, 142, 142, 145, 145, 147, 147, 149, 151, 151, 152, 152, 153, 154, 153, 155, 154, 155, 154, 155, 154, 155, 155, 154, 155, 153, 154, 154, 152, 153, 151, 151, 148, 148, 148, 146, 145, 142, 142, 141, 138, 138, 136, 134, 133, 130, 130, 126, 126, 124, 123, 121, 119, 117, 117, 114, 114, 111, 111, 109, 109, 107, 106, 106, 104, 103, 102, 100, 100, 99, 99, 96, 96, 95, 95, 94, 94, 93, 94, 93, 94, 94, 94, 95, 96, 95, 98, 98, 100, 100, 103, 103, 106, 107, 109, 111, 113, 114, 116, 117, 118, 121, 122, 124, 126, 128, 129, 131, 131, 134, 134, 137, 138, 140, 140, 141, 145, 145, 147, 147, 149, 151, 151, 153, 152, 154, 154, 155, 155, 156, 155, 157, 157, 156, 157, 156, 156, 156, 156, 156, 155, 155, 153, 154, 152, 152, 149, 151, 148, 148, 147, 146, 144, 142, 140, 140, 139, 136, 136, 133, 131, 131, 128, 128, 124, 124, 122, 119, 118, 116, 116, 115, 111, 111, 109, 109, 108, 106, 106, 106, 103, 103, 102, 102, 101, 100, 101, 100, 99, 100, 99, 99, 98, 99, 99, 100, 99, 101, 100, 102, 101, 103, 103, 106, 106, 108, 109, 110, 110, 113, 113, 115, 116, 116, 119, 121, 121, 123, 123, 125, 124, 126, 128, 128, 130, 130, 132, 132, 133, 133, 136, 136, 138, 138, 140, 141, 141, 142, 144, 144, 145, 145, 146, 147, 147, 147, 148, 147, 148, 147, 148, 148, 147, 147, 147, 146, 146, 145, 146, 145, 145, 144, 144, 142, 142, 142, 141, 141, 140, 140, 139, 138, 138, 136, 137, 134, 134, 132, 133, 131, 131, 129, 129, 126, 128, 125, 125, 123, 124, 123, 121, 122, 119, 119, 118, 118, 117, 117, 116, 117, 116, 115, 115, 114, 115, 114, 113, 113, 111, 113, 111, 111, 111, 111, 110, 110, 109, 110, 109, 110, 110, 110, 111, 111, 110, 111, 111, 113, 111, 114, 113, 114, 114, 115, 114, 116, 115, 116, 116, 117, 116, 118, 117, 118, 119, 119, 121, 121, 123, 123, 124, 125, 125, 126, 126, 129, 128, 130, 131, 131, 132, 133, 133, 133, 136, 134, 137, 137, 137, 138, 138, 139, 139, 140, 140, 141, 141, 141, 142, 142, 144, 145, 145, 145, 146, 146, 146, 147, 147, 146, 147, 146, 147, 147, 146, 146, 145, 146, 145, 144, 144, 142, 142, 140, 141, 139, 139, 139, 138, 136, 136, 134, 134, 132, 132, 131, 129, 129, 126, 126, 124, 124, 122, 122, 119, 118, 116, 116, 114, 114, 113, 110, 110, 108, 108, 107, 104, 104, 102, 102, 102, 101, 101, 100, 101, 99, 100, 100, 99, 100, 99, 100, 101, 101, 101, 102, 102, 102, 103, 103, 106, 106, 106, 108, 108, 110, 110, 113, 113, 115, 116, 118, 118, 122, 122, 124, 125, 128, 129, 131, 132, 134, 136, 138, 139, 139, 142, 144, 145, 146, 147, 148, 148, 151, 151, 152, 153, 154, 154, 154, 155, 155, 156, 155, 157, 156, 157, 156, 157, 157, 156, 157, 156, 156, 156, 154, 154, 153, 151, 151, 148, 148, 146, 145, 142, 141, 139, 138, 137, 133, 133, 131, 129, 129, 125, 125, 122, 122, 119, 118, 117, 115, 115, 111, 111, 109, 108, 106, 106, 103, 102, 100, 100, 98, 98, 96, 96, 94, 95, 94, 93, 94, 93, 94, 93, 95, 95, 95, 96, 96, 99, 100, 100, 102, 101, 103, 103, 106, 106, 108, 110, 110, 113, 114, 114, 116, 118, 119, 119, 123, 123, 126, 128, 130, 130, 133, 133, 137, 137, 140, 141, 141, 144, 145, 147, 147, 149, 148, 151, 151, 152, 153, 152, 154, 153, 154, 153, 155, 155, 154, 155, 154, 155, 155, 154, 153, 154, 153, 153, 152, 151, 151, 148, 149, 147, 147, 145, 145, 141, 141, 139, 139, 136, 136, 133, 132, 130, 130, 128, 125, 125, 123, 122, 121, 118, 118, 117, 116, 116, 114, 114, 113, 111, 111, 109, 110, 108, 108, 107, 107, 106, 106, 106, 103, 104, 102, 103, 102, 103, 103, 103, 103, 103, 103, 103, 104, 103, 106, 104, 107, 107, 109, 108, 110, 111, 111, 114, 114, 116, 116, 118, 118, 119, 121, 122, 122, 124, 124, 125, 125, 128, 128, 130, 130, 131, 131, 133, 133, 134, 134, 137, 138, 138, 138, 140, 140, 141, 141, 142, 141, 142, 142, 144, 144, 144, 144, 144, 144, 144, 142, 142, 142, 142, 142, 142, 141, 141, 140, 141, 140, 141, 141, 140, 141, 139, 140, 140, 139, 139, 138, 138, 138, 136, 137, 134, 136, 133, 133, 131, 132, 131, 129, 130, 128, 128, 128, 125, 125, 124, 124, 123, 123, 122, 122, 121, 121, 121, 119, 119, 118, 118, 117, 118, 116, 117, 116, 115, 115, 115, 114, 114, 113, 113, 113, 111, 111, 111, 110, 111, 110, 111, 110, 111, 110, 111, 110, 111, 110, 111, 113, 111, 113, 111, 114, 114, 113, 115, 114, 115, 116, 116, 117, 116, 118, 117, 119, 119, 119, 122, 122, 122, 124, 124, 126, 125, 128, 128, 130, 130, 131, 131, 133, 134, 134, 134, 137, 137, 137, 139, 138, 140, 140, 141, 141, 141, 144, 142, 145, 144, 146, 145, 147, 146, 148, 147, 148, 148, 148, 149, 148, 149, 148, 148, 147, 148, 146, 147, 145, 145, 145, 142, 142, 140, 140, 140, 138, 138, 136, 136, 133, 133, 132, 132, 131, 129, 129, 126, 126, 124, 124, 122, 122, 119, 118, 116, 116, 114, 114, 113, 110, 110, 108, 108, 106, 106, 104, 102, 103, 101, 101, 100, 101, 99, 100, 100, 99, 100, 99, 100, 100, 101, 100, 101, 101, 102, 103, 103, 104, 104, 107, 108, 108, 110, 110, 113, 113, 115, 115, 118, 119, 121, 122, 124, 124, 128, 128, 130, 132, 133, 134, 137, 137, 139, 140, 142, 144, 144, 146, 146, 148, 149, 151, 151, 152, 153, 153, 153, 154, 153, 154, 155, 154, 155, 154, 155, 154, 155, 154, 154, 153, 154, 152, 153, 151, 151, 151, 149, 147, 147, 145, 145, 144, 141, 141, 138, 138, 136, 134, 132, 131, 130, 128, 126, 124, 122, 121, 119, 117, 117, 114, 114, 113, 110, 110, 109, 108, 107, 104, 104, 102, 102, 102, 100, 100, 99, 100, 99, 99, 98, 99, 99, 98, 99, 98, 99, 99, 100, 100, 101, 101, 103, 102, 104, 104, 107, 107, 109, 109, 111, 111, 114, 115, 116, 118, 119, 119, 123, 123, 125, 126, 129, 130, 132, 132, 134, 136, 138, 139, 139, 141, 141, 144, 144, 146, 146, 147, 147, 149, 149, 149, 151, 151, 151, 151, 152, 151, 152, 151, 152, 151, 152, 152, 149, 151, 149, 149, 149, 148, 148, 147, 146, 146, 144, 144, 142, 141, 139, 139, 137, 136, 133, 133, 131, 131, 129, 129, 128, 125, 125, 123, 123, 121, 121, 119, 119, 117, 117, 116, 116, 114, 114, 113, 113, 111, 110, 110, 108, 109, 107, 108, 108, 106, 107, 106, 107, 107, 106, 107, 107, 108, 108, 109, 109, 109, 110, 110, 111, 113, 113, 113, 114, 114, 115, 115, 116, 116, 116, 117, 117, 118, 118, 119, 119, 121, 122, 122, 123, 123, 125, 125, 128, 129, 130, 130, 131, 131, 133, 132, 134, 134, 136, 137, 136, 138, 137, 137, 138, 138, 139, 139, 138, 139, 138, 140, 139, 140, 139, 140, 139, 140, 139, 140, 139, 140, 141, 139, 140, 140, 140, 140, 140, 139, 139, 138, 139, 138, 138, 137, 137, 136, 137, 136, 134, 134, 133, 133, 133, 131, 132, 130, 131, 131, 130, 130, 129, 129, 128, 126, 126, 125, 125, 123, 124, 122, 123, 122, 122, 121, 121, 119, 119, 118, 118, 117, 117, 116, 116, 115, 114, 115, 114, 114, 114, 113, 114, 113, 111, 113, 113, 111, 113, 111, 113, 111, 113, 113, 111, 113, 113, 111, 113, 113, 111, 113, 114, 113, 114, 114, 115, 115, 116, 116, 117, 117, 119, 118, 121, 121, 123, 123, 124, 125, 125, 128, 128, 129, 129, 131, 131, 132, 132, 134, 133, 136, 134, 137, 138, 137, 139, 138, 140, 140, 141, 142, 141, 144, 142, 145, 145, 145, 146, 146, 147, 147, 146, 147, 146, 147, 146, 147, 146, 147, 145, 146, 145, 145, 144, 144, 141, 142, 140, 140, 138, 139, 137, 137, 136, 134, 133, 132, 132, 130, 129, 129, 126, 126, 125, 123, 123, 121, 121, 118, 118, 116, 116, 114, 114, 111, 111, 110, 108, 109, 107, 107, 107, 106, 104, 104, 103, 103, 102, 103, 102, 103, 103, 101, 103, 102, 103, 102, 103, 103, 104, 103, 106, 106, 106, 108, 107, 109, 109, 111, 111, 114, 114, 116, 117, 118, 121, 122, 122, 125, 125, 128, 130, 130, 132, 133, 136, 136, 138, 138, 140, 140, 142, 142, 145, 145, 146, 146, 148, 147, 149, 148, 151, 149, 152, 151, 152, 152, 153, 153, 152, 154, 153, 154, 154, 152, 153, 152, 152, 151, 151, 149, 149, 147, 147, 145, 144, 142, 140, 140, 137, 137, 136, 133, 131, 131, 130, 126, 126, 124, 124, 121, 121, 119, 117, 117, 115, 115, 114, 111, 111, 109, 109, 107, 107, 106, 104, 104, 102, 102, 101, 101, 100, 101, 100, 99, 100, 99, 100, 100, 100, 101, 101, 101, 102, 102, 104, 104, 104, 107, 107, 108, 108, 110, 110, 113, 114, 114, 116, 116, 118, 118, 121, 122, 124, 124, 126, 128, 130, 131, 131, 134, 134, 137, 137, 139, 140, 140, 142, 142, 145, 145, 146, 146, 147, 147, 148, 148, 149, 148, 149, 148, 149, 149, 151, 151, 149, 151, 149, 148, 149, 148, 148, 147, 148, 147, 146, 146, 145, 144, 141, 142, 140, 140, 139, 137, 137, 134, 134, 132, 132, 131, 130, 129, 126, 126, 124, 124, 122, 122, 121, 119, 118, 118, 116, 116, 114, 115, 113, 111, 113, 110, 111, 110, 109, 109, 108, 109, 108, 107, 108, 107, 107, 108, 107, 108, 107, 108, 108, 109, 109, 109, 110, 109, 111, 110, 111, 113, 113, 114, 115, 116, 116, 117, 117, 118, 119, 119, 121, 121, 122, 123, 123, 124, 123, 125, 125, 128, 126, 129, 130, 130, 131, 132, 132, 133, 133, 136, 134, 137, 138, 137, 138, 138, 139, 140, 139, 140, 139, 140, 140, 140, 139, 140, 140, 140, 140, 139, 140, 139, 140, 139, 140, 140, 139, 140, 140, 139, 140, 140, 138, 139, 138, 139, 138, 137, 137, 137, 134, 136, 134, 133, 133, 133, 132, 130, 131, 129, 130, 128, 129, 126, 128, 126, 125, 125, 124, 125, 123, 124, 122, 123, 121, 122, 121, 119, 121, 118, 119, 118, 117, 117, 116, 116, 116, 114, 115, 115, 113, 114, 113, 113, 111, 113, 111, 113, 111, 113, 111, 113, 111, 113, 111, 113, 114, 113, 114, 113, 115, 114, 115, 115, 116, 115, 117, 116, 117, 117, 118, 118, 119, 119, 121, 121, 122, 123, 123, 124, 124, 126, 125, 128, 129, 129, 131, 130, 132, 132, 134, 134, 134, 137, 136, 138, 138, 139, 138, 140, 140, 141, 141, 141, 141, 142, 142, 144, 144, 144, 145, 145, 144, 145, 144, 146, 145, 146, 145, 146, 144, 145, 145, 144, 144, 142, 142, 142, 140, 140, 139, 139, 137, 137, 136, 133, 133, 132, 132, 130, 130, 128, 128, 126, 124, 124, 123, 123, 121, 121, 118, 118, 116, 116, 114, 115, 114, 111, 111, 110, 110, 108, 108, 106, 107, 104, 106, 103, 104, 103, 103, 102, 103, 103, 102, 103, 103, 104, 103, 106, 106, 106, 107, 107, 109, 109, 110, 110, 111, 114, 114, 116, 115, 116, 118, 119, 121, 122, 123, 123, 125, 126, 128, 130, 130, 132, 132, 134, 136, 136, 138, 138, 140, 141, 141, 144, 144, 146, 146, 147, 147, 148, 148, 149, 149, 151, 149, 151, 151, 149, 151, 149, 151, 149, 151, 148, 149, 147, 148, 146, 147, 146, 144, 145, 142, 142, 140, 140, 138, 138, 137, 134, 134, 132, 132, 130, 130, 128, 128, 125, 125, 123, 123, 122, 119, 119, 117, 117, 115, 115, 113, 113, 111, 109, 110, 108, 108, 107, 107, 104, 106, 103, 104, 103, 104, 102, 103, 103, 104, 104, 104, 103, 106, 104, 106, 106, 107, 107, 108, 109, 110, 109, 111, 110, 111, 114, 114, 116, 115, 117, 118, 118, 121, 121, 123, 124, 124, 126, 126, 130, 131, 132, 132, 134, 134, 134, 137, 137, 139, 140, 140, 140, 141, 141, 142, 144, 142, 145, 144, 145, 145, 146, 145, 146, 146, 145, 146, 145, 146, 146, 145, 146, 146, 145, 144, 145, 142, 144, 141, 142, 140, 141, 140, 139, 138, 137, 137, 134, 134, 133, 133, 132, 131, 130, 129, 128, 128, 125, 125, 123, 124, 123, 122, 122, 119, 119, 118, 118, 118, 117, 117, 117, 115, 116, 116, 114, 115, 114, 114, 114, 113, 114, 111, 113, 111, 113, 113, 110, 111, 110, 113, 111, 113, 113, 111, 114, 113, 114, 114, 115, 115, 115, 116, 116, 117, 116, 118, 118, 118, 118, 119, 119, 121, 121, 122, 121, 123, 122, 124, 124, 125, 125, 126, 126, 129, 129, 129, 131, 130, 131, 132, 132, 133, 134, 133, 134, 133, 136, 136, 136, 134, 137, 137, 137, 137, 137, 137, 138, 137, 138, 138, 139, 138, 140, 140, 140, 140, 139, 140, 140, 139, 140, 139, 140, 140, 138, 139, 138, 138, 137, 138, 136, 137, 136, 134, 136, 134, 133, 133, 132, 133, 131, 131, 131, 130, 130, 130, 128, 129, 126, 128, 125, 125, 124, 124, 122, 123, 121, 121, 121, 118, 118, 118, 116, 116, 116, 114, 115, 114, 114, 114, 113, 111, 113, 111, 110, 111, 110, 111, 110, 111, 110, 111, 111, 111, 111, 111, 110, 111, 111, 113, 113, 111, 114, 113, 114, 115, 114, 116, 116, 116, 117, 117, 118, 119, 119, 122, 122, 122, 124, 124, 126, 126, 128, 129, 130, 131, 132, 133, 134, 134, 136, 136, 138, 139, 139, 139, 141, 142, 141, 144, 142, 145, 145, 145, 146, 146, 147, 146, 147, 146, 148, 147, 148, 146, 147, 146, 146, 147, 145, 146, 145, 144, 144, 144, 141, 142, 140, 140, 138, 138, 138, 136, 136, 134, 133, 131, 131, 129, 129, 128, 126, 124, 123, 121, 121, 118, 118, 116, 116, 114, 115, 113, 113, 110, 110, 109, 109, 108, 108, 108, 106, 107, 106, 104, 106, 104, 103, 104, 103, 104, 104, 103, 104, 103, 104, 103, 106, 104, 106, 107, 108, 108, 108, 110, 110, 113, 111, 114, 116, 116, 118, 118, 121, 121, 123, 123, 126, 128, 128, 130, 130, 132, 132, 134, 134, 137, 137, 139, 139, 141, 140, 142, 144, 144, 144, 146, 145, 147, 146, 148, 147, 148, 148, 149, 148, 149, 149, 148, 149, 149, 148, 149, 147, 148, 146, 147, 145, 146, 144, 144, 142, 142, 141, 140, 138, 138, 137, 137, 136, 134, 133, 132, 130, 130, 129, 128, 125, 125, 123, 123, 121, 121, 118, 118, 117, 115, 115, 114, 113, 113, 110, 111, 109, 110, 108, 109, 108, 108, 107, 107, 108, 107, 108, 107, 108, 107, 108, 107, 108, 108, 109, 108, 109, 108, 110, 110, 109, 111, 110, 113, 113, 114, 114, 115, 116, 116, 118, 119, 119, 122, 122, 123, 123, 125, 126, 126, 129, 129, 131, 131, 132, 132, 134, 133, 136, 136, 137, 138, 137, 139, 138, 140, 140, 140, 141, 140, 142, 142, 141, 142, 142, 141, 144, 142, 141, 142, 141, 142, 142, 141, 142, 140, 141, 141, 140, 139, 140, 139, 139, 139, 138, 138, 137, 137, 136, 136, 134, 134, 134, 132, 132, 131, 131, 130, 129, 128, 126, 126, 124, 125, 124, 122, 123, 121, 121, 119, 119, 118, 119, 118, 117, 118, 116, 117, 116, 116, 115, 116, 115, 115, 115, 114, 115, 113, 114, 114, 113, 113, 114, 113, 114, 114, 113, 115, 114, 115, 114, 114, 116, 115, 116, 117, 116, 117, 117, 118, 118, 118, 119, 118, 121, 119, 121, 122, 121, 122, 122, 123, 123, 124, 125, 124, 126, 125, 128, 126, 129, 128, 130, 129, 131, 131, 131, 132, 132, 133, 133, 134, 134, 134, 136, 136, 136, 137, 136, 137, 137, 138, 138, 138, 139, 138, 139, 138, 140, 140, 139, 140, 139, 140, 140, 141, 141, 141, 140, 140, 139, 140, 139, 140, 138, 139, 137, 138, 137, 136, 136, 134, 134, 134, 133, 131, 132, 130, 131, 129, 129, 128, 128, 125, 126, 124, 125, 124, 123, 123, 121, 122, 121, 118, 119, 117, 117, 117, 115, 116, 114, 114, 114, 111, 113, 110, 111, 109, 110, 108, 109, 108, 109, 109, 108, 109, 108, 109, 108, 109, 108, 110, 110, 109, 111, 110, 113, 111, 114, 113, 115, 114, 116, 117, 116, 118, 118, 119, 119, 122, 122, 124, 124, 124, 126, 126, 129, 130, 130, 132, 132, 134, 134, 136, 136, 138, 138, 140, 140, 141, 141, 142, 144, 144, 145, 146, 145, 147, 147, 146, 147, 147, 148, 147, 148, 147, 148, 147, 148, 147, 148, 147, 146, 146, 145, 145, 144, 144, 142, 140, 141, 140, 138, 138, 136, 136, 133, 133, 131, 131, 129, 129, 126, 126, 124, 124, 123, 121, 121, 118, 119, 118, 116, 116, 114, 114, 111, 113, 110, 110, 108, 109, 107, 107, 107, 104, 106, 103, 104, 103, 103, 102, 103, 102, 103, 103, 103, 104, 103, 106, 106, 106, 107, 107, 109, 108, 110, 110, 113, 113, 115, 114, 116, 117, 117, 119, 121, 123, 123, 125, 125, 128, 128, 131, 131, 133, 133, 136, 137, 137, 139, 139, 141, 141, 142, 142, 145, 144, 146, 145, 146, 147, 146, 147, 147, 148, 147, 148, 147, 148, 148, 147, 148, 148, 148, 148, 147, 147, 146, 147, 145, 146, 144, 144, 142, 141, 141, 139, 139, 138, 136, 136, 134, 131, 131, 129, 129, 126, 126, 124, 124, 122, 121, 121, 119, 118, 117, 117, 115, 116, 114, 114, 114, 111, 113, 111, 110, 110, 110, 108, 109, 108, 108, 107, 108, 107, 107, 106, 107, 106, 107, 106, 107, 107, 108, 107, 109, 110, 109, 111, 110, 113, 113, 115, 115, 117, 116, 118, 118, 121, 121, 123, 123, 123, 125, 125, 126, 126, 129, 129, 130, 130, 132, 132, 132, 134, 133, 136, 136, 137, 138, 138, 139, 139, 140, 140, 141, 142, 142, 142, 142, 141, 142, 141, 142, 142, 141, 141, 140, 141, 140, 140, 138, 139, 137, 137, 138, 136, 137, 137, 136, 136, 134, 136, 136, 136, 133, 134, 133, 133, 132, 132, 131, 131, 130, 130, 130, 128, 128, 126, 126, 125, 124, 123, 123, 122, 122, 119, 121, 119, 119, 118, 119, 117, 118, 117, 118, 116, 117, 116, 117, 117, 117, 116, 117, 116, 117, 116, 117, 117, 117, 117, 116, 117, 116, 117, 117, 117, 118, 117, 118, 117, 118, 117, 118, 117, 118, 118, 119, 118, 119, 118, 121, 119, 121, 119, 122, 121, 123, 122, 123, 123, 124, 123, 125, 125, 126, 125, 126, 128, 126, 128, 128, 129, 128, 130, 130, 130, 131, 130, 132, 131, 133, 132, 134, 134, 133, 136, 134, 137, 137, 136, 137, 137, 138, 137, 138, 138, 137, 138, 138, 137, 138, 138, 137, 139, 138, 139, 139, 138, 139, 138, 139, 138, 139, 137, 138, 138, 138, 137, 137, 136, 134, 134, 133, 133, 133, 132, 130, 131, 130, 128, 129, 126, 128, 125, 126, 124, 125, 123, 124, 122, 122, 121, 121, 119, 119, 118, 118, 117, 116, 116, 114, 115, 114, 113, 113, 111, 111, 111, 109, 110, 109, 110, 110, 108, 109, 108, 109, 108, 109, 109, 110, 109, 110, 110, 111, 111, 113, 114, 114, 115, 115, 116, 117, 118, 118, 121, 119, 122, 122, 124, 125, 126, 128, 128, 129, 130, 131, 131, 132, 132, 134, 134, 136, 137, 138, 139, 140, 140, 141, 142, 144, 144, 145, 145, 146, 146, 146, 146, 147, 146, 147, 146, 147, 147, 146, 146, 146, 146, 146, 144, 145, 144, 145, 142, 144, 141, 142, 141, 140, 140, 139, 139, 137, 137, 134, 134, 131, 131, 129, 129, 125, 125, 124, 122, 121, 118, 118, 116, 117, 115, 115, 114, 114, 111, 113, 110, 111, 110, 109, 109, 108, 107, 108, 106, 107, 104, 106, 104, 103, 104, 103, 104, 104, 104, 104, 104, 106, 106, 107, 107, 109, 110, 109, 111, 113, 113, 115, 116, 117, 116, 118, 118, 121, 122, 122, 124, 124, 126, 126, 129, 129, 131, 132, 132, 134, 136, 136, 138, 138, 140, 139, 141, 141, 142, 144, 144, 145, 145, 146, 146, 147, 146, 147, 147, 148, 148, 147, 148, 147, 148, 148, 147, 148, 147, 146, 146, 145, 145, 142, 144, 142, 140, 140, 138, 138, 137, 137, 134, 134, 132, 133, 131, 131, 129, 129, 126, 128, 126, 124, 124, 122, 122, 119, 117, 117, 115, 115, 115, 113, 113, 110, 111, 109, 110, 109, 110, 109, 110, 110, 109, 110, 109, 110, 110, 109, 110, 109, 110, 110, 109, 110, 109, 110, 109, 110, 109, 110, 111, 111, 114, 113, 115, 116, 117, 117, 119, 119, 122, 122, 122, 124, 124, 126, 126, 128, 129, 129, 129, 130, 130, 131, 131, 132, 132, 134, 133, 136, 136, 137, 137, 138, 138, 139, 139, 140, 139, 140, 141, 140, 141, 140, 140, 139, 140, 139, 140, 139, 140, 139, 140, 140, 140, 139, 139, 138, 139, 138, 138, 137, 137, 137, 136, 136, 133, 133, 133, 132, 131, 130, 130, 129, 129, 128, 129, 128, 126, 128, 128, 128, 126, 126, 125, 126, 125, 124, 124, 123, 123, 122, 121, 119, 119, 117, 118, 116, 117, 116, 115, 116, 115, 117, 117, 116, 118, 117, 118, 118, 119, 118, 119, 119, 119, 117, 118, 117, 117, 116, 116, 116, 116, 115, 116, 115, 116, 116, 117, 116, 118, 118, 121, 121, 121, 123, 123, 123, 124, 124, 125, 124, 125, 124, 124, 123, 124, 124, 123, 124, 123, 125, 125, 125, 128, 126, 129, 129, 131, 131, 133, 134, 133, 136, 136, 134, 136, 134, 136, 134, 136, 134, 136, 134, 136, 134, 136, 134, 137, 137, 137, 138, 138, 140, 139, 141, 140, 141, 141, 140, 141, 139, 139, 138, 138, 137, 136, 134, 133, 132, 133, 131, 132, 131, 131, 132, 132, 133, 132, 133, 132, 132, 133, 131, 131, 130, 128, 128, 125, 124, 123, 119, 119, 117, 117, 115, 115, 115, 114, 115, 114, 116, 116, 116, 117, 117, 116, 117, 116, 116, 114, 114, 113, 110, 110, 107, 107, 106, 103, 104, 102, 104, 104, 104, 108, 108, 111, 113, 116, 117, 121, 122, 124, 125, 124, 125, 125, 123, 123, 121, 121, 118, 118, 117, 116, 115, 117, 117, 121, 122, 126, 130, 134, 138, 144, 146, 152, 153, 156, 156, 159, 157, 154, 153, 148, 145, 138, 133, 128, 123, 117, 115, 111, 110, 110, 111, 115, 119, 125, 133, 141, 149, 160, 167, 177, 184, 192, 197, 201, 201, 202, 199, 197, 191, 183, 172, 163, 151, 140, 126, 116, 106, 94, 86, 77, 72, 68, 65, 63, 63, 64, 68, 70, 74, 78, 84, 89, 93, 99, 102, 104, 109, 110, 114, 116, 116, 118, 117, 119, 119, 121, 122, 122, 124, 124, 126, 126, 129, 128, 130, 130, 131, 129, 130, 128, 128, 125, 125, 124, 122, 119, 118, 116, 116, 115, 114, 114, 113, 114, 113, 114, 113, 114, 113, 113, 111, 111, 110, 110, 108, 109, 108, 107, 109, 110, 110, 115, 118, 123, 129, 134, 140, 149, 156, 166, 174, 181, 187, 193, 199, 202, 202, 204, 202, 199, 194, 189, 182, 172, 164, 154, 147, 138, 130, 123, 118, 113, 111, 110, 110, 111, 115, 119, 124, 129, 134, 138, 144, 146, 149, 151, 149, 149, 145, 141, 136, 130, 122, 115, 107, 100, 92, 87, 81, 77, 76, 73, 74, 74, 78, 81, 87, 91, 98, 101, 108, 111, 116, 118, 122, 123, 123, 123, 121, 119, 117, 115, 110, 109, 104, 104, 101, 102, 101, 102, 104, 106, 109, 113, 116, 121, 124, 129, 131, 134, 138, 138, 140, 141, 140, 139, 139, 138, 134, 133, 131, 130, 129, 126, 128, 126, 128, 129, 130, 133, 134, 139, 141, 145, 148, 151, 154, 156, 159, 160, 160, 162, 161, 162, 161, 161, 160, 159, 155, 154, 152, 148, 147, 144, 141, 138, 136, 131, 129, 125, 122, 118, 114, 111, 107, 104, 101, 98, 95, 92, 91, 88, 88, 87, 88, 87, 89, 91, 92, 95, 96, 101, 102, 106, 109, 113, 115, 118, 119, 123, 124, 128, 130, 131, 134, 136, 139, 140, 145, 146, 151, 154, 157, 160, 164, 168, 172, 174, 178, 181, 183, 183, 185, 184, 184, 182, 181, 176, 172, 167, 163, 155, 151, 144, 137, 129, 122, 114, 108, 101, 93, 87, 80, 74, 70, 64, 58, 56, 51, 49, 44, 43, 40, 40, 38, 39, 38, 39, 39, 42, 44, 48, 50, 56, 61, 68, 73, 81, 87, 96, 104, 115, 123, 133, 141, 151, 161, 169, 178, 186, 194, 200, 207, 214, 217, 223, 227, 228, 230, 230, 230, 229, 227, 223, 222, 216, 213, 207, 202, 196, 190, 184, 176, 170, 162, 156, 149, 141, 136, 130, 122, 117, 110, 106, 100, 96, 91, 87, 83, 80, 76, 74, 72, 71, 69, 66, 68, 66, 68, 66, 68, 70, 70, 72, 74, 76, 79, 80, 85, 86, 91, 93, 98, 100, 102, 107, 109, 114, 115, 119, 121, 124, 128, 129, 131, 132, 134, 134, 137, 136, 137, 136, 137, 137, 134, 136, 133, 133, 131, 131, 130, 129, 129, 128, 129, 129, 129, 129, 131, 132, 134, 137, 139, 141, 144, 147, 151, 153, 156, 157, 161, 163, 164, 168, 168, 170, 170, 171, 171, 170, 170, 169, 169, 167, 164, 164, 161, 160, 157, 154, 153, 148, 146, 141, 139, 134, 131, 126, 121, 116, 111, 104, 100, 93, 88, 81, 78, 72, 66, 63, 59, 55, 54, 50, 50, 49, 51, 51, 55, 58, 61, 66, 71, 78, 83, 91, 96, 106, 113, 121, 129, 136, 145, 152, 160, 168, 174, 182, 187, 194, 199, 205, 208, 213, 216, 219, 220, 221, 220, 217, 216, 213, 209, 205, 198, 192, 183, 175, 167, 156, 147, 136, 126, 115, 106, 94, 86, 76, 66, 57, 50, 42, 34, 29, 23, 19, 14, 13, 10, 10, 10, 10, 12, 14, 19, 23, 28, 33, 41, 49, 56, 66, 76, 87, 96, 108, 118, 131, 142, 153, 166, 175, 186, 197, 206, 215, 223, 230, 235, 242, 245, 250, 251, 254, 255, 254, 254, 251, 250, 245, 243, 237, 230, 226, 217, 211, 202, 193, 184, 174, 164, 154, 142, 133, 122, 110, 101, 89, 80, 70, 62, 53, 47, 40, 34, 31, 26, 25, 24, 21, 24, 24, 27, 29, 34, 38, 43, 48, 54, 58, 66, 72, 78, 84, 88, 95, 100, 106, 110, 116, 121, 126, 130, 134, 138, 142, 145, 149, 152, 155, 156, 159, 160, 160, 161, 160, 161, 159, 157, 156, 153, 151, 147, 146, 142, 139, 137, 134, 131, 131, 129, 129, 128, 129, 128, 130, 131, 132, 136, 137, 140, 142, 146, 147, 152, 153, 156, 157, 159, 162, 162, 164, 163, 164, 166, 164, 164, 163, 163, 160, 160, 156, 155, 152, 149, 145, 142, 138, 134, 129, 123, 118, 113, 106, 101, 94, 89, 83, 77, 72, 66, 64, 58, 57, 55, 51, 51, 50, 51, 54, 54, 57, 59, 65, 69, 72, 79, 84, 91, 95, 103, 108, 116, 122, 130, 136, 145, 152, 159, 166, 174, 181, 189, 194, 201, 208, 213, 219, 222, 227, 229, 232, 232, 231, 231, 228, 226, 219, 215, 207, 200, 191, 183, 171, 162, 151, 140, 129, 117, 107, 95, 85, 74, 64, 55, 46, 38, 31, 23, 17, 10, 6, 2, 0, 0, 0, 0, 0, 0, 2, 6, 11, 18, 26, 33, 43, 53, 65, 74, 88, 99, 113, 124, 138, 148, 161, 172, 183, 193, 202, 212, 220, 227, 232, 239, 243, 247, 251, 253, 253, 255, 255, 253, 253, 250, 247, 243, 239, 234, 228, 221, 213, 205, 194, 186, 175, 166, 153, 144, 131, 121, 108, 99, 88, 78, 70, 61, 54, 47, 42, 36, 34, 29, 29, 28, 27, 29, 29, 33, 35, 38, 41, 44, 49, 53, 57, 61, 66, 71, 77, 81, 87, 92, 98, 106, 110, 117, 123, 129, 136, 141, 145, 152, 155, 160, 162, 166, 167, 169, 169, 170, 169, 168, 167, 163, 162, 157, 155, 152, 149, 145, 144, 140, 139, 136, 136, 134, 132, 133, 132, 133, 134, 134, 137, 138, 138, 140, 141, 144, 144, 146, 146, 148, 149, 149, 151, 152, 151, 153, 152, 153, 152, 152, 152, 151, 149, 147, 146, 142, 141, 139, 136, 131, 129, 124, 121, 116, 113, 108, 102, 99, 94, 91, 87, 83, 81, 77, 77, 74, 72, 73, 71, 73, 73, 73, 76, 77, 80, 84, 85, 89, 92, 98, 101, 107, 111, 116, 123, 128, 134, 139, 147, 153, 160, 166, 172, 177, 184, 189, 194, 197, 201, 202, 206, 206, 207, 205, 204, 201, 198, 193, 187, 181, 176, 169, 162, 154, 146, 138, 131, 122, 115, 106, 100, 92, 85, 78, 72, 65, 59, 55, 48, 44, 39, 36, 32, 29, 26, 26, 24, 25, 24, 27, 28, 33, 36, 43, 49, 57, 65, 76, 85, 95, 107, 118, 129, 142, 153, 166, 176, 185, 197, 205, 214, 220, 228, 232, 237, 242, 243, 245, 246, 246, 245, 243, 242, 237, 235, 230, 226, 221, 214, 208, 200, 194, 187, 178, 170, 162, 152, 144, 133, 124, 114, 106, 95, 87, 78, 71, 63, 55, 50, 44, 40, 36, 33, 32, 29, 29, 29, 32, 32, 35, 39, 40, 46, 48, 54, 57, 63, 68, 73, 78, 85, 89, 95, 100, 107, 113, 117, 124, 129, 136, 140, 146, 149, 155, 157, 162, 164, 168, 169, 170, 172, 171, 172, 170, 170, 168, 167, 164, 163, 161, 159, 156, 153, 152, 148, 147, 145, 142, 142, 141, 141, 140, 139, 138, 138, 137, 138, 136, 136, 137, 134, 136, 133, 134, 133, 133, 132, 131, 132, 130, 131, 131, 130, 131, 130, 129, 130, 128, 129, 126, 126, 126, 124, 122, 122, 118, 117, 115, 113, 109, 108, 104, 103, 100, 99, 95, 95, 94, 92, 92, 91, 92, 91, 92, 93, 94, 95, 95, 99, 100, 103, 104, 108, 109, 114, 116, 121, 123, 128, 132, 136, 140, 145, 149, 155, 159, 164, 170, 175, 178, 182, 186, 189, 192, 193, 196, 197, 196, 196, 193, 191, 186, 184, 178, 174, 168, 162, 155, 148, 140, 134, 126, 119, 111, 106, 100, 92, 87, 80, 76, 69, 64, 58, 56, 50, 47, 44, 41, 38, 36, 34, 34, 34, 33, 35, 36, 40, 43, 47, 53, 57, 64, 72, 79, 88, 96, 104, 116, 124, 136, 144, 155, 163, 174, 182, 189, 197, 202, 211, 214, 220, 224, 227, 228, 231, 230, 232, 230, 230, 228, 226, 222, 220, 214, 209, 206, 199, 194, 186, 181, 174, 166, 159, 151, 141, 134, 126, 118, 111, 102, 96, 89, 81, 77, 71, 65, 61, 57, 54, 51, 49, 49, 47, 48, 47, 49, 49, 53, 53, 57, 58, 63, 66, 70, 73, 76, 81, 85, 89, 93, 99, 103, 109, 113, 118, 122, 128, 131, 137, 139, 145, 147, 152, 154, 155, 159, 161, 161, 163, 162, 163, 162, 163, 161, 162, 160, 160, 156, 156, 155, 153, 153, 151, 149, 147, 147, 146, 146, 144, 144, 141, 141, 141, 139, 139, 138, 138, 137, 137, 137, 134, 136, 134, 133, 134, 133, 133, 133, 132, 132, 131, 131, 131, 129, 129, 126, 126, 123, 122, 121, 117, 116, 113, 111, 107, 106, 103, 100, 100, 96, 96, 94, 94, 93, 93, 93, 93, 94, 95, 96, 98, 100, 101, 104, 106, 109, 110, 114, 115, 119, 122, 124, 128, 131, 133, 137, 139, 144, 146, 151, 153, 157, 160, 164, 166, 170, 172, 172, 175, 175, 177, 177, 176, 174, 174, 171, 169, 166, 162, 157, 154, 148, 145, 140, 133, 130, 123, 119, 113, 109, 102, 99, 93, 89, 84, 80, 76, 73, 70, 65, 64, 62, 58, 58, 56, 56, 55, 57, 57, 59, 61, 65, 68, 73, 78, 81, 88, 94, 101, 107, 115, 121, 129, 136, 141, 149, 155, 163, 168, 175, 181, 184, 191, 193, 199, 201, 205, 207, 209, 209, 212, 211, 212, 209, 209, 206, 205, 201, 198, 193, 190, 184, 179, 172, 168, 160, 155, 147, 141, 134, 128, 121, 114, 107, 100, 94, 87, 84, 77, 73, 69, 65, 63, 59, 57, 56, 54, 55, 54, 55, 56, 57, 57, 61, 62, 66, 69, 73, 77, 80, 84, 88, 92, 98, 101, 107, 110, 116, 121, 123, 129, 131, 137, 140, 142, 147, 148, 152, 154, 155, 159, 159, 161, 161, 162, 161, 163, 162, 161, 162, 161, 160, 159, 156, 156, 155, 154, 153, 151, 148, 148, 146, 146, 145, 142, 142, 140, 140, 139, 138, 138, 137, 136, 133, 133, 132, 132, 131, 129, 130, 128, 128, 126, 125, 125, 123, 123, 121, 122, 119, 119, 117, 117, 116, 115, 114, 113, 111, 110, 109, 108, 107, 106, 104, 103, 101, 101, 99, 100, 99, 98, 99, 99, 99, 100, 100, 102, 104, 104, 108, 110, 111, 115, 117, 119, 123, 125, 128, 131, 133, 137, 139, 144, 145, 149, 152, 155, 156, 160, 162, 166, 167, 170, 171, 172, 175, 175, 175, 176, 174, 174, 171, 170, 167, 164, 161, 156, 152, 146, 142, 136, 131, 124, 119, 113, 108, 101, 98, 91, 87, 81, 78, 73, 71, 68, 64, 63, 61, 57, 57, 56, 56, 55, 57, 57, 59, 62, 64, 68, 70, 74, 78, 85, 91, 95, 102, 108, 116, 122, 130, 138, 144, 152, 159, 167, 172, 179, 184, 190, 194, 200, 202, 207, 208, 212, 212, 214, 213, 214, 213, 211, 211, 206, 205, 200, 197, 192, 187, 182, 177, 169, 164, 157, 149, 144, 136, 130, 122, 116, 108, 102, 96, 89, 85, 79, 74, 70, 68, 63, 62, 58, 58, 56, 56, 55, 56, 56, 58, 58, 62, 62, 65, 68, 71, 73, 78, 80, 86, 89, 94, 98, 103, 108, 113, 118, 123, 126, 132, 136, 140, 144, 146, 151, 152, 155, 156, 159, 159, 161, 160, 161, 160, 160, 159, 159, 156, 156, 154, 154, 153, 151, 151, 148, 148, 146, 147, 145, 145, 144, 144, 142, 142, 141, 141, 140, 139, 137, 137, 137, 134, 134, 134, 132, 132, 131, 131, 129, 130, 128, 129, 128, 128, 126, 126, 126, 124, 125, 124, 122, 122, 121, 118, 118, 116, 114, 114, 110, 110, 108, 107, 106, 103, 103, 101, 102, 101, 100, 101, 100, 102, 103, 102, 106, 107, 107, 110, 111, 115, 117, 119, 121, 124, 125, 130, 131, 134, 136, 140, 141, 145, 146, 149, 152, 154, 156, 156, 160, 161, 162, 163, 164, 163, 164, 163, 164, 162, 161, 160, 156, 155, 152, 149, 145, 141, 137, 133, 128, 124, 118, 115, 109, 104, 99, 95, 91, 87, 84, 79, 77, 73, 72, 70, 68, 68, 65, 66, 65, 68, 66, 70, 71, 72, 77, 78, 84, 86, 92, 95, 101, 106, 113, 117, 125, 130, 138, 145, 149, 157, 162, 169, 175, 179, 185, 189, 193, 196, 200, 201, 204, 204, 205, 204, 204, 201, 200, 197, 194, 191, 189, 183, 179, 176, 169, 166, 160, 155, 149, 145, 138, 133, 128, 123, 116, 111, 106, 101, 96, 89, 86, 83, 77, 74, 70, 69, 65, 64, 62, 62, 61, 62, 62, 63, 65, 65, 69, 70, 73, 76, 80, 83, 87, 91, 93, 98, 101, 106, 108, 114, 116, 121, 125, 129, 131, 136, 138, 141, 145, 147, 149, 151, 154, 154, 156, 156, 159, 157, 160, 160, 160, 159, 157, 157, 155, 156, 155, 153, 153, 152, 152, 149, 151, 149, 147, 148, 146, 146, 145, 145, 142, 144, 141, 141, 139, 139, 137, 137, 133, 133, 131, 131, 129, 129, 128, 126, 125, 124, 123, 122, 121, 119, 119, 117, 117, 115, 115, 114, 113, 110, 109, 107, 106, 103, 102, 100, 99, 98, 95, 95, 93, 94, 94, 93, 94, 94, 96, 98, 99, 101, 103, 107, 108, 113, 115, 119, 122, 126, 129, 133, 137, 139, 144, 146, 151, 153, 156, 159, 162, 164, 166, 168, 169, 170, 172, 172, 174, 172, 174, 172, 171, 170, 168, 166, 162, 160, 156, 153, 148, 145, 139, 136, 130, 126, 121, 115, 111, 104, 101, 96, 91, 88, 83, 80, 76, 73, 70, 69, 66, 63, 63, 62, 62, 62, 62, 62, 64, 65, 69, 71, 73, 78, 81, 87, 92, 96, 102, 107, 114, 121, 125, 132, 138, 145, 149, 156, 162, 167, 172, 177, 182, 185, 190, 192, 196, 198, 200, 201, 201, 202, 201, 202, 201, 198, 198, 193, 192, 189, 184, 181, 175, 171, 166, 161, 154, 149, 142, 138, 131, 126, 121, 114, 109, 102, 99, 93, 89, 85, 81, 78, 74, 73, 70, 69, 68, 68, 66, 66, 65, 68, 66, 69, 70, 72, 73, 77, 78, 81, 84, 87, 89, 94, 95, 100, 103, 108, 111, 115, 117, 122, 124, 129, 131, 134, 137, 140, 142, 145, 146, 148, 149, 152, 153, 153, 154, 154, 153, 154, 154, 154, 153, 154, 153, 154, 153, 153, 152, 153, 152, 153, 153, 152, 152, 151, 152, 151, 151, 149, 151, 149, 147, 147, 145, 145, 144, 142, 140, 138, 137, 134, 133, 130, 130, 126, 125, 123, 122, 118, 117, 115, 114, 111, 111, 108, 108, 106, 106, 103, 103, 101, 101, 100, 99, 99, 98, 96, 98, 95, 96, 95, 98, 98, 99, 99, 101, 101, 104, 107, 108, 111, 113, 116, 119, 123, 126, 130, 133, 137, 140, 144, 146, 148, 153, 154, 157, 161, 162, 164, 167, 167, 168, 168, 168, 169, 167, 167, 166, 163, 160, 159, 155, 153, 148, 146, 142, 138, 134, 130, 126, 121, 118, 113, 109, 104, 102, 96, 94, 89, 87, 84, 81, 78, 77, 74, 73, 72, 72, 71, 70, 72, 72, 74, 74, 78, 80, 83, 87, 89, 95, 99, 104, 109, 115, 119, 126, 132, 138, 141, 148, 153, 159, 162, 168, 171, 177, 179, 183, 185, 189, 189, 191, 192, 192, 193, 191, 192, 190, 189, 186, 185, 182, 179, 175, 172, 169, 166, 161, 156, 153, 147, 144, 137, 133, 128, 124, 117, 114, 108, 104, 100, 96, 92, 89, 86, 83, 79, 78, 76, 74, 73, 72, 72, 71, 72, 72, 73, 73, 76, 77, 79, 80, 81, 85, 86, 89, 92, 95, 99, 101, 103, 108, 110, 115, 117, 122, 125, 128, 131, 133, 138, 139, 142, 144, 147, 148, 152, 153, 154, 155, 155, 156, 156, 157, 156, 157, 156, 157, 155, 156, 155, 155, 155, 153, 154, 152, 153, 151, 152, 151, 149, 149, 148, 146, 146, 144, 144, 141, 140, 139, 137, 136, 133, 132, 131, 129, 128, 125, 124, 123, 119, 119, 117, 116, 115, 114, 111, 110, 108, 108, 104, 104, 102, 102, 100, 100, 98, 98, 98, 95, 96, 95, 96, 95, 98, 98, 99, 101, 102, 103, 107, 109, 111, 114, 116, 119, 122, 126, 128, 132, 133, 138, 140, 142, 146, 147, 149, 153, 154, 156, 157, 160, 161, 163, 163, 166, 164, 167, 166, 167, 164, 164, 164, 161, 161, 159, 155, 153, 149, 147, 142, 139, 134, 131, 125, 123, 117, 114, 108, 106, 100, 96, 93, 88, 87, 84, 80, 78, 76, 74, 72, 70, 70, 69, 70, 69, 70, 70, 72, 74, 77, 79, 83, 86, 89, 93, 99, 103, 108, 114, 118, 125, 130, 137, 141, 148, 154, 159, 164, 168, 172, 177, 179, 183, 186, 186, 190, 190, 192, 191, 193, 191, 192, 190, 190, 187, 187, 184, 183, 178, 177, 174, 169, 166, 162, 156, 153, 148, 141, 138, 132, 125, 122, 115, 111, 104, 101, 95, 93, 87, 85, 81, 80, 77, 76, 73, 73, 72, 72, 72, 72, 73, 73, 76, 74, 77, 78, 80, 80, 84, 85, 87, 89, 91, 95, 96, 101, 102, 107, 109, 114, 117, 119, 123, 128, 130, 134, 137, 140, 142, 146, 147, 149, 151, 153, 153, 155, 154, 156, 156, 155, 156, 155, 156, 156, 155, 154, 155, 154, 155, 154, 155, 154, 154, 154, 153, 153, 152, 151, 151, 148, 148, 146, 146, 144, 142, 140, 139, 137, 136, 133, 132, 130, 129, 126, 125, 124, 122, 121, 118, 117, 115, 114, 113, 110, 109, 107, 106, 104, 102, 101, 100, 98, 99, 96, 98, 98, 98, 96, 98, 98, 100, 100, 103, 103, 107, 108, 110, 111, 115, 116, 119, 121, 124, 126, 129, 130, 133, 134, 138, 139, 142, 144, 146, 148, 149, 152, 154, 156, 157, 159, 159, 161, 161, 161, 162, 160, 160, 160, 157, 156, 153, 152, 148, 146, 141, 139, 136, 132, 128, 124, 121, 116, 113, 109, 106, 102, 100, 95, 94, 91, 89, 86, 86, 84, 83, 80, 80, 80, 79, 78, 79, 80, 80, 83, 84, 85, 88, 89, 94, 98, 101, 106, 109, 116, 121, 124, 131, 137, 140, 147, 151, 156, 160, 166, 168, 171, 176, 178, 182, 182, 183, 185, 185, 186, 185, 186, 185, 183, 183, 181, 179, 176, 175, 171, 169, 164, 162, 157, 155, 151, 146, 142, 138, 132, 129, 122, 118, 113, 109, 103, 101, 95, 93, 88, 86, 83, 81, 79, 77, 74, 76, 74, 74, 74, 73, 76, 77, 77, 79, 79, 81, 83, 86, 88, 89, 93, 95, 96, 101, 102, 107, 108, 113, 115, 119, 122, 126, 128, 132, 134, 138, 141, 142, 146, 147, 151, 152, 153, 154, 155, 156, 157, 157, 157, 156, 157, 157, 156, 157, 156, 157, 155, 156, 155, 155, 155, 153, 153, 152, 151, 149, 147, 147, 145, 144, 141, 139, 138, 134, 133, 132, 130, 126, 126, 123, 123, 119, 119, 117, 117, 115, 115, 113, 113, 111, 110, 109, 107, 107, 104, 104, 103, 103, 101, 101, 100, 100, 99, 100, 100, 99, 100, 100, 102, 102, 104, 107, 108, 109, 113, 114, 117, 119, 123, 125, 128, 131, 132, 136, 138, 140, 142, 145, 146, 149, 151, 153, 154, 156, 157, 160, 159, 161, 161, 162, 162, 163, 162, 161, 161, 159, 157, 155, 154, 152, 147, 146, 141, 139, 134, 132, 128, 125, 121, 116, 114, 109, 107, 103, 101, 98, 94, 92, 88, 87, 86, 84, 81, 79, 79, 78, 78, 77, 76, 77, 78, 77, 80, 81, 84, 86, 88, 93, 95, 100, 104, 108, 114, 119, 123, 129, 133, 139, 145, 148, 154, 157, 162, 167, 169, 172, 176, 177, 181, 183, 183, 185, 185, 185, 186, 185, 185, 185, 183, 183, 181, 177, 176, 174, 170, 168, 164, 160, 157, 153, 147, 145, 139, 136, 129, 125, 119, 116, 111, 108, 102, 100, 95, 93, 88, 87, 84, 83, 80, 78, 78, 77, 76, 77, 76, 77, 76, 78, 78, 80, 80, 83, 83, 86, 87, 91, 92, 95, 96, 100, 102, 106, 109, 111, 115, 118, 122, 125, 128, 130, 134, 137, 139, 141, 145, 145, 148, 149, 152, 152, 154, 154, 155, 155, 156, 156, 155, 156, 155, 156, 154, 154, 155, 153, 154, 153, 153, 152, 152, 152, 149, 151, 149, 147, 147, 145, 145, 144, 141, 140, 138, 138, 136, 132, 132, 129, 128, 124, 124, 121, 119, 118, 115, 114, 113, 109, 109, 107, 107, 106, 102, 103, 102, 100, 100, 100, 99, 99, 99, 98, 100, 99, 101, 100, 102, 102, 106, 106, 109, 111, 111, 115, 116, 121, 123, 125, 128, 130, 132, 136, 137, 140, 140, 144, 145, 148, 148, 152, 152, 154, 155, 155, 157, 156, 159, 157, 159, 157, 157, 156, 156, 154, 153, 151, 148, 146, 142, 140, 136, 133, 129, 126, 123, 118, 116, 113, 108, 106, 101, 100, 95, 94, 93, 91, 89, 87, 87, 85, 86, 84, 85, 85, 86, 86, 87, 87, 89, 91, 93, 94, 98, 100, 101, 106, 108, 113, 115, 121, 123, 129, 133, 137, 141, 145, 151, 153, 159, 162, 164, 168, 170, 174, 175, 176, 178, 178, 177, 178, 178, 176, 177, 175, 174, 171, 170, 168, 166, 162, 161, 156, 155, 152, 147, 145, 140, 138, 134, 131, 128, 124, 118, 116, 113, 109, 106, 103, 99, 98, 95, 92, 92, 88, 88, 87, 86, 86, 86, 85, 86, 85, 87, 87, 87, 89, 89, 89, 92, 92, 95, 96, 98, 100, 102, 103, 107, 108, 111, 114, 117, 121, 122, 126, 128, 132, 133, 137, 139, 140, 144, 145, 145, 147, 147, 149, 148, 151, 149, 151, 149, 151, 149, 151, 151, 149, 152, 151, 152, 152, 152, 152, 152, 152, 151, 152, 151, 151, 148, 149, 147, 146, 145, 141, 141, 138, 137, 134, 133, 130, 129, 125, 125, 123, 121, 119, 117, 117, 114, 114, 111, 111, 109, 109, 108, 108, 106, 106, 104, 102, 103, 102, 100, 101, 100, 100, 99, 101, 100, 102, 102, 102, 106, 107, 108, 111, 113, 116, 118, 119, 124, 125, 130, 131, 134, 137, 140, 141, 144, 147, 148, 152, 153, 154, 156, 156, 159, 160, 160, 161, 161, 160, 161, 159, 159, 156, 156, 154, 153, 149, 148, 144, 142, 138, 136, 131, 129, 124, 122, 117, 115, 111, 109, 106, 102, 99, 96, 93, 92, 88, 88, 86, 85, 84, 83, 81, 81, 81, 81, 81, 81, 83, 84, 86, 88, 91, 93, 95, 99, 102, 107, 110, 114, 118, 123, 128, 131, 134, 140, 142, 148, 151, 155, 159, 162, 164, 167, 168, 171, 171, 175, 175, 176, 176, 177, 177, 177, 176, 177, 175, 174, 174, 171, 170, 168, 164, 163, 160, 157, 154, 149, 147, 144, 139, 136, 131, 128, 124, 118, 116, 111, 109, 106, 101, 100, 95, 94, 92, 91, 89, 87, 87, 86, 85, 86, 85, 86, 85, 86, 87, 86, 88, 88, 89, 89, 92, 92, 94, 95, 98, 98, 100, 101, 104, 104, 108, 109, 113, 115, 118, 119, 123, 125, 129, 131, 133, 137, 138, 140, 141, 145, 145, 148, 149, 151, 151, 152, 152, 153, 153, 154, 154, 154, 154, 155, 155, 154, 155, 154, 155, 155, 154, 155, 154, 154, 153, 154, 153, 151, 151, 148, 148, 146, 145, 142, 141, 139, 136, 132, 131, 128, 125, 122, 121, 117, 116, 114, 111, 108, 107, 106, 103, 103, 101, 101, 99, 100, 98, 99, 99, 98, 99, 98, 100, 99, 101, 102, 101, 104, 104, 107, 108, 110, 111, 115, 117, 119, 121, 124, 125, 130, 131, 134, 136, 139, 140, 144, 146, 147, 149, 151, 153, 154, 154, 155, 156, 155, 156, 155, 156, 154, 155, 153, 152, 149, 149, 146, 145, 141, 140, 137, 133, 131, 128, 125, 123, 118, 116, 113, 110, 108, 104, 102, 100, 98, 96, 94, 93, 92, 91, 91, 89, 89, 91, 91, 89, 92, 92, 94, 95, 96, 98, 101, 102, 106, 107, 111, 113, 117, 119, 124, 128, 130, 136, 138, 142, 145, 149, 152, 154, 157, 160, 163, 164, 166, 168, 168, 169, 170, 169, 170, 168, 169, 167, 167, 164, 164, 163, 161, 160, 156, 156, 153, 152, 149, 146, 145, 140, 139, 134, 133, 129, 126, 124, 121, 117, 114, 111, 108, 106, 102, 100, 96, 96, 93, 93, 91, 91, 89, 91, 89, 89, 91, 89, 92, 91, 93, 94, 94, 96, 96, 98, 100, 100, 102, 102, 104, 106, 108, 109, 111, 111, 115, 117, 118, 122, 124, 125, 129, 130, 133, 134, 137, 138, 141, 141, 145, 145, 147, 147, 149, 149, 152, 152, 152, 153, 152, 153, 152, 153, 152, 152, 152, 151, 151, 149, 149, 149, 147, 148, 147, 145, 145, 142, 142, 141, 140, 138, 136, 136, 132, 132, 129, 128, 125, 124, 122, 121, 118, 116, 115, 113, 111, 109, 108, 106, 106, 103, 103, 101, 102, 100, 101, 101, 100, 101, 101, 102, 102, 104, 104, 108, 108, 111, 114, 114, 117, 118, 122, 124, 125, 129, 130, 133, 136, 136, 139, 141, 141, 144, 145, 147, 148, 148, 151, 149, 152, 152, 153, 153, 153, 154, 153, 154, 153, 152, 152, 149, 149, 147, 146, 145, 141, 140, 137, 134, 131, 129, 125, 122, 119, 115, 113, 109, 107, 104, 100, 99, 95, 94, 92, 91, 88, 88, 86, 87, 86, 86, 87, 86, 88, 87, 89, 91, 92, 94, 95, 99, 100, 103, 106, 108, 111, 114, 118, 121, 125, 129, 131, 137, 139, 144, 148, 151, 155, 157, 162, 163, 167, 168, 171, 172, 175, 175, 176, 177, 176, 176, 175, 175, 174, 170, 170, 168, 166, 163, 161, 157, 154, 153, 148, 146, 142, 140, 136, 134, 130, 128, 124, 122, 119, 115, 114, 110, 107, 106, 102, 101, 98, 96, 94, 93, 91, 91, 89, 89, 88, 88, 88, 87, 88, 88, 89, 89, 92, 92, 92, 94, 94, 96, 96, 100, 101, 101, 104, 104, 108, 110, 111, 115, 116, 119, 121, 124, 126, 128, 131, 133, 137, 139, 140, 142, 144, 147, 147, 149, 151, 153, 152, 154, 154, 155, 155, 156, 155, 156, 155, 156, 155, 156, 154, 155, 154, 154, 153, 152, 152, 151, 148, 148, 145, 145, 142, 140, 139, 136, 136, 133, 130, 129, 125, 125, 123, 119, 119, 116, 115, 114, 111, 110, 108, 108, 106, 106, 104, 103, 101, 101, 101, 100, 100, 99, 98, 99, 99, 100, 100, 102, 103, 104, 106, 108, 109, 113, 114, 117, 118, 123, 125, 126, 130, 132, 136, 138, 139, 142, 142, 146, 147, 147, 149, 149, 152, 153, 153, 154, 154, 154, 153, 154, 153, 154, 152, 153, 152, 151, 148, 147, 145, 142, 140, 137, 136, 131, 130, 125, 123, 119, 117, 113, 110, 107, 104, 102, 99, 99, 95, 95, 93, 93, 92, 89, 91, 91, 89, 91, 91, 93, 93, 94, 94, 98, 98, 101, 103, 104, 108, 109, 113, 116, 119, 123, 125, 129, 132, 136, 139, 142, 145, 149, 151, 155, 156, 160, 161, 163, 164, 167, 167, 168, 168, 169, 168, 169, 167, 168, 166, 166, 163, 163, 161, 160, 157, 156, 153, 152, 149, 146, 145, 140, 139, 134, 132, 129, 124, 122, 118, 116, 113, 108, 107, 102, 101, 99, 96, 95, 93, 92, 91, 89, 89, 89, 88, 89, 88, 89, 89, 91, 91, 93, 93, 95, 96, 96, 99, 99, 102, 103, 104, 108, 109, 113, 115, 116, 119, 122, 124, 126, 130, 131, 134, 137, 138, 141, 142, 144, 146, 146, 148, 148, 151, 149, 152, 151, 152, 152, 153, 152, 153, 152, 153, 151, 152, 152, 151, 151, 149, 149, 147, 148, 146, 146, 144, 142, 140, 140, 137, 137, 133, 133, 130, 130, 126, 126, 123, 123, 119, 119, 117, 117, 115, 115, 111, 111, 110, 110, 109, 107, 107, 106, 104, 104, 104, 102, 103, 103, 102, 103, 103, 104, 104, 107, 108, 108, 111, 113, 114, 117, 117, 121, 122, 125, 128, 129, 132, 133, 137, 138, 140, 141, 144, 145, 147, 148, 149, 149, 152, 152, 153, 154, 153, 154, 154, 153, 154, 153, 153, 153, 152, 148, 148, 145, 145, 140, 138, 137, 132, 131, 126, 124, 119, 117, 113, 110, 108, 103, 102, 99, 95, 94, 93, 91, 89, 87, 87, 86, 86, 86, 85, 86, 86, 86, 88, 88, 91, 92, 94, 96, 98, 102, 103, 108, 111, 114, 118, 123, 125, 130, 133, 138, 141, 146, 151, 153, 157, 159, 163, 164, 168, 169, 172, 174, 174, 176, 176, 177, 177, 176, 176, 175, 174, 172, 171, 168, 168, 164, 163, 160, 157, 154, 152, 147, 145, 140, 138, 133, 131, 126, 123, 121, 116, 114, 109, 106, 104, 100, 99, 96, 94, 93, 91, 88, 88, 86, 86, 86, 84, 85, 84, 85, 84, 86, 85, 87, 87, 89, 89, 92, 93, 94, 96, 98, 101, 102, 106, 108, 109, 114, 115, 118, 121, 124, 125, 130, 131, 134, 137, 138, 140, 142, 142, 146, 146, 148, 149, 151, 151, 152, 152, 154, 153, 155, 155, 156, 155, 156, 155, 157, 157, 157, 155, 156, 155, 155, 154, 152, 152, 149, 149, 146, 146, 144, 141, 140, 137, 136, 132, 131, 130, 128, 125, 122, 122, 119, 117, 116, 114, 114, 111, 110, 109, 107, 107, 106, 103, 103, 101, 102, 101, 99, 100, 99, 100, 100, 99, 101, 100, 102, 103, 104, 106, 108, 109, 113, 114, 117, 118, 122, 124, 128, 129, 132, 133, 137, 139, 140, 144, 144, 147, 147, 149, 149, 152, 152, 153, 153, 154, 154, 153, 154, 154, 153, 153, 151, 151, 148, 146, 146, 142, 141, 139, 136, 134, 130, 129, 124, 123, 118, 117, 113, 111, 109, 106, 102, 101, 99, 98, 95, 94, 92, 92, 91, 89, 91, 89, 91, 89, 92, 91, 93, 94, 96, 98, 100, 101, 104, 108, 110, 113, 117, 119, 124, 128, 131, 134, 137, 141, 144, 148, 151, 155, 157, 160, 161, 164, 164, 168, 169, 168, 170, 170, 169, 170, 169, 169, 169, 167, 167, 164, 162, 161, 160, 156, 155, 152, 149, 146, 144, 140, 138, 134, 132, 128, 125, 122, 119, 115, 114, 110, 107, 104, 101, 100, 98, 96, 94, 94, 92, 92, 89, 91, 91, 89, 91, 89, 91, 92, 91, 93, 92, 94, 94, 96, 96, 99, 100, 102, 104, 104, 108, 110, 111, 113, 116, 117, 121, 123, 126, 129, 130, 133, 134, 138, 139, 140, 144, 144, 146, 147, 147, 149, 149, 151, 151, 152, 151, 152, 151, 152, 152, 151, 152, 151, 152, 151, 151, 151, 149, 149, 148, 148, 147, 145, 145, 142, 142, 141, 138, 138, 136, 132, 132, 129, 128, 125, 124, 122, 119, 118, 116, 115, 113, 113, 111, 110, 109, 107, 107, 106, 104, 106, 103, 104, 103, 104, 103, 104, 103, 106, 104, 107, 107, 109, 109, 110, 114, 114, 117, 117, 121, 123, 124, 128, 129, 132, 132, 136, 137, 140, 140, 144, 145, 145, 147, 149, 149, 151, 152, 151, 153, 152, 152, 153, 152, 153, 151, 151, 149, 149, 147, 146, 145, 141, 140, 137, 136, 131, 130, 125, 123, 118, 117, 114, 110, 107, 104, 101, 100, 96, 95, 93, 92, 91, 89, 88, 89, 88, 89, 88, 89, 89, 92, 92, 94, 94, 96, 98, 101, 101, 104, 108, 110, 111, 116, 118, 123, 125, 130, 132, 137, 140, 144, 148, 151, 155, 159, 162, 163, 167, 169, 170, 172, 172, 175, 174, 175, 174, 175, 172, 172, 170, 170, 167, 167, 163, 161, 160, 156, 154, 152, 148, 146, 141, 140, 137, 132, 130, 126, 123, 119, 117, 113, 110, 106, 104, 101, 98, 96, 93, 93, 89, 89, 87, 87, 87, 86, 87, 87, 86, 87, 87, 88, 88, 89, 92, 92, 94, 94, 98, 98, 100, 101, 103, 106, 107, 110, 111, 115, 117, 118, 122, 123, 126, 130, 131, 134, 136, 139, 140, 141, 144, 145, 147, 148, 148, 151, 151, 152, 152, 153, 153, 154, 154, 155, 154, 154, 155, 155, 155, 155, 154, 155, 154, 153, 153, 151, 151, 148, 147, 146, 144, 142, 141, 138, 137, 133, 132, 130, 129, 126, 124, 121, 121, 117, 115, 115, 111, 111, 108, 108, 107, 104, 104, 102, 102, 100, 100, 98, 99, 98, 98, 96, 98, 98, 99, 99, 101, 101, 104, 104, 108, 109, 113, 114, 116, 121, 122, 125, 128, 131, 132, 137, 138, 141, 144, 146, 147, 149, 152, 153, 154, 154, 156, 156, 157, 157, 159, 157, 159, 156, 157, 155, 155, 154, 151, 151, 148, 146, 142, 139, 137, 134, 131, 128, 123, 121, 116, 115, 111, 107, 106, 101, 100, 96, 95, 92, 92, 89, 89, 88, 88, 86, 87, 87, 88, 87, 89, 89, 92, 94, 94, 98, 99, 102, 104, 106, 110, 113, 115, 119, 122, 126, 129, 133, 136, 140, 142, 147, 149, 154, 155, 160, 161, 164, 166, 168, 170, 170, 172, 171, 174, 172, 172, 171, 171, 170, 168, 167, 164, 163, 161, 157, 156, 153, 149, 147, 144, 141, 138, 133, 132, 128, 125, 123, 118, 116, 113, 110, 107, 106, 102, 101, 99, 96, 94, 94, 93, 91, 91, 89, 89, 88, 88, 89, 89, 91, 92, 93, 94, 95, 95, 99, 99, 101, 102, 106, 107, 108, 111, 113, 114, 117, 118, 121, 122, 125, 125, 129, 131, 132, 132, 136, 136, 138, 138, 140, 141, 142, 144, 144, 145, 145, 145, 147, 147, 148, 148, 149, 148, 151, 149, 151, 151, 152, 151, 151, 149, 151, 151, 148, 148, 148, 146, 146, 145, 141, 141, 140, 137, 136, 133, 132, 130, 129, 125, 125, 123, 121, 119, 118, 115, 115, 114, 113, 110, 109, 107, 107, 104, 106, 103, 103, 102, 102, 101, 101, 102, 101, 102, 103, 104, 104, 107, 107, 109, 110, 114, 115, 118, 119, 122, 125, 126, 130, 131, 134, 136, 138, 141, 142, 145, 147, 148, 149, 149, 152, 153, 153, 153, 154, 154, 154, 153, 153, 152, 152, 151, 148, 148, 146, 145, 142, 139, 138, 134, 132, 130, 125, 124, 119, 117, 115, 110, 109, 106, 102, 101, 98, 96, 95, 93, 92, 91, 88, 89, 87, 88, 87, 88, 89, 89, 92, 92, 94, 95, 98, 99, 102, 104, 108, 110, 114, 116, 121, 124, 126, 132, 136, 139, 142, 146, 148, 153, 155, 159, 160, 162, 166, 167, 169, 169, 171, 171, 172, 171, 172, 171, 171, 170, 169, 167, 167, 164, 163, 161, 157, 156, 153, 151, 148, 144, 142, 138, 136, 131, 130, 125, 123, 118, 116, 113, 110, 108, 103, 102, 99, 98, 95, 94, 92, 91, 88, 89, 88, 88, 87, 86, 87, 88, 88, 88, 89, 89, 92, 92, 95, 95, 98, 100, 101, 104, 104, 108, 109, 113, 116, 118, 121, 123, 124, 128, 129, 132, 134, 136, 137, 140, 140, 142, 142, 146, 146, 148, 147, 149, 149, 151, 151, 152, 152, 153, 153, 154, 154, 153, 154, 153, 154, 152, 153, 151, 152, 149, 149, 148, 146, 146, 144, 142, 140, 140, 138, 136, 134, 132, 131, 129, 128, 125, 125, 122, 122, 118, 118, 117, 114, 114, 111, 111, 108, 108, 107, 106, 104, 102, 102, 100, 101, 99, 100, 99, 100, 100, 100, 101, 101, 103, 103, 106, 108, 108, 111, 113, 116, 117, 121, 122, 126, 128, 130, 133, 134, 138, 139, 142, 144, 147, 147, 151, 151, 153, 153, 155, 154, 156, 156, 156, 155, 156, 154, 155, 153, 153, 151, 149, 147, 146, 144, 140, 139, 136, 134, 131, 129, 125, 123, 119, 117, 113, 111, 107, 106, 102, 101, 98, 95, 94, 92, 89, 89, 88, 87, 87, 87, 86, 88, 87, 89, 91, 93, 95, 96, 100, 101, 104, 107, 110, 113, 117, 121, 122, 126, 129, 133, 136, 140, 141, 146, 149, 152, 154, 156, 160, 162, 163, 166, 167, 168, 170, 169, 171, 170, 171, 171, 170, 169, 169, 166, 166, 163, 160, 159, 155, 153, 149, 147, 144, 140, 138, 133, 131, 126, 124, 121, 118, 115, 113, 109, 106, 104, 101, 101, 98, 98, 94, 94, 92, 92, 91, 91, 89, 91, 91, 89, 92, 91, 93, 94, 94, 96, 96, 100, 100, 102, 103, 107, 107, 110, 111, 114, 115, 118, 121, 121, 124, 125, 128, 130, 130, 133, 133, 137, 138, 138, 140, 140, 142, 142, 145, 145, 146, 146, 147, 146, 147, 147, 148, 147, 148, 147, 148, 146, 147, 147, 147, 147, 146, 146, 145, 145, 144, 144, 144, 142, 141, 140, 139, 139, 136, 136, 133, 133, 131, 130, 129, 126, 125, 122, 122, 121, 119, 117, 115, 115, 114, 113, 113, 110, 110, 109, 110, 108, 109, 109, 109, 108, 109, 109, 109, 109, 110, 110, 110, 111, 113, 113, 114, 115, 116, 116, 119, 119, 122, 123, 126, 126, 130, 131, 132, 136, 137, 139, 141, 141, 144, 145, 147, 146, 148, 148, 149, 148, 149, 148, 149, 148, 148, 147, 146, 146, 142, 142, 140, 139, 137, 136, 132, 131, 128, 126, 124, 121, 118, 115, 114, 110, 108, 106, 103, 101, 100, 96, 96, 94, 94, 93, 91, 92, 91, 91, 93, 92, 94, 94, 98, 99, 100, 103, 104, 108, 110, 113, 115, 118, 121, 125, 128, 130, 134, 137, 141, 144, 147, 151, 152, 155, 159, 161, 162, 163, 166, 168, 169, 169, 169, 170, 170, 169, 168, 168, 166, 166, 163, 162, 160, 157, 156, 153, 149, 148, 145, 142, 139, 137, 133, 131, 126, 124, 119, 117, 115, 110, 109, 104, 103, 100, 98, 95, 94, 92, 89, 89, 87, 88, 86, 87, 86, 88, 87, 89, 91, 91, 94, 94, 96, 98, 100, 101, 103, 106, 107, 109, 110, 114, 115, 116, 119, 121, 124, 125, 126, 130, 131, 134, 136, 138, 139, 141, 142, 145, 145, 148, 147, 149, 149, 151, 149, 152, 152, 151, 149, 151, 148, 149, 148, 148, 147, 147, 146, 146, 146, 145, 144, 144, 141, 142, 141, 140, 139, 139, 137, 137, 136, 133, 131, 131, 128, 128, 126, 123, 123, 121, 121, 118, 118, 116, 116, 114, 114, 114, 111, 111, 110, 110, 110, 110, 108, 109, 108, 108, 107, 108, 107, 108, 108, 108, 107, 109, 109, 110, 110, 113, 114, 116, 116, 119, 122, 123, 124, 128, 129, 131, 133, 136, 137, 139, 140, 140, 142, 142, 145, 145, 146, 146, 147, 148, 148, 147, 149, 148, 149, 147, 148, 148, 147, 147, 145, 145, 142, 141, 140, 137, 137, 133, 131, 129, 126, 123, 121, 117, 115, 111, 110, 108, 104, 103, 101, 100, 98, 95, 95, 95, 94, 93, 94, 93, 94, 94, 95, 95, 98, 98, 100, 101, 103, 104, 108, 109, 113, 115, 117, 121, 123, 128, 130, 133, 137, 140, 141, 146, 148, 152, 153, 157, 159, 161, 162, 164, 164, 167, 168, 167, 168, 168, 167, 167, 166, 166, 163, 162, 160, 159, 155, 154, 151, 149, 146, 144, 140, 138, 134, 132, 129, 125, 123, 118, 116, 113, 110, 107, 106, 102, 101, 98, 98, 94, 94, 92, 93, 92, 92, 91, 92, 91, 93, 92, 94, 95, 96, 98, 99, 101, 101, 104, 104, 108, 109, 110, 113, 114, 117, 119, 121, 123, 125, 125, 129, 130, 132, 133, 136, 136, 138, 138, 140, 140, 141, 141, 142, 142, 144, 142, 145, 145, 144, 145, 145, 144, 145, 144, 145, 144, 145, 144, 144, 142, 144, 142, 141, 141, 140, 140, 139, 139, 137, 137, 136, 134, 134, 132, 132, 130, 130, 128, 128, 128, 125, 125, 124, 123, 123, 121, 121, 119, 119, 118, 117, 117, 116, 115, 115, 113, 114, 113, 111, 111, 110, 110, 109, 110, 109, 110, 109, 111, 110, 113, 113, 115, 115, 117, 117, 119, 121, 123, 125, 125, 128, 130, 130, 132, 133, 136, 136, 138, 138, 140, 141, 142, 142, 145, 144, 146, 145, 146, 145, 146, 145, 146, 145, 145, 142, 144, 141, 140, 139, 137, 136, 132, 131, 129, 125, 124, 121, 119, 116, 115, 111, 110, 107, 106, 103, 102, 101, 100, 99, 98, 96, 95, 95, 95, 95, 95, 96, 96, 96, 99, 99, 101, 102, 104, 107, 108, 111, 115, 116, 121, 123, 126, 129, 132, 137, 139, 144, 145, 149, 153, 154, 157, 159, 162, 164, 164, 167, 167, 169, 169, 169, 169, 168, 168, 167, 166, 164, 163, 161, 159, 155, 154, 151, 148, 145, 144, 140, 136, 134, 130, 129, 125, 122, 118, 116, 113, 111, 108, 104, 103, 101, 100, 98, 95, 95, 94, 93, 93, 92, 91, 92, 91, 92, 92, 93, 93, 94, 94, 96, 96, 100, 100, 103, 103, 107, 107, 110, 111, 115, 117, 117, 121, 122, 125, 128, 129, 132, 132, 136, 137, 138, 140, 140, 142, 142, 145, 144, 146, 146, 146, 147, 146, 147, 146, 147, 147, 145, 146, 145, 146, 146, 146, 145, 145, 144, 145, 144, 144, 144, 142, 142, 140, 141, 139, 139, 137, 137, 134, 134, 133, 130, 130, 129, 128, 125, 125, 123, 123, 122, 119, 119, 118, 117, 117, 116, 116, 115, 114, 114, 113, 113, 113, 110, 110, 109, 109, 108, 108, 107, 108, 108, 108, 107, 108, 109, 109, 111, 111, 114, 114, 117, 118, 121, 123, 125, 126, 128, 131, 132, 134, 136, 138, 138, 141, 141, 144, 144, 145, 146, 147, 146, 148, 147, 148, 147, 148, 147, 147, 147, 146, 144, 145, 141, 141, 139, 138, 137, 133, 132, 129, 128, 124, 123, 119, 117, 114, 113, 109, 109, 106, 104, 103, 101, 101, 99, 99, 96, 98, 98, 98, 98, 98, 96, 99, 99, 101, 101, 103, 106, 106, 109, 110, 114, 115, 119, 121, 125, 128, 130, 133, 136, 139, 141, 142, 147, 147, 151, 152, 154, 155, 157, 157, 160, 160, 160, 161, 160, 161, 160, 161, 160, 160, 159, 159, 156, 156, 153, 153, 149, 149, 147, 142, 141, 138, 134, 133, 129, 126, 123, 121, 117, 115, 110, 109, 106, 104, 103, 102, 100, 99, 99, 96, 98, 96, 98, 96, 98, 96, 99, 98, 100, 100, 101, 101, 103, 103, 103, 106, 107, 108, 109, 111, 113, 114, 116, 117, 119, 122, 123, 125, 126, 130, 130, 133, 133, 136, 136, 137, 139, 139, 140, 140, 141, 141, 141, 141, 141, 140, 141, 140, 141, 140, 141, 141, 140, 141, 140, 141, 140, 141, 140, 141, 139, 140, 139, 139, 138, 138, 136, 136, 134, 134, 132, 132, 131, 131, 129, 129, 128, 128, 125, 126, 124, 125, 124, 123, 123, 122, 122, 119, 121, 118, 119, 117, 117, 116, 115, 115, 114, 114, 113, 114, 111, 113, 111, 114, 114, 113, 115, 115, 116, 117, 117, 119, 121, 122, 123, 123, 126, 128, 129, 130, 131, 132, 133, 134, 133, 136, 136, 138, 138, 139, 139, 140, 140, 141, 141, 142, 141, 142, 142, 141, 142, 141, 141, 140, 140, 139, 136, 136, 133, 132, 130, 129, 126, 124, 121, 121, 117, 116, 113, 111, 108, 108, 104, 104, 101, 101, 99, 100, 98, 98, 99, 98, 99, 99, 100, 100, 102, 102, 106, 106, 109, 109, 113, 114, 116, 119, 122, 123, 128, 129, 132, 133, 138, 139, 142, 144, 147, 148, 152, 153, 155, 156, 159, 159, 161, 161, 163, 163, 163, 162, 163, 161, 162, 160, 160, 157, 156, 154, 153, 149, 148, 146, 142, 140, 137, 136, 133, 130, 126, 125, 121, 119, 117, 114, 113, 109, 108, 104, 104, 101, 101, 99, 99, 96, 96, 95, 94, 95, 94, 95, 95, 94, 96, 95, 98, 99, 100, 100, 102, 102, 104, 106, 108, 109, 111, 114, 116, 117, 119, 121, 124, 124, 128, 130, 130, 133, 133, 137, 137, 139, 139, 141, 142, 142, 144, 144, 145, 144, 145, 144, 145, 145, 144, 145, 145, 142, 144, 144, 144, 144, 144, 144, 142, 144, 142, 142, 142, 141, 141, 140, 140, 139, 137, 137, 136, 134, 132, 130, 130, 128, 128, 125, 125, 123, 123, 121, 121, 121, 118, 119, 118, 118, 118, 117, 116, 116, 116, 116, 115, 115, 113, 114, 113, 111, 111, 110, 111, 110, 111, 110, 113, 113, 113, 115, 115, 117, 117, 119, 121, 122, 124, 125, 126, 129, 130, 130, 133, 133, 136, 136, 137, 139, 140, 139, 141, 141, 142, 144, 142, 145, 145, 144, 145, 144, 144, 144, 141, 141, 139, 139, 137, 134, 134, 131, 130, 128, 126, 123, 123, 119, 119, 117, 115, 115, 113, 110, 110, 108, 108, 106, 106, 104};&lt;br /&gt;
const uint16_t sizeMusique=sizeof musique;&lt;br /&gt;
// pour lire le tableau, avec i variant de 0 à sizeMusique&lt;br /&gt;
// OCR4A=pgm_read_byte(musique+i)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Jouons des notes=&lt;br /&gt;
&lt;br /&gt;
On va réaliser un modeste piano en utilisant 4 boutons.&lt;br /&gt;
&lt;br /&gt;
Connectez ces 4 boutons à votre carte Leonardo, en utilisant 1 seul PORT :&lt;br /&gt;
&lt;br /&gt;
[[Media:LeonardoPinout.pdf]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Question|Ecrire un programme qui change la fréquence de la sinusoïde (valeur de OCR1A) suivant le bouton appuyé.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Note || Do || Do# || Ré || Ré# || Mi || Fa || Fa# || Sol || Sol# || La || La# || Si&lt;br /&gt;
|-&lt;br /&gt;
! Fréquence (Hz) || 261,63 || 277,18 || 293,66 || 311,13 || 329,63 || 349,23 || 369,99 || 392 || 415,3 || 440 || 466,16 || 493,88&lt;br /&gt;
|-&lt;br /&gt;
! Période (µs)   || 3822   || 3608   || 3405   || 3214   || 3037   || 2863   || 2703   || 2551|| 2408  || 2273|| 2145   || 2025&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Stevie Wonder - I'm free=&lt;br /&gt;
&lt;br /&gt;
Les premières secondes de cette chanson échantillonnée à 4kHz :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
const uint8_t musique[] PROGMEM={127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 127, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 127, 128, 127, 127, 127, 128, 128, 128, 129, 131, 136, 139, 139, 143, 141, 142, 144, 141, 139, 137, 137, 126, 122, 117, 100, 96, 86, 86, 84, 83, 85, 87, 88, 90, 90, 94, 98, 103, 108, 121, 130, 144, 143, 152, 161, 170, 178, 182, 189, 191, 195, 194, 194, 194, 191, 187, 181, 176, 169, 163, 158, 149, 141, 131, 125, 119, 112, 107, 98, 92, 89, 86, 83, 85, 83, 84, 85, 86, 88, 88, 93, 96, 98, 100, 102, 106, 109, 109, 109, 108, 108, 109, 112, 116, 124, 128, 132, 138, 142, 146, 152, 156, 159, 164, 168, 170, 171, 169, 168, 166, 164, 161, 158, 156, 152, 147, 141, 137, 128, 121, 117, 111, 108, 106, 102, 97, 92, 88, 83, 83, 82, 84, 84, 91, 93, 93, 95, 97, 99, 104, 108, 112, 115, 116, 116, 116, 121, 123, 126, 130, 137, 142, 146, 151, 153, 154, 160, 158, 160, 158, 159, 160, 162, 164, 164, 162, 161, 159, 157, 158, 161, 164, 170, 171, 170, 170, 163, 163, 159, 160, 157, 157, 153, 146, 138, 135, 127, 126, 121, 125, 123, 124, 121, 118, 120, 120, 115, 117, 114, 113, 112, 111, 104, 98, 97, 90, 86, 82, 83, 79, 85, 88, 86, 87, 92, 88, 95, 95, 100, 98, 106, 103, 104, 112, 118, 110, 115, 115, 117, 114, 125, 130, 137, 155, 158, 152, 150, 142, 137, 137, 143, 144, 147, 153, 135, 124, 116, 112, 107, 123, 137, 143, 153, 157, 142, 140, 134, 132, 128, 138, 137, 131, 131, 120, 105, 107, 101, 99, 99, 109, 108, 111, 126, 117, 117, 125, 122, 120, 121, 128, 128, 133, 140, 128, 130, 123, 116, 115, 126, 131, 133, 150, 152, 149, 157, 152, 153, 153, 162, 159, 157, 165, 154, 150, 150, 140, 139, 139, 143, 138, 146, 158, 147, 157, 155, 148, 147, 149, 150, 145, 155, 154, 138, 139, 124, 112, 105, 109, 106, 108, 121, 115, 111, 115, 105, 102, 103, 109, 102, 104, 111, 96, 96, 97, 87, 85, 87, 88, 83, 95, 99, 89, 100, 99, 95, 93, 98, 96, 99, 116, 114, 111, 123, 118, 115, 119, 130, 129, 144, 159, 157, 160, 168, 159, 160, 167, 169, 167, 181, 188, 180, 189, 188, 181, 181, 185, 179, 176, 184, 177, 165, 168, 153, 143, 138, 140, 128, 134, 137, 125, 118, 117, 99, 91, 91, 94, 87, 98, 95, 84, 82, 80, 68, 68, 76, 76, 80, 92, 91, 84, 93, 90, 91, 99, 111, 110, 122, 132, 127, 124, 133, 124, 127, 134, 141, 138, 154, 154, 147, 146, 146, 134, 136, 143, 144, 147, 161, 160, 157, 160, 158, 148, 154, 156, 150, 153, 159, 151, 144, 145, 134, 130, 133, 136, 130, 141, 141, 132, 126, 126, 110, 109, 113, 114, 113, 126, 120, 114, 110, 107, 92, 95, 99, 98, 104, 114, 109, 107, 110, 108, 100, 108, 107, 103, 110, 113, 107, 104, 107, 99, 99, 105, 106, 107, 121, 125, 124, 124, 130, 118, 122, 125, 125, 130, 142, 142, 145, 145, 149, 139, 149, 149, 146, 151, 154, 147, 142, 141, 137, 130, 140, 135, 137, 147, 147, 145, 143, 144, 132, 132, 134, 127, 129, 137, 132, 132, 129, 131, 117, 123, 122, 120, 128, 131, 126, 126, 120, 118, 105, 116, 112, 114, 122, 120, 118, 116, 115, 111, 110, 118, 113, 119, 129, 127, 132, 131, 134, 128, 134, 135, 133, 139, 146, 142, 147, 144, 146, 136, 143, 139, 138, 147, 148, 143, 145, 142, 141, 137, 148, 143, 147, 151, 143, 139, 135, 134, 130, 136, 140, 135, 137, 140, 127, 127, 118, 115, 106, 112, 107, 107, 113, 115, 110, 116, 109, 109, 100, 106, 97, 101, 108, 107, 109, 113, 108, 108, 104, 109, 104, 113, 116, 110, 112, 106, 103, 99, 101, 101, 100, 108, 113, 111, 122, 119, 125, 125, 133, 128, 132, 136, 133, 131, 135, 131, 135, 132, 139, 134, 140, 145, 141, 144, 143, 139, 139, 138, 143, 143, 152, 154, 147, 150, 145, 142, 141, 144, 142, 140, 141, 134, 126, 127, 117, 117, 118, 125, 124, 131, 134, 131, 130, 128, 118, 115, 112, 114, 110, 121, 126, 128, 135, 132, 126, 122, 119, 118, 117, 129, 130, 131, 136, 132, 130, 132, 136, 137, 140, 146, 141, 139, 138, 129, 130, 132, 137, 138, 148, 153, 151, 153, 151, 144, 144, 142, 142, 137, 145, 141, 139, 139, 134, 126, 125, 123, 124, 128, 139, 137, 137, 137, 129, 121, 123, 121, 121, 125, 130, 125, 124, 122, 111, 107, 108, 106, 104, 116, 117, 119, 123, 124, 117, 118, 116, 112, 109, 117, 111, 116, 119, 119, 115, 119, 116, 113, 115, 122, 117, 122, 127, 127, 129, 136, 134, 132, 133, 131, 124, 126, 126, 121, 125, 129, 128, 128, 134, 128, 128, 129, 129, 124, 131, 131, 130, 131, 136, 129, 130, 128, 126, 120, 123, 119, 117, 120, 122, 118, 121, 122, 120, 118, 124, 121, 121, 125, 121, 121, 121, 123, 118, 120, 122, 118, 119, 123, 118, 121, 121, 125, 120, 127, 125, 125, 127, 129, 125, 130, 131, 133, 129, 135, 129, 129, 132, 132, 129, 132, 133, 132, 133, 139, 134, 136, 137, 132, 132, 133, 136, 132, 138, 139, 135, 139, 140, 135, 138, 136, 138, 132, 138, 135, 133, 136, 134, 129, 132, 130, 131, 127, 134, 129, 131, 134, 129, 127, 127, 126, 124, 124, 128, 122, 126, 125, 118, 117, 115, 116, 113, 119, 121, 120, 127, 126, 123, 124, 121, 123, 119, 126, 123, 125, 128, 124, 122, 124, 124, 126, 123, 130, 125, 131, 134, 131, 133, 134, 135, 135, 137, 141, 137, 141, 136, 130, 129, 128, 131, 129, 136, 135, 135, 139, 135, 133, 133, 131, 133, 130, 135, 130, 132, 131, 127, 124, 124, 122, 124, 122, 126, 121, 127, 125, 122, 122, 121, 122, 122, 124, 128, 124, 128, 122, 118, 118, 117, 119, 120, 126, 124, 124, 127, 121, 121, 121, 121, 125, 125, 131, 129, 133, 132, 126, 126, 127, 125, 129, 128, 131, 128, 135, 131, 129, 130, 130, 130, 133, 134, 135, 134, 137, 128, 125, 126, 124, 125, 127, 129, 127, 129, 129, 125, 124, 125, 124, 127, 129, 130, 128, 133, 129, 124, 123, 123, 120, 125, 125, 126, 124, 130, 125, 123, 124, 124, 123, 127, 127, 128, 130, 132, 125, 123, 124, 122, 122, 125, 125, 125, 128, 126, 123, 121, 123, 121, 126, 127, 127, 129, 133, 128, 126, 127, 127, 125, 131, 129, 128, 129, 131, 125, 125, 125, 124, 125, 132, 130, 133, 135, 133, 126, 126, 126, 123, 127, 131, 129, 129, 131, 127, 123, 123, 123, 120, 128, 127, 127, 129, 132, 125, 123, 123, 122, 121, 129, 126, 126, 127, 126, 120, 120, 119, 117, 120, 127, 126, 130, 133, 130, 125, 126, 125, 124, 129, 133, 130, 134, 135, 131, 129, 129, 129, 129, 138, 136, 136, 139, 138, 132, 131, 131, 130, 132, 140, 135, 135, 136, 133, 127, 128, 127, 126, 129, 135, 129, 133, 132, 127, 124, 124, 123, 122, 128, 130, 126, 131, 128, 125, 122, 121, 120, 120, 128, 125, 124, 129, 126, 122, 121, 120, 119, 122, 129, 124, 126, 130, 126, 124, 125, 124, 123, 125, 130, 125, 131, 130, 127, 126, 126, 126, 125, 132, 134, 129, 137, 133, 131, 128, 127, 126, 127, 135, 131, 131, 136, 132, 129, 129, 127, 126, 129, 135, 128, 132, 134, 128, 127, 126, 124, 123, 126, 130, 125, 133, 130, 126, 124, 122, 120, 121, 126, 127, 124, 132, 126, 124, 122, 120, 118, 122, 128, 125, 127, 131, 125, 123, 121, 119, 119, 123, 128, 123, 127, 128, 124, 124, 123, 121, 121, 126, 128, 125, 132, 128, 125, 125, 125, 123, 125, 131, 129, 129, 134, 128, 128, 127, 126, 125, 131, 135, 131, 134, 137, 131, 130, 129, 127, 128, 133, 136, 130, 135, 133, 128, 128, 127, 125, 127, 131, 131, 129, 135, 129, 127, 127, 125, 124, 127, 130, 128, 129, 131, 126, 126, 125, 121, 122, 126, 127, 125, 128, 129, 124, 126, 124, 122, 125, 129, 131, 128, 133, 129, 126, 127, 125, 124, 127, 129, 128, 129, 133, 127, 128, 127, 125, 125, 128, 130, 129, 130, 132, 127, 129, 128, 125, 126, 130, 130, 129, 132, 131, 127, 129, 127, 125, 129, 132, 132, 131, 134, 128, 126, 127, 124, 123, 128, 128, 128, 130, 131, 125, 126, 125, 123, 123, 128, 127, 128, 130, 129, 125, 126, 125, 121, 124, 128, 127, 128, 130, 127, 124, 125, 123, 121, 126, 128, 127, 130, 131, 127, 126, 127, 124, 123, 128, 128, 128, 130, 129, 125, 126, 125, 123, 124, 128, 127, 130, 131, 129, 126, 128, 126, 122, 126, 128, 126, 129, 129, 126, 125, 126, 123, 122, 127, 127, 126, 131, 129, 126, 127, 126, 123, 123, 126, 123, 126, 128, 125, 123, 125, 123, 121, 124, 127, 125, 130, 129, 127, 126, 127, 124, 122, 126, 126, 125, 129, 127, 125, 125, 126, 122, 123, 128, 127, 128, 133, 129, 127, 128, 128, 125, 127, 129, 126, 129, 130, 126, 127, 127, 126, 125, 128, 129, 128, 133, 131, 129, 129, 130, 128, 126, 129, 127, 127, 131, 126, 126, 127, 127, 125, 127, 130, 127, 130, 132, 127, 129, 131, 129, 126, 128, 129, 125, 129, 129, 126, 128, 116, 122, 141, 125, 122, 136, 125, 134, 118, 137, 124, 135, 132, 142, 130, 137, 123, 130, 129, 125, 127, 125, 124, 128, 124, 119, 130, 121, 124, 117, 130, 115, 128, 143, 125, 124, 136, 113, 133, 126, 130, 127, 141, 120, 139, 145, 119, 133, 133, 135, 136, 128, 149, 127, 147, 120, 118, 118, 137, 109, 134, 125, 125, 113, 135, 131, 113, 121, 138, 112, 141, 108, 118, 132, 135, 106, 124, 131, 132, 108, 123, 114, 142, 126, 142, 118, 137, 124, 132, 141, 132, 116, 132, 133, 134, 120, 121, 127, 131, 130, 124, 134, 127, 132, 128, 134, 130, 128, 125, 127, 125, 138, 129, 124, 130, 128, 115, 125, 113, 125, 121, 125, 125, 128, 122, 136, 126, 124, 132, 130, 132, 122, 121, 119, 114, 126, 112, 122, 125, 124, 124, 142, 121, 133, 142, 136, 127, 137, 127, 130, 121, 133, 113, 128, 128, 122, 121, 130, 130, 133, 130, 136, 130, 128, 124, 133, 127, 126, 125, 128, 126, 120, 127, 121, 132, 127, 131, 126, 139, 124, 133, 131, 132, 135, 135, 133, 129, 136, 122, 136, 126, 123, 125, 127, 114, 118, 122, 123, 119, 125, 128, 124, 131, 133, 123, 130, 122, 130, 122, 120, 129, 131, 120, 127, 120, 128, 133, 128, 126, 136, 135, 133, 133, 125, 139, 139, 129, 123, 135, 124, 120, 130, 118, 117, 132, 129, 113, 127, 133, 125, 127, 126, 136, 131, 130, 125, 136, 128, 127, 123, 132, 126, 126, 126, 128, 133, 122, 127, 127, 134, 134, 121, 133, 136, 132, 120, 128, 122, 134, 115, 123, 125, 127, 122, 124, 121, 128, 129, 129, 119, 123, 138, 126, 124, 130, 136, 127, 127, 128, 133, 116, 131, 133, 127, 123, 121, 133, 129, 122, 134, 126, 132, 137, 123, 132, 129, 120, 130, 115, 122, 119, 123, 119, 123, 123, 132, 132, 130, 132, 129, 122, 132, 125, 133, 125, 128, 129, 127, 131, 124, 126, 130, 133, 127, 125, 123, 139, 119, 128, 132, 136, 124, 128, 132, 137, 124, 115, 123, 112, 124, 124, 122, 127, 118, 128, 132, 129, 126, 131, 126, 126, 128, 136, 120, 125, 138, 126, 128, 129, 124, 138, 128, 127, 126, 123, 125, 129, 129, 125, 131, 126, 136, 128, 128, 133, 117, 119, 120, 130, 116, 125, 127, 129, 126, 131, 125, 135, 130, 121, 129, 126, 124, 128, 124, 126, 127, 132, 125, 132, 130, 133, 124, 125, 126, 135, 120, 129, 128, 132, 132, 124, 133, 127, 131, 122, 126, 116, 127, 122, 127, 129, 124, 133, 124, 131, 133, 135, 128, 121, 135, 127, 121, 124, 127, 128, 120, 127, 131, 133, 133, 122, 119, 137, 124, 122, 130, 130, 125, 130, 133, 126, 134, 126, 125, 126, 124, 118, 128, 132, 130, 122, 134, 127, 132, 134, 129, 128, 134, 124, 125, 127, 126, 125, 125, 122, 125, 126, 137, 128, 132, 129, 126, 126, 124, 126, 135, 121, 133, 121, 127, 133, 125, 128, 127, 123, 122, 121, 130, 129, 127, 129, 126, 125, 133, 128, 129, 131, 135, 122, 125, 129, 126, 127, 126, 127, 126, 126, 133, 127, 132, 131, 125, 123, 127, 128, 128, 129, 131, 124, 126, 129, 126, 126, 128, 120, 126, 123, 130, 125, 126, 129, 123, 128, 128, 126, 130, 134, 126, 131, 122, 123, 124, 126, 123, 126, 122, 131, 125, 131, 129, 129, 126, 128, 125, 128, 127, 126, 124, 128, 126, 126, 120, 130, 131, 127, 130, 124, 126, 131, 121, 125, 131, 129, 122, 133, 129, 128, 136, 126, 127, 125, 124, 129, 128, 131, 124, 130, 132, 126, 128, 129, 130, 132, 126, 127, 126, 127, 128, 124, 121, 125, 125, 125, 132, 128, 127, 131, 126, 126, 126, 124, 130, 124, 132, 128, 123, 129, 129, 125, 126, 123, 122, 127, 130, 128, 126, 130, 126, 129, 128, 131, 128, 129, 130, 127, 129, 124, 121, 128, 122, 125, 125, 125, 130, 129, 132, 129, 126, 130, 128, 130, 123, 132, 124, 128, 128, 123, 125, 129, 125, 128, 131, 130, 128, 129, 128, 123, 130, 128, 127, 128, 129, 129, 127, 130, 124, 127, 128, 124, 123, 125, 129, 129, 126, 133, 123, 127, 126, 125, 128, 125, 130, 124, 127, 128, 126, 127, 126, 128, 129, 124, 130, 129, 131, 129, 126, 129, 128, 130, 124, 131, 129, 127, 127, 129, 124, 128, 126, 125, 127, 128, 126, 129, 130, 125, 130, 124, 126, 128, 126, 130, 126, 129, 129, 126, 128, 126, 125, 128, 129, 130, 128, 132, 125, 129, 126, 130, 129, 128, 127, 126, 127, 124, 128, 127, 124, 123, 126, 128, 128, 127, 132, 125, 126, 126, 127, 125, 128, 130, 126, 130, 127, 128, 127, 129, 127, 129, 129, 125, 126, 129, 129, 127, 125, 129, 125, 129, 130, 129, 130, 126, 127, 125, 127, 125, 125, 125, 128, 124, 127, 130, 129, 126, 131, 124, 128, 126, 128, 128, 128, 129, 125, 125, 128, 125, 128, 130, 128, 126, 126, 126, 130, 127, 130, 125, 132, 130, 130, 128, 130, 128, 125, 125, 123, 124, 125, 131, 128, 128, 134, 127, 128, 131, 127, 127, 130, 129, 124, 125, 131, 125, 129, 128, 127, 128, 134, 125, 126, 131, 128, 124, 130, 127, 121, 126, 128, 124, 128, 133, 131, 130, 128, 127, 122, 129, 128, 127, 128, 132, 124, 125, 126, 125, 128, 133, 128, 132, 130, 128, 124, 130, 126, 126, 123, 128, 129, 122, 124, 126, 126, 130, 131, 134, 132, 132, 126, 131, 127, 127, 124, 128, 121, 122, 124, 123, 123, 130, 132, 133, 132, 132, 129, 126, 128, 125, 127, 127, 123, 124, 120, 120, 124, 125, 129, 135, 132, 133, 129, 128, 127, 126, 124, 127, 130, 120, 126, 121, 121, 125, 129, 128, 134, 133, 130, 128, 130, 125, 126, 129, 123, 126, 122, 123, 123, 126, 129, 131, 133, 134, 131, 128, 127, 129, 123, 126, 126, 123, 126, 126, 124, 127, 129, 134, 133, 133, 131, 128, 127, 121, 124, 120, 128, 127, 125, 128, 123, 126, 129, 129, 133, 132, 133, 129, 127, 124, 122, 123, 129, 124, 127, 124, 126, 123, 129, 127, 131, 132, 133, 131, 128, 128, 126, 127, 127, 127, 125, 124, 121, 122, 123, 127, 129, 134, 134, 131, 132, 128, 126, 125, 128, 126, 126, 127, 123, 120, 124, 126, 128, 130, 134, 133, 130, 128, 124, 124, 127, 127, 127, 130, 127, 126, 125, 129, 127, 131, 130, 129, 128, 127, 123, 124, 127, 128, 127, 129, 127, 125, 127, 128, 128, 128, 134, 131, 129, 128, 126, 124, 124, 128, 126, 129, 128, 123, 125, 127, 126, 128, 135, 135, 130, 129, 127, 121, 124, 126, 126, 126, 128, 125, 125, 125, 126, 128, 133, 131, 130, 131, 128, 125, 124, 125, 125, 126, 129, 127, 125, 126, 126, 128, 132, 133, 130, 131, 128, 125, 122, 128, 127, 128, 129, 126, 123, 124, 126, 126, 126, 131, 130, 134, 131, 127, 126, 128, 128, 125, 128, 128, 127, 125, 125, 122, 128, 131, 132, 132, 129, 127, 125, 127, 126, 126, 128, 128, 126, 126, 127, 126, 127, 129, 131, 131, 128, 126, 122, 123, 124, 123, 130, 129, 127, 127, 128, 127, 127, 131, 131, 130, 130, 126, 125, 124, 124, 125, 129, 129, 125, 129, 127, 126, 125, 130, 131, 132, 131, 131, 125, 126, 125, 124, 127, 127, 126, 125, 126, 127, 126, 130, 130, 130, 132, 131, 126, 125, 127, 124, 126, 128, 126, 127, 125, 127, 127, 126, 131, 127, 133, 129, 126, 125, 126, 125, 126, 130, 129, 128, 129, 126, 127, 125, 127, 130, 128, 128, 127, 124, 128, 124, 126, 130, 130, 129, 126, 128, 124, 126, 129, 124, 130, 128, 129, 126, 126, 126, 124, 131, 129, 127, 128, 127, 126, 126, 128, 128, 127, 132, 128, 126, 124, 125, 126, 125, 128, 127, 128, 129, 125, 126, 129, 129, 130, 130, 128, 126, 126, 127, 123, 125, 126, 128, 128, 128, 125, 124, 128, 129, 127, 129, 129, 129, 127, 128, 125, 126, 130, 128, 128, 128, 124, 125, 124, 125, 126, 129, 131, 129, 129, 128, 127, 127, 128, 129, 127, 129, 126, 123, 124, 124, 128, 129, 129, 129, 127, 129, 127, 125, 127, 128, 128, 129, 128, 125, 126, 128, 126, 128, 129, 129, 129, 126, 125, 125, 127, 129, 127, 130, 129, 126, 125, 127, 127, 126, 131, 129, 127, 127, 126, 127, 128, 127, 127, 127, 129, 126, 124, 126, 126, 127, 130, 131, 129, 129, 129, 125, 126, 127, 127, 127, 128, 125, 124, 126, 127, 127, 129, 130, 130, 129, 129, 125, 126, 128, 127, 127, 128, 127, 126, 127, 126, 126, 127, 130, 129, 128, 127, 126, 127, 129, 127, 129, 128, 129, 125, 126, 126, 126, 126, 128, 128, 129, 128, 127, 126, 128, 128, 129, 130, 129, 125, 125, 126, 125, 126, 127, 128, 129, 129, 127, 125, 128, 127, 127, 128, 129, 127, 127, 128, 126, 126, 127, 128, 128, 127, 127, 126, 126, 126, 125, 129, 130, 129, 127, 127, 127, 128, 128, 128, 127, 127, 127, 125, 126, 125, 127, 129, 130, 127, 127, 126, 126, 126, 126, 128, 129, 129, 130, 127, 128, 127, 127, 128, 128, 127, 127, 125, 125, 124, 127, 127, 128, 130, 130, 129, 128, 129, 127, 127, 129, 128, 126, 126, 123, 125, 126, 128, 127, 129, 129, 128, 128, 128, 127, 128, 129, 128, 127, 127, 125, 126, 126, 126, 127, 129, 129, 126, 126, 127, 127, 128, 128, 128, 129, 128, 127, 125, 127, 126, 127, 129, 127, 127, 128, 128, 127, 127, 128, 127, 128, 127, 126, 126, 126, 128, 128, 129, 129, 128, 128, 127, 126, 126, 127, 127, 126, 128, 126, 126, 127, 127, 129, 130, 130, 129, 128, 126, 125, 127, 126, 126, 126, 128, 127, 125, 127, 126, 127, 130, 129, 129, 128, 128, 126, 126, 128, 125, 129, 128, 127, 126, 126, 126, 126, 128, 129, 128, 130, 129, 127, 128, 128, 127, 127, 129, 126, 126, 126, 126, 125, 128, 129, 128, 129, 129, 126, 127, 127, 126, 127, 128, 129, 126, 128, 126, 126, 129, 128, 128, 128, 127, 127, 125, 126, 125, 126, 129, 128, 128, 128, 128, 127, 128, 129, 127, 128, 127, 126, 125, 126, 126, 126, 128, 127, 127, 129, 127, 126, 128, 129, 128, 128, 129, 126, 127, 127, 127, 125, 127, 126, 126, 127, 126, 126, 128, 129, 128, 129, 130, 128, 127, 127, 125, 125, 128, 127, 127, 127, 127, 126, 128, 129, 127, 128, 130, 127, 127, 127, 125, 126, 128, 128, 127, 129, 129, 127, 127, 128, 126, 127, 127, 126, 126, 127, 127, 127, 128, 129, 127, 130, 128, 127, 127, 128, 127, 127, 127, 125, 127, 128, 126, 125, 128, 128, 127, 129, 128, 126, 128, 128, 127, 128, 129, 127, 127, 128, 125, 124, 127, 126, 126, 128, 129, 128, 128, 129, 127, 128, 129, 127, 126, 128, 126, 126, 126, 125, 124, 128, 129, 127, 128, 129, 128, 128, 129, 127, 126, 128, 126, 126, 127, 127, 127, 128, 128, 126, 127, 128, 126, 126, 128, 128, 128, 129, 127, 126, 127, 128, 127, 127, 128, 128, 128, 128, 125, 125, 128, 127, 126, 128, 128, 127, 128, 128, 126, 128, 129, 128, 128, 128, 127, 127, 128, 126, 124, 127, 126, 125, 126, 126, 128, 129, 130, 128, 129, 130, 128, 127, 127, 127, 127, 128, 127, 124, 126, 127, 126, 127, 128, 129, 129, 130, 127, 126, 128, 127, 127, 128, 128, 128, 128, 128, 125, 126, 127, 126, 127, 127, 127, 128, 128, 128, 127, 129, 129, 128, 128, 127, 126, 127, 128, 127, 125, 127, 127, 126, 127, 127, 127, 128, 129, 127, 128, 128, 127, 128, 128, 127, 128, 129, 128, 125, 126, 127, 125, 126, 127, 127, 129, 129, 128, 127, 129, 128, 127, 129, 127, 127, 127, 128, 125, 125, 128, 127, 128, 128, 127, 128, 129, 128, 126, 128, 128, 127, 127, 127, 127, 128, 128, 127, 125, 127, 127, 126, 127, 126, 127, 129, 130, 127, 127, 129, 127, 127, 128, 127, 127, 129, 128, 125, 125, 127, 126, 127, 128, 127, 128, 129, 128, 126, 128, 128, 127, 129, 128, 126, 127, 128, 127, 125, 127, 127, 126, 128, 126, 127, 128, 128, 128, 128, 129, 128, 128, 128, 126, 127, 128, 128, 126, 126, 127, 126, 127, 127, 127, 129, 130, 128, 126, 128, 127, 127, 129, 128, 127, 128, 128, 126, 125, 127, 126, 127, 128, 127, 127, 128, 128, 127, 128, 129, 128, 128, 128, 126, 127, 128, 127, 126, 127, 127, 126, 127, 127, 126, 128, 130, 128, 128, 128, 127, 127, 128, 126, 127, 128, 129, 126, 126, 127, 126, 127, 128, 127, 128, 129, 128, 127, 128, 128, 127, 128, 127, 126, 126, 128, 127, 126, 127, 128, 128, 128, 127, 127, 128, 128, 126, 127, 128, 127, 127, 128, 126, 126, 128, 129, 127, 127, 127, 126, 127, 127, 126, 128, 129, 128, 127, 128, 128, 127, 128, 128, 127, 128, 129, 126, 126, 127, 127, 127, 128, 128, 127, 128, 128, 126, 127, 128, 127, 128, 129, 127, 127, 128, 127, 125, 127, 127, 127, 127, 127, 126, 128, 129, 128, 128, 129, 128, 128, 128, 127, 126, 127, 128, 126, 126, 126, 126, 127, 128, 128, 128, 130, 128, 126, 128, 127, 126, 127, 128, 127, 127, 128, 127, 126, 127, 126, 127, 128, 127, 127, 128, 128, 126, 128, 128, 128, 128, 128, 127, 126, 128, 128, 126, 127, 127, 127, 127, 127, 126, 127, 129, 127, 127, 128, 127, 127, 128, 128, 127, 128, 129, 127, 126, 126, 126, 126, 127, 127, 127, 128, 127, 127, 128, 128, 128, 128, 129, 128, 127, 128, 127, 126, 127, 127, 127, 127, 127, 127, 126, 127, 126, 127, 135, 138, 138, 138, 144, 138, 138, 138, 136, 131, 137, 133, 125, 126, 115, 103, 99, 90, 90, 78, 77, 77, 77, 81, 84, 91, 98, 102, 108, 114, 126, 132, 141, 138, 155, 159, 171, 174, 184, 188, 191, 190, 189, 195, 193, 191, 189, 180, 176, 169, 157, 154, 141, 132, 124, 120, 109, 105, 96, 93, 87, 86, 83, 83, 88, 83, 86, 85, 87, 90, 92, 90, 96, 91, 98, 98, 108, 115, 115, 120, 116, 120, 115, 115, 115, 121, 119, 131, 131, 142, 147, 150, 155, 159, 167, 170, 169, 168, 166, 161, 164, 160, 163, 154, 149, 138, 131, 127, 125, 122, 119, 117, 108, 107, 97, 98, 90, 91, 81, 86, 85, 87, 83, 86, 84, 88, 95, 99, 109, 110, 113, 110, 115, 117, 124, 126, 134, 131, 138, 139, 144, 153, 156, 160, 160, 163, 161, 161, 158, 160, 156, 162, 162, 167, 169, 173, 172, 169, 173, 175, 177, 179, 179, 174, 176, 168, 171, 166, 168, 158, 155, 150, 144, 139, 142, 142, 138, 138, 131, 132, 122, 119, 109, 110, 104, 102, 96, 99, 93, 92, 91, 90, 93, 91, 91, 83, 82, 77, 74, 68, 72, 68, 71, 70, 72, 73, 76, 81, 84, 91, 93, 95, 94, 101, 99, 104, 105, 115, 119, 124, 125, 127, 132, 133, 133, 138, 144, 143, 144, 143, 148, 144, 149, 147, 148, 148, 145, 141, 143, 145, 148, 151, 151, 155, 150, 149, 140, 137, 135, 132, 126, 132, 130, 130, 127, 127, 128, 125, 129, 120, 120, 120, 115, 111, 117, 115, 122, 122, 127, 126, 125, 128, 128, 134, 137, 136, 137, 141, 138, 140, 142, 148, 148, 153, 156, 154, 157, 162, 153, 155, 163, 160, 166, 163, 164, 158, 157, 152, 148, 150, 149, 138, 139, 137, 138, 142, 143, 148, 138, 139, 130, 124, 122, 121, 112, 115, 115, 115, 114, 115, 115, 108, 110, 104, 106, 105, 102, 91, 94, 91, 95, 95, 97, 99, 95, 93, 88, 89, 92, 93, 85, 93, 88, 91, 92, 95, 97, 96, 100, 100, 105, 111, 109, 107, 118, 116, 125, 130, 136, 138, 139, 141, 140, 148, 154, 155, 155, 163, 161, 166, 171, 177, 178, 180, 177, 172, 169, 167, 159, 157, 159, 152, 156, 151, 150, 144, 139, 130, 126, 125, 120, 108, 107, 102, 94, 95, 92, 96, 92, 91, 85, 83, 87, 89, 86, 93, 93, 93, 99, 97, 99, 100, 106, 102, 109, 114, 115, 113, 120, 118, 125, 132, 135, 142, 140, 142, 138, 145, 150, 151, 150, 160, 155, 158, 160, 164, 168, 166, 168, 162, 165, 164, 159, 154, 156, 149, 154, 155, 153, 152, 148, 143, 135, 136, 135, 130, 126, 127, 118, 120, 118, 121, 122, 121, 116, 110, 112, 110, 107, 106, 111, 107, 112, 108, 111, 107, 106, 102, 100, 105, 105, 104, 106, 109, 103, 111, 110, 117, 117, 117, 112, 113, 113, 115, 114, 119, 122, 120, 127, 122, 130, 132, 135, 132, 136, 138, 137, 132, 135, 133, 134, 139, 137, 143, 142, 143, 138, 140, 140, 141, 139, 143, 137, 137, 138, 135, 140, 138, 137, 133, 133, 129, 127, 126, 130, 126, 131, 131, 128, 131, 127, 121, 117, 119, 119, 118, 115, 120, 113, 118, 115, 116, 122, 123, 119, 115, 116, 115, 114, 115, 119, 116, 123, 121, 123, 128, 131, 130, 133, 137, 136, 137, 139, 139, 135, 142, 139, 143, 148, 148, 145, 144, 145, 145, 145, 148, 149, 145, 148, 140, 142, 143, 141, 138, 138, 137, 134, 129, 132, 130, 128, 135, 128, 133, 131, 126, 120, 119, 117, 115, 113, 117, 114, 114, 116, 110, 115, 117, 117, 112, 113, 108, 106, 103, 107, 105, 108, 112, 107, 114, 112, 109, 109, 113, 113, 112, 113, 117, 110, 114, 114, 111, 120, 121, 121, 120, 126, 122, 123, 125, 130, 129, 135, 134, 133, 137, 137, 138, 137, 140, 139, 140, 138, 142, 139, 148, 146, 148, 152, 151, 147, 143, 142, 139, 137, 137, 139, 135, 140, 134, 134, 136, 134, 131, 130, 130, 123, 121, 119, 119, 116, 121, 116, 120, 120, 117, 113, 116, 117, 116, 117, 118, 118, 117, 122, 115, 120, 122, 122, 118, 122, 123, 124, 124, 128, 129, 131, 137, 133, 138, 138, 138, 135, 139, 140, 139, 139, 142, 137, 140, 144, 141, 147, 147, 144, 140, 142, 137, 135, 132, 134, 130, 134, 137, 132, 135, 133, 130, 127, 129, 126, 125, 120, 120, 116, 121, 120, 119, 123, 120, 116, 112, 117, 114, 114, 114, 117, 112, 117, 114, 112, 116, 114, 112, 113, 117, 114, 115, 114, 118, 116, 124, 124, 125, 126, 124, 121, 121, 124, 125, 124, 124, 128, 120, 124, 142, 134, 123, 143, 127, 134, 122, 139, 122, 140, 127, 142, 133, 146, 131, 138, 136, 127, 125, 130, 125, 122, 122, 121, 121, 131, 126, 123, 127, 123, 119, 142, 127, 114, 137, 114, 126, 122, 127, 128, 134, 113, 134, 133, 121, 118, 134, 129, 140, 121, 141, 136, 136, 128, 124, 116, 130, 110, 125, 122, 121, 116, 122, 142, 121, 125, 146, 121, 144, 120, 114, 131, 134, 107, 126, 127, 138, 117, 133, 118, 148, 134, 145, 128, 143, 132, 137, 144, 141, 121, 135, 135, 144, 134, 126, 134, 140, 136, 127, 136, 129, 126, 133, 136, 133, 134, 127, 123, 121, 137, 132, 115, 133, 127, 111, 126, 110, 118, 118, 117, 114, 114, 114, 122, 117, 119, 123, 123, 130, 122, 118, 116, 115, 121, 107, 114, 123, 116, 117, 140, 115, 130, 144, 135, 132, 140, 128, 136, 123, 134, 118, 133, 129, 130, 121, 135, 132, 137, 134, 141, 132, 140, 125, 136, 133, 130, 126, 134, 141, 119, 134, 127, 129, 128, 127, 126, 136, 124, 126, 132, 129, 135, 133, 140, 126, 130, 120, 129, 118, 115, 120, 122, 109, 118, 118, 120, 120, 116, 119, 116, 125, 124, 118, 124, 120, 125, 125, 124, 126, 138, 120, 127, 121, 130, 128, 131, 127, 135, 136, 131, 140, 129, 136, 141, 134, 126, 140, 129, 129, 127, 127, 121, 137, 134, 123, 126, 141, 119, 130, 126, 135, 136, 129, 129, 135, 138, 134, 126, 141, 124, 129, 129, 126, 125, 122, 125, 125, 135, 137, 122, 135, 133, 130, 114, 128, 113, 131, 119, 114, 124, 125, 122, 124, 116, 129, 120, 131, 117, 114, 132, 123, 118, 131, 128, 134, 123, 130, 132, 115, 125, 132, 122, 123, 117, 128, 133, 121, 140, 125, 132, 138, 122, 123, 136, 120, 130, 125, 124, 125, 126, 125, 120, 130, 136, 128, 131, 134, 131, 119, 132, 121, 135, 130, 132, 131, 137, 126, 126, 123, 130, 129, 125, 123, 126, 132, 118, 126, 135, 135, 118, 124, 132, 134, 121, 111, 126, 116, 127, 126, 126, 125, 123, 121, 129, 128, 130, 129, 130, 124, 132, 134, 126, 122, 143, 137, 126, 124, 131, 142, 128, 132, 131, 128, 132, 135, 129, 132, 129, 131, 129, 131, 131, 129, 119, 124, 122, 129, 120, 125, 125, 128, 120, 123, 124, 132, 124, 121, 125, 129, 116, 128, 124, 124, 123, 125, 119, 133, 121, 125, 124, 121, 123, 127, 125, 124, 129, 126, 125, 117, 133, 122, 125, 127, 125, 120, 120, 129, 123, 130, 121, 129, 129, 129, 130, 137, 127, 124, 132, 126, 127, 129, 127, 133, 119, 132, 131, 134, 134, 124, 125, 136, 128, 127, 132, 135, 128, 124, 135, 128, 131, 126, 128, 132, 118, 125, 132, 131, 127, 121, 128, 127, 132, 127, 131, 124, 136, 118, 124, 134, 124, 124, 126, 120, 122, 125, 134, 125, 124, 129, 121, 129, 121, 122, 135, 118, 124, 118, 129, 132, 123, 128, 132, 122, 128, 124, 129, 129, 126, 125, 129, 125, 135, 125, 132, 135, 133, 126, 129, 132, 133, 126, 129, 129, 131, 126, 130, 132, 135, 130, 133, 128, 130, 130, 126, 127, 128, 123, 127, 122, 131, 128, 130, 125, 128, 122, 128, 125, 122, 130, 123, 126, 123, 127, 127, 131, 127, 131, 119, 126, 123, 123, 124, 124, 124, 125, 128, 127, 128, 131, 125, 124, 124, 123, 126, 124, 123, 129, 124, 130, 124, 130, 130, 130, 125, 124, 123, 128, 121, 123, 130, 128, 126, 132, 132, 132, 134, 128, 130, 125, 127, 127, 127, 127, 124, 130, 132, 130, 128, 135, 129, 130, 125, 126, 123, 128, 126, 126, 127, 127, 130, 127, 132, 126, 124, 128, 124, 123, 125, 121, 130, 127, 128, 131, 129, 127, 131, 126, 125, 124, 121, 126, 125, 130, 125, 128, 129, 132, 125, 131, 127, 126, 129, 127, 129, 121, 126, 129, 125, 128, 133, 126, 129, 128, 128, 129, 127, 131, 125, 132, 125, 132, 130, 130, 128, 126, 124, 127, 127, 127, 130, 126, 130, 128, 132, 129, 130, 130, 126, 125, 128, 124, 126, 129, 122, 131, 128, 127, 126, 128, 126, 128, 120, 127, 122, 123, 124, 126, 129, 125, 131, 127, 126, 128, 126, 125, 128, 125, 132, 121, 128, 132, 127, 132, 128, 128, 127, 128, 121, 131, 129, 126, 124, 131, 127, 128, 130, 129, 127, 129, 123, 126, 129, 123, 130, 122, 129, 129, 130, 131, 131, 128, 129, 125, 126, 127, 125, 127, 125, 130, 126, 129, 129, 131, 129, 129, 128, 127, 127, 124, 127, 120, 129, 128, 124, 125, 128, 128, 127, 127, 128, 125, 126, 124, 126, 126, 126, 130, 127, 132, 126, 129, 128, 128, 127, 128, 129, 122, 128, 129, 129, 128, 127, 129, 125, 129, 126, 131, 129, 126, 125, 130, 125, 126, 128, 129, 127, 127, 126, 130, 132, 128, 123, 119, 126, 122, 128, 132, 132, 132, 134, 130, 132, 125, 125, 120, 127, 121, 119, 126, 130, 125, 131, 131, 134, 132, 126, 125, 128, 127, 120, 120, 121, 122, 129, 130, 134, 133, 131, 124, 132, 128, 122, 123, 124, 122, 128, 123, 135, 130, 135, 130, 133, 130, 122, 121, 119, 128, 130, 121, 127, 125, 120, 132, 132, 133, 132, 127, 127, 131, 127, 123, 125, 126, 126, 127, 129, 131, 130, 127, 129, 133, 128, 125, 126, 123, 128, 125, 125, 132, 123, 125, 134, 134, 139, 127, 129, 120, 127, 125, 123, 126, 124, 123, 131, 132, 131, 130, 129, 132, 129, 127, 121, 123, 121, 120, 126, 129, 130, 130, 129, 133, 136, 132, 128, 127, 120, 121, 126, 123, 127, 127, 127, 136, 134, 132, 127, 128, 126, 124, 126, 123, 126, 125, 125, 134, 132, 130, 128, 127, 132, 130, 127, 129, 124, 121, 126, 135, 127, 131, 127, 125, 134, 130, 129, 128, 125, 126, 127, 131, 126, 126, 125, 126, 130, 130, 124, 129, 126, 128, 131, 134, 129, 124, 124, 124, 128, 126, 125, 124, 124, 128, 130, 132, 130, 130, 125, 130, 127, 125, 124, 123, 123, 123, 128, 130, 133, 125, 125, 131, 136, 129, 129, 124, 120, 128, 128, 128, 127, 127, 127, 132, 131, 131, 126, 126, 126, 130, 124, 128, 124, 123, 124, 128, 129, 131, 125, 125, 130, 131, 130, 131, 125, 124, 123, 125, 126, 124, 123, 126, 129, 131, 130, 133, 129, 128, 127, 127, 125, 126, 119, 124, 128, 130, 127, 131, 129, 131, 130, 128, 128, 125, 121, 122, 128, 129, 127, 129, 134, 129, 131, 128, 128, 127, 122, 125, 124, 126, 125, 126, 131, 133, 132, 128, 126, 126, 125, 127, 127, 127, 126, 122, 128, 133, 129, 127, 127, 130, 125, 125, 126, 126, 126, 125, 128, 128, 127, 125, 126, 130, 129, 125, 129, 127, 125, 125, 132, 130, 128, 124, 122, 129, 129, 127, 127, 129, 130, 124, 130, 130, 127, 124, 126, 128, 127, 123, 128, 128, 127, 129, 132, 130, 132, 120, 124, 130, 130, 122, 125, 125, 128, 130, 133, 132, 128, 129, 127, 130, 127, 123, 121, 126, 128, 129, 128, 129, 128, 128, 130, 131, 126, 124, 120, 124, 127, 128, 127, 130, 126, 129, 128, 131, 129, 126, 124, 124, 125, 126, 126, 127, 127, 130, 129, 129, 129, 127, 123, 129, 126, 127, 126, 125, 123, 131, 127, 128, 132, 128, 123, 129, 129, 129, 127, 127, 124, 127, 127, 125, 130, 128, 125, 132, 130, 128, 128, 127, 129, 130, 124, 125, 127, 124, 126, 130, 130, 129, 128, 128, 130, 131, 126, 125, 127, 124, 123, 126, 126, 125, 129, 130, 131, 131, 127, 124, 129, 126, 126, 122, 125, 125, 125, 129, 132, 127, 130, 125, 126, 128, 127, 123, 127, 127, 127, 126, 132, 127, 127, 125, 127, 129, 127, 124, 126, 128, 128, 127, 129, 127, 127, 122, 125, 130, 131, 125, 128, 125, 128, 131, 128, 127, 128, 125, 124, 128, 126, 123, 125, 129, 130, 131, 128, 129, 130, 128, 126, 127, 126, 124, 123, 126, 130, 132, 131, 130, 129, 127, 127, 128, 126, 122, 123, 125, 129, 130, 127, 129, 132, 132, 127, 128, 126, 124, 122, 127, 127, 127, 124, 125, 129, 132, 128, 130, 129, 126, 122, 128, 126, 127, 125, 125, 127, 130, 127, 127, 128, 128, 127, 130, 126, 126, 126, 127, 128, 129, 125, 125, 125, 128, 128, 131, 130, 129, 128, 126, 130, 128, 125, 123, 125, 125, 127, 128, 129, 127, 130, 128, 131, 129, 126, 124, 126, 128, 126, 125, 128, 123, 128, 130, 131, 132, 130, 124, 125, 127, 127, 124, 127, 124, 126, 127, 129, 129, 129, 127, 129, 132, 128, 124, 126, 124, 126, 127, 127, 128, 128, 125, 127, 133, 130, 127, 129, 124, 126, 126, 125, 128, 127, 124, 127, 130, 128, 124, 128, 128, 130, 128, 126, 127, 127, 125, 127, 130, 127, 124, 126, 129, 129, 131, 128, 130, 126, 125, 126, 128, 128, 125, 124, 128, 127, 130, 127, 131, 129, 128, 126, 125, 127, 125, 124, 129, 127, 130, 127, 127, 130, 130, 128, 127, 127, 125, 123, 127, 126, 128, 128, 128, 132, 132, 137, 142, 141, 143, 142, 142, 141, 144, 140, 136, 141, 129, 118, 114, 103, 97, 87, 89, 84, 82, 85, 83, 87, 86, 89, 89, 96, 104, 106, 115, 121, 134, 139, 145, 162, 162, 172, 177, 182, 192, 195, 191, 194, 191, 191, 190, 187, 179, 175, 166, 161, 154, 147, 133, 129, 122, 115, 109, 101, 94, 90, 88, 87, 89, 83, 81, 85, 85, 92, 90, 92, 97, 96, 96, 99, 104, 106, 104, 107, 110, 118, 117, 116, 120, 122, 127, 134, 137, 140, 143, 147, 149, 159, 161, 163, 170, 173, 171, 170, 168, 166, 159, 157, 153, 152, 146, 140, 135, 128, 123, 116, 109, 106, 100, 95, 94, 92, 88, 88, 89, 86, 86, 82, 81, 83, 84, 85, 89, 90, 94, 97, 103, 109, 114, 118, 123, 128, 130, 134, 138, 139, 143, 144, 149, 152, 152, 153, 155, 159, 160, 160, 162, 161, 163, 165, 170, 172, 173, 172, 172, 173, 175, 173, 174, 171, 171, 166, 165, 163, 157, 153, 149, 147, 146, 140, 138, 136, 134, 132, 131, 129, 124, 120, 119, 118, 118, 114, 113, 111, 110, 109, 107, 108, 103, 100, 96, 97, 95, 90, 87, 87, 86, 86, 84, 86, 84, 85, 85, 90, 93, 93, 95, 100, 105, 110, 113, 119, 121, 124, 128, 132, 135, 137, 136, 139, 140, 144, 142, 143, 143, 142, 140, 142, 140, 140, 138, 139, 140, 142, 137, 137, 138, 138, 136, 136, 135, 135, 130, 129, 129, 130, 124, 124, 122, 119, 117, 114, 114, 113, 111, 111, 110, 111, 110, 113, 115, 116, 118, 116, 115, 118, 117, 117, 120, 123, 126, 127, 133, 135, 138, 138, 141, 143, 145, 145, 148, 150, 152, 152, 155, 155, 153, 151, 151, 152, 150, 149, 150, 147, 149, 147, 149, 149, 149, 149, 150, 151, 149, 147, 147, 143, 144, 141, 140, 137, 133, 129, 127, 124, 122, 115, 114, 110, 110, 107, 107, 106, 101, 99, 98, 96, 95, 91, 91, 88, 88, 86, 86, 88, 87, 88, 90, 92, 93, 92, 94, 97, 101, 104, 106, 109, 110, 114, 115, 119, 124, 126, 131, 138, 143, 150, 154, 159, 161, 165, 167, 169, 171, 171, 172, 176, 178, 183, 183, 185, 185, 184, 181, 178, 175, 170, 164, 158, 152, 148, 140, 136, 131, 125, 119, 115, 112, 108, 103, 101, 99, 97, 93, 91, 89, 87, 83, 81, 79, 78, 76, 78, 79, 81, 84, 88, 93, 98, 105, 108, 113, 120, 123, 127, 130, 133, 136, 138, 141, 141, 141, 141, 141, 142, 143, 143, 144, 143, 145, 145, 150, 154, 155, 157, 159, 161, 162, 162, 162, 159, 158, 153, 151, 147, 142, 138, 136, 136, 135, 133, 132, 127, 125, 123, 122, 121, 118, 117, 116, 117, 117, 113, 113, 110, 109, 106, 105, 103, 101, 99, 99, 100, 103, 103, 106, 106, 110, 111, 111, 110, 106, 104, 103, 103, 104, 102, 104, 106, 110, 114, 116, 119, 122, 125, 127, 131, 133, 133, 134, 136, 140, 144, 145, 150, 151, 153, 154, 153, 153, 149, 144, 142, 141, 139, 136, 137, 138, 140, 141, 142, 144, 142, 140, 138, 136, 135, 129, 128, 128, 127, 127, 127, 129, 128, 128, 130, 130, 130, 126, 123, 122, 120, 117, 115, 114, 114, 114, 116, 115, 117, 115, 116, 115, 115, 115, 115, 116, 121, 123, 127, 128, 132, 132, 134, 136, 137, 135, 134, 135, 138, 139, 141, 142, 144, 143, 142, 141, 140, 137, 138, 141, 146, 147, 150, 149, 148, 145, 140, 138, 135, 134, 134, 137, 142, 142, 140, 139, 134, 131, 125, 120, 115, 112, 109, 108, 110, 110, 108, 109, 109, 110, 107, 107, 105, 103, 101, 102, 105, 108, 108, 111, 111, 113, 112, 110, 108, 107, 104, 103, 103, 103, 101, 103, 104, 108, 109, 112, 116, 120, 124, 126, 129, 131, 128, 129, 128, 129, 129, 130, 133, 136, 139, 142, 143, 145, 142, 140, 139, 138, 139, 140, 144, 147, 149, 147, 145, 144, 140, 139, 141, 143, 147, 145, 144, 139, 133, 125, 119, 118, 118, 120, 126, 129, 133, 131, 128, 125, 120, 115, 112, 113, 115, 118, 123, 125, 130, 131, 132, 130, 127, 124, 121, 122, 124, 126, 129, 129, 132, 132, 134, 137, 139, 140, 140, 141, 141, 138, 137, 135, 138, 140, 145, 149, 150, 151, 150, 149, 149, 145, 144, 142, 140, 140, 139, 138, 134, 132, 129, 128, 130, 130, 130, 131, 132, 132, 129, 126, 122, 121, 120, 121, 125, 124, 122, 122, 118, 115, 111, 109, 108, 109, 111, 116, 121, 121, 121, 119, 115, 115, 112, 110, 110, 112, 114, 117, 119, 120, 118, 118, 116, 117, 116, 115, 119, 124, 127, 130, 132, 133, 130, 129, 127, 128, 126, 127, 128, 130, 130, 130, 128, 128, 125, 124, 125, 127, 127, 128, 131, 134, 135, 133, 132, 131, 128, 126, 125, 123, 122, 119, 119, 117, 118, 116, 117, 120, 120, 121, 122, 122, 124, 123, 124, 126, 126, 124, 122, 122, 120, 119, 119, 118, 121, 122, 123, 123, 122, 121, 121, 125, 128, 131, 135, 135, 139, 137, 137, 136, 132, 130, 128, 127, 130, 130, 132, 130, 132, 132, 133, 134, 134, 136, 138, 139, 141, 138, 138, 135, 135, 135, 135, 135, 134, 134, 131, 130, 131, 130, 131, 132, 133, 135, 136, 135, 133, 133, 131, 130, 130, 126, 125, 125, 123, 125, 124, 124, 124, 125, 123, 123, 123, 122, 122, 122, 121, 124, 123, 121, 122, 122, 122, 122, 122, 122, 121, 123, 124, 127, 127, 128, 130, 130, 130, 129, 129, 129, 128, 129, 130, 132, 132, 134, 136, 137, 137, 137, 136, 137, 134, 135, 134, 136, 136, 136, 137, 136, 135, 133, 130, 132, 130, 130, 129, 129, 130, 129, 129, 130, 130, 128, 127, 128, 125, 125, 123, 120, 122, 121, 122, 122, 122, 121, 120, 121, 122, 123, 123, 122, 125, 125, 126, 126, 125, 123, 122, 121, 121, 120, 121, 121, 124, 124, 126, 128, 128, 129, 130, 131, 133, 132, 133, 131, 133, 132, 132, 132, 131, 131, 131, 131, 131, 128, 129, 129, 130, 131, 132, 132, 131, 130, 129, 128, 129, 124, 124, 123, 123, 124, 125, 125, 126, 127, 127, 128, 129, 126, 126, 126, 125, 126, 125, 124, 125, 124, 123, 124, 125, 124, 124, 124, 123, 126, 125, 125, 126, 126, 126, 126, 127, 125, 124, 125, 124, 125, 123, 123, 124, 125, 124, 124, 124, 126, 125, 127, 127, 130, 129, 130, 129, 128, 127, 125, 124, 125, 124, 126, 127, 129, 129, 129, 129, 129, 128, 125, 126, 128, 126, 128, 127, 127, 129, 128, 126, 127, 125, 124, 124, 126, 124, 126, 125, 125, 126, 125, 125, 126, 126, 125, 125, 126, 125, 124, 122, 120, 123, 123, 123, 125, 125, 125, 126, 128, 129, 129, 129, 128, 131, 129, 130, 130, 130, 130, 130, 132, 134, 133, 134, 133, 134, 134, 135, 134, 134, 135, 134, 134, 135, 132, 132, 131, 132, 131, 131, 131, 131, 131, 128, 128, 129, 126, 127, 125, 126, 127, 127, 127, 127, 126, 125, 125, 125, 123, 124, 124, 124, 125, 124, 123, 125, 124, 123, 123, 124, 123, 124, 123, 123, 126, 125, 125, 126, 126, 127, 127, 127, 127, 126, 127, 127, 129, 128, 129, 130, 130, 130, 129, 129, 131, 130, 130, 130, 131, 132, 132, 132, 132, 132, 130, 131, 131, 129, 131, 130, 130, 130, 129, 128, 129, 128, 127, 127, 129, 127, 127, 125, 125, 126, 126, 125, 126, 125, 125, 124, 126, 124, 126, 124, 124, 124, 123, 124, 125, 125, 125, 124, 125, 124, 125, 123, 122, 125, 124, 123, 123, 122, 122, 122, 123, 124, 125, 124, 124, 126, 125, 126, 124, 124, 125, 124, 126, 128, 127, 128, 128, 129, 129, 130, 128, 128, 130, 129, 130, 131, 129, 130, 129, 130, 131, 132, 131, 132, 132, 130, 131, 131, 128, 129, 128, 129, 131, 131, 130, 130, 129, 127, 128, 129, 127, 129, 128, 129, 129, 128, 127, 128, 126, 126, 125, 126, 125, 126, 125, 125, 126, 125, 126, 126, 126, 127, 127, 128, 129, 128, 128, 128, 129, 127, 127, 128, 128, 128, 126, 126, 128, 127, 128, 128, 129, 129, 129, 128, 128, 128, 127, 127, 128, 127, 129, 129, 130, 130, 129, 128, 129, 129, 128, 128, 130, 129, 130, 128, 128, 129, 128, 127, 127, 127, 127, 128, 128, 127, 128, 126, 126, 127, 126, 126, 127, 127, 128, 127, 127, 127, 127, 125, 126, 128, 127, 127, 126, 124, 126, 125, 126, 127, 127, 126, 127, 128, 127, 127, 126, 125, 126, 124, 126, 128, 127, 128, 127, 127, 127, 128, 126, 127, 128, 126, 127, 128, 125, 126, 126, 126, 127, 127, 126, 127, 128, 127, 127, 127, 126, 126, 126, 127, 128, 128, 127, 127, 126, 126, 126, 126, 124, 126, 124, 125, 125, 124, 125, 126, 125, 126, 126, 126, 126, 127, 125, 125, 125, 124, 125, 125, 124, 126, 125, 126, 127, 126, 125, 127, 127, 127, 128, 128, 128, 128, 126, 127, 128, 127, 128, 128, 128, 129, 129, 129, 129, 129, 128, 128, 129, 127, 129, 129, 129, 131, 131, 129, 130, 126, 124, 125, 126, 128, 132, 129, 130, 131, 129, 128, 128, 129, 128, 127, 126, 123, 123, 123, 125, 127, 131, 133, 132, 129, 130, 131, 127, 128, 124, 109, 125, 139, 105, 134, 126, 123, 132, 128, 139, 127, 140, 135, 132, 135, 134, 124, 135, 128, 120, 125, 123, 124, 125, 127, 119, 131, 126, 124, 115, 127, 109, 127, 141, 117, 118, 140, 117, 140, 124, 138, 141, 130, 124, 144, 122, 115, 126, 132, 145, 127, 137, 139, 135, 146, 113, 128, 138, 136, 109, 141, 115, 120, 101, 134, 125, 118, 131, 124, 121, 137, 111, 126, 136, 126, 125, 126, 142, 120, 110, 129, 115, 140, 121, 125, 121, 124, 124, 134, 146, 130, 137, 137, 133, 130, 123, 125, 135, 129, 128, 117, 133, 110, 125, 127, 140, 133, 141, 129, 131, 122, 139, 122, 125, 130, 122, 119, 117, 118, 123, 122, 135, 127, 130, 129, 133, 123, 122, 128, 127, 127, 125, 120, 115, 116, 126, 112, 132, 136, 133, 135, 139, 116, 129, 132, 128, 128, 131, 131, 127, 122, 121, 118, 130, 135, 133, 132, 135, 135, 128, 127, 126, 129, 120, 124, 131, 119, 123, 119, 133, 133, 128, 133, 131, 144, 124, 129, 127, 137, 122, 132, 123, 125, 128, 131, 128, 129, 139, 129, 138, 126, 127, 121, 125, 112, 119, 122, 125, 114, 123, 115, 130, 128, 128, 131, 132, 123, 126, 120, 116, 130, 128, 123, 133, 120, 130, 132, 130, 135, 136, 137, 142, 130, 124, 133, 125, 122, 124, 129, 122, 127, 127, 113, 125, 133, 129, 119, 144, 136, 122, 124, 124, 132, 123, 124, 128, 132, 126, 121, 119, 132, 125, 138, 133, 141, 132, 126, 124, 127, 131, 120, 122, 131, 134, 120, 112, 127, 124, 134, 122, 130, 136, 133, 121, 120, 125, 128, 129, 133, 112, 125, 129, 118, 122, 132, 136, 133, 135, 136, 127, 120, 134, 130, 124, 123, 124, 138, 120, 124, 127, 126, 134, 136, 122, 139, 121, 122, 119, 119, 122, 126, 124, 123, 117, 126, 135, 130, 132, 139, 128, 126, 127, 119, 123, 129, 123, 128, 133, 130, 126, 126, 131, 131, 127, 133, 134, 137, 116, 129, 124, 126, 111, 130, 128, 139, 114, 120, 121, 119, 130, 128, 130, 133, 120, 130, 123, 127, 122, 131, 121, 127, 125, 131, 120, 128, 133, 134, 134, 133, 134, 133, 121, 123, 120, 124, 126, 137, 124, 126, 125, 126, 131, 122, 141, 125, 130, 124, 120, 127, 116, 124, 129, 127, 131, 126, 130, 134, 120, 127, 128, 127, 127, 131, 123, 123, 130, 124, 132, 137, 128, 133, 124, 125, 128, 126, 128, 131, 131, 133, 123, 122, 131, 120, 132, 126, 127, 122, 132, 120, 125, 125, 129, 130, 130, 131, 132, 131, 119, 119, 130, 124, 129, 125, 132, 127, 119, 130, 135, 130, 135, 124, 126, 130, 122, 120, 129, 128, 124, 129, 133, 126, 129, 123, 133, 125, 127, 132, 131, 130, 122, 122, 129, 127, 132, 131, 128, 132, 122, 122, 129, 128, 126, 133, 130, 127, 129, 132, 133, 123, 132, 129, 123, 127, 115, 130, 126, 122, 125, 126, 139, 130, 124, 134, 122, 126, 127, 129, 129, 127, 124, 123, 123, 128, 128, 134, 132, 131, 129, 121, 126, 127, 129, 125, 128, 134, 119, 130, 127, 129, 131, 127, 126, 129, 128, 128, 123, 125, 125, 127, 128, 131, 128, 129, 122, 123, 125, 126, 134, 128, 129, 128, 121, 124, 128, 125, 133, 130, 127, 121, 124, 127, 121, 129, 126, 132, 125, 133, 126, 126, 128, 127, 124, 128, 123, 124, 122, 126, 122, 130, 128, 129, 130, 134, 125, 126, 126, 126, 124, 130, 122, 127, 130, 120, 124, 134, 129, 135, 131, 126, 129, 124, 124, 131, 126, 128, 128, 128, 127, 125, 128, 131, 128, 129, 127, 125, 129, 125, 128, 122, 130, 131, 127, 131, 126, 121, 127, 127, 123, 130, 124, 130, 129, 123, 126, 129, 124, 134, 131, 129, 124, 123, 124, 124, 129, 125, 128, 131, 126, 126, 126, 130, 126, 130, 131, 129, 124, 123, 124, 128, 122, 130, 125, 129, 131, 126, 127, 125, 131, 126, 131, 126, 128, 128, 123, 126, 123, 126, 129, 131, 128, 131, 131, 124, 127, 128, 132, 126, 131, 126, 125, 127, 126, 125, 129, 129, 130, 129, 126, 126, 125, 129, 130, 127, 125, 128, 119, 127, 125, 128, 128, 127, 130, 125, 126, 128, 128, 128, 125, 132, 128, 126, 131, 129, 127, 131, 128, 126, 131, 127, 125, 131, 125, 126, 130, 130, 125, 130, 124, 124, 124, 130, 131, 131, 127, 126, 126, 124, 128, 128, 132, 128, 128, 127, 123, 123, 128, 126, 134, 128, 132, 131, 137, 135, 145, 148, 150, 145, 142, 142, 131, 133, 126, 122, 128, 119, 93, 89, 76, 73, 74, 85, 90, 91, 80, 81, 77, 81, 99, 110, 120, 133, 136, 142, 137, 143, 156, 168, 178, 187, 191, 194, 189, 178, 188, 193, 195, 195, 179, 176, 161, 149, 151, 146, 144, 134, 128, 112, 106, 93, 89, 91, 93, 87, 87, 75, 78, 76, 78, 83, 85, 97, 95, 98, 100, 92, 101, 106, 108, 119, 120, 120, 121, 113, 115, 118, 125, 135, 142, 139, 144, 137, 138, 147, 166, 168, 180, 176, 174, 163, 158, 152, 164, 166, 169, 161, 146, 138, 124, 117, 123, 121, 121, 114, 101, 94, 77, 76, 86, 91, 100, 95, 90, 86, 67, 72, 79, 88, 107, 112, 100, 99, 90, 82, 93, 119, 139, 156, 153, 155, 139, 131, 136, 150, 160, 178, 162, 153, 139, 133, 142, 157, 175, 195, 184, 171, 162, 148, 154, 171, 186, 201, 187, 175, 161, 144, 149, 162, 173, 196, 186, 162, 144, 121, 115, 123, 140, 159, 164, 147, 125, 104, 89, 94, 112, 131, 141, 121, 101, 80, 64, 69, 92, 109, 125, 104, 81, 57, 42, 48, 70, 95, 114, 100, 79, 61, 49, 53, 76, 103, 126, 112, 98, 76, 65, 69, 93, 124, 153, 151, 139, 122, 102, 101, 116, 145, 171, 169, 151, 132, 108, 102, 114, 140, 175, 179, 161, 149, 124, 114, 124, 143, 171, 179, 157, 145, 119, 102, 112, 130, 160, 175, 156, 140, 117, 93, 98, 114, 138, 160, 142, 126, 105, 83, 86, 110, 138, 165, 154, 136, 121, 101, 100, 118, 145, 170, 165, 148, 131, 112, 111, 129, 149, 177, 177, 165, 152, 133, 126, 142, 161, 189, 188, 170, 155, 133, 122, 133, 149, 176, 179, 162, 144, 121, 111, 121, 137, 163, 165, 148, 131, 103, 91, 100, 113, 143, 150, 134, 119, 92, 81, 92, 103, 135, 144, 126, 111, 81, 65, 77, 89, 121, 131, 115, 103, 77, 61, 75, 86, 116, 130, 113, 103, 79, 65, 75, 87, 113, 134, 122, 115, 94, 80, 90, 101, 129, 150, 148, 140, 125, 106, 115, 127, 156, 181, 178, 169, 151, 133, 135, 149, 171, 198, 195, 182, 166, 144, 143, 152, 170, 187, 185, 165, 149, 121, 113, 119, 134, 153, 153, 134, 118, 94, 82, 89, 104, 123, 126, 107, 90, 66, 58, 69, 88, 112, 118, 105, 93, 77, 67, 80, 97, 122, 128, 116, 105, 91, 83, 97, 114, 139, 155, 147, 137, 123, 110, 122, 136, 160, 174, 167, 156, 143, 128, 138, 153, 177, 192, 187, 171, 155, 137, 140, 150, 169, 182, 177, 162, 143, 125, 125, 135, 152, 166, 160, 149, 127, 108, 104, 111, 128, 145, 143, 131, 114, 93, 89, 97, 115, 133, 134, 126, 106, 90, 82, 90, 107, 127, 128, 124, 105, 91, 85, 89, 108, 126, 130, 129, 113, 99, 94, 99, 113, 136, 138, 136, 124, 109, 103, 107, 118, 142, 146, 146, 136, 118, 116, 117, 128, 149, 154, 153, 143, 127, 119, 121, 128, 149, 156, 152, 147, 128, 122, 123, 127, 144, 154, 148, 143, 124, 115, 114, 119, 132, 145, 141, 136, 123, 110, 110, 114, 125, 140, 137, 130, 117, 104, 101, 104, 113, 130, 127, 127, 114, 102, 101, 103, 114, 130, 132, 130, 122, 110, 106, 109, 117, 137, 140, 140, 136, 123, 120, 125, 130, 148, 154, 154, 149, 136, 132, 132, 139, 152, 159, 156, 153, 138, 132, 132, 135, 148, 155, 152, 149, 135, 125, 128, 128, 138, 149, 140, 140, 126, 113, 115, 118, 124, 137, 132, 127, 119, 106, 106, 112, 117, 129, 128, 121, 114, 100, 97, 104, 110, 122, 123, 118, 110, 101, 97, 105, 113, 125, 128, 119, 114, 102, 98, 106, 113, 123, 127, 121, 116, 109, 104, 113, 120, 131, 138, 133, 129, 122, 116, 117, 128, 136, 146, 145, 139, 133, 126, 127, 137, 147, 156, 156, 146, 138, 133, 127, 139, 147, 154, 153, 144, 136, 131, 126, 134, 143, 148, 146, 136, 124, 120, 113, 118, 127, 133, 132, 124, 115, 111, 107, 113, 122, 128, 128, 120, 111, 108, 105, 108, 119, 125, 129, 122, 116, 115, 113, 117, 129, 136, 141, 136, 127, 124, 123, 122, 133, 140, 146, 143, 139, 133, 132, 130, 140, 148, 155, 150, 140, 134, 132, 128, 139, 146, 150, 147, 136, 127, 128, 122, 131, 141, 143, 139, 130, 118, 119, 118, 122, 131, 132, 128, 121, 112, 111, 110, 113, 124, 127, 127, 118, 110, 106, 110, 111, 121, 126, 127, 117, 108, 105, 109, 113, 130, 132, 152, 135, 125, 124, 128, 126, 140, 147, 142, 132, 117, 105, 106, 104, 103, 107, 106, 91, 81, 73, 78, 78, 84, 94, 102, 101, 99, 99, 104, 117, 126, 148, 157, 164, 161, 161, 165, 179, 193, 209, 213, 211, 199, 190, 188, 188, 188, 188, 183, 172, 151, 135, 125, 125, 125, 125, 123, 118, 98, 81, 75, 73, 79, 83, 85, 89, 82, 73, 75, 79, 92, 101, 109, 115, 107, 100, 99, 103, 114, 118, 125, 129, 123, 114, 114, 122, 133, 146, 157, 164, 165, 154, 151, 155, 168, 180, 188, 194, 187, 169, 161, 153, 156, 162, 160, 159, 152, 132, 120, 112, 113, 121, 119, 116, 112, 91, 77, 72, 74, 89, 94, 94, 97, 84, 72, 70, 76, 92, 103, 110, 118, 109, 98, 96, 98, 117, 130, 137, 148, 139, 126, 121, 120, 136, 151, 158, 169, 165, 150, 142, 141, 150, 168, 176, 183, 183, 167, 158, 158, 164, 180, 187, 191, 191, 174, 164, 161, 165, 177, 183, 183, 180, 162, 143, 132, 132, 138, 145, 143, 141, 127, 110, 102, 102, 111, 125, 127, 128, 116, 95, 81, 78, 81, 92, 94, 94, 84, 64, 51, 50, 58, 72, 80, 83, 80, 65, 55, 55, 64, 81, 96, 102, 103, 92, 83, 82, 91, 107, 125, 131, 136, 124, 117, 116, 123, 138, 154, 160, 165, 153, 142, 134, 137, 148, 161, 165, 166, 157, 141, 134, 137, 146, 163, 170, 170, 162, 144, 134, 132, 137, 149, 153, 152, 142, 120, 106, 102, 109, 123, 136, 137, 135, 119, 108, 106, 111, 127, 143, 146, 146, 129, 116, 111, 112, 125, 145, 150, 153, 143, 130, 125, 131, 144, 164, 172, 172, 165, 150, 140, 142, 150, 166, 172, 169, 160, 140, 127, 127, 134, 149, 159, 160, 153, 135, 122, 120, 126, 138, 150, 149, 142, 124, 106, 100, 103, 113, 128, 131, 127, 113, 98, 93, 98, 107, 121, 125, 121, 108, 92, 82, 84, 93, 107, 114, 110, 97, 83, 74, 75, 86, 103, 114, 114, 104, 91, 84, 85, 96, 113, 125, 127, 119, 105, 97, 97, 110, 129, 144, 150, 146, 137, 130, 130, 141, 158, 172, 178, 174, 163, 153, 149, 155, 169, 182, 188, 187, 172, 160, 153, 153, 163, 172, 173, 170, 153, 135, 123, 119, 125, 133, 136, 132, 116, 97, 86, 83, 89, 101, 109, 110, 98, 82, 74, 73, 81, 96, 106, 112, 104, 89, 81, 78, 85, 102, 116, 127, 123, 112, 105, 102, 109, 124, 137, 149, 147, 135, 127, 123, 125, 138, 151, 161, 164, 154, 146, 141, 142, 155, 167, 176, 177, 162, 151, 143, 141, 147, 156, 162, 164, 151, 138, 128, 123, 127, 136, 142, 149, 140, 126, 117, 109, 113, 123, 129, 138, 132, 120, 111, 101, 103, 111, 118, 127, 125, 112, 105, 99, 100, 109, 117, 125, 126, 114, 107, 101, 100, 109, 115, 123, 126, 115, 111, 106, 105, 114, 123, 131, 139, 129, 121, 117, 115, 122, 131, 136, 144, 137, 127, 124, 119, 124, 135, 140, 150, 147, 139, 133, 129, 130, 138, 145, 153, 152, 141, 135, 130, 128, 135, 139, 145, 148, 138, 132, 126, 125, 131, 136, 141, 142, 132, 125, 121, 118, 122, 127, 129, 132, 124, 115, 112, 110, 113, 119, 123, 130, 124, 117, 111, 108, 111, 118, 124, 131, 129, 122, 118, 117, 119, 125, 133, 140, 141, 134, 131, 129, 131, 136, 141, 148, 150, 142, 138, 135, 135, 138, 142, 147, 148, 142, 136, 133, 131, 134, 139, 143, 146, 138, 131, 126, 124, 125, 129, 133, 135, 129, 121, 115, 113, 115, 119, 123, 126, 123, 116, 111, 108, 107, 111, 115, 120, 117, 111, 107, 104, 104, 109, 111, 116, 116, 112, 107, 105, 105, 108, 112, 115, 118, 115, 112, 110, 111, 114, 118, 121, 125, 123, 119, 119, 120, 123, 127, 133, 137, 138, 134, 132, 133, 135, 141, 145, 150, 149, 144, 141, 140, 140, 145, 149, 153, 151, 147, 143, 142, 140, 142, 145, 147, 147, 141, 136, 134, 130, 131, 133, 134, 133, 129, 124, 121, 119, 121, 123, 126, 125, 123, 118, 117, 116, 116, 119, 122, 122, 119, 114, 111, 113, 115, 120, 122, 125, 124, 122, 119, 120, 122, 126, 131, 133, 133, 131, 129, 129, 131, 134, 139, 143, 143, 140, 136, 136, 137, 140, 142, 145, 144, 142, 138, 136, 136, 136, 138, 141, 139, 135, 131, 129, 129, 129, 129, 131, 131, 127, 124, 121, 121, 122, 123, 125, 125, 122, 119, 115, 113, 114, 117, 119, 119, 116, 113, 111, 113, 114, 116, 118, 120, 117, 117, 115, 115, 115, 116, 118, 121, 121, 121, 120, 120, 122, 123, 127, 129, 128, 129, 132, 126, 126, 130, 129, 130, 129, 130, 133, 137, 137, 135, 132, 131, 128, 129, 131, 134, 133, 130, 129, 125, 126, 128, 130, 130, 136, 129, 130, 129, 126, 121, 127, 126, 130, 132, 130, 129, 125, 120, 121, 127, 129, 135, 128, 123, 123, 120, 121, 123, 124, 132, 136, 128, 127, 123, 121, 123, 129, 131, 137, 132, 127, 129, 123, 118, 124, 128, 125, 128, 128, 129, 140, 141, 137, 137, 132, 126, 131, 129, 130, 137, 130, 123, 125, 120, 122, 132, 130, 143, 144, 132, 137, 137, 124, 131, 132, 131, 146, 135, 128, 131, 119, 116, 128, 124, 134, 139, 124, 122, 121, 113, 120, 131, 133, 145, 142, 128, 123, 113, 102, 111, 119, 125, 139, 129, 115, 115, 106, 106, 123, 126, 135, 142, 126, 123, 122, 112, 117, 126, 124, 139, 132, 121, 120, 118, 114, 129, 132, 139, 146, 132, 124, 123, 123, 125, 137, 136, 149, 145, 133, 128, 128, 123, 131, 134, 135, 144, 129, 124, 126, 127, 130, 140, 135, 141, 138, 124, 127, 127, 124, 129, 131, 125, 135, 124, 117, 123, 122, 122, 132, 128, 128, 132, 117, 117, 122, 121, 127, 136, 128, 131, 127, 109, 113, 118, 118, 131, 138, 128, 135, 123, 111, 122, 125, 127, 142, 136, 129, 136, 117, 117, 128, 125, 132, 142, 128, 132, 131, 115, 124, 128, 124, 138, 139, 130, 140, 127, 118, 126, 123, 125, 139, 132, 133, 137, 122, 121, 128, 123, 130, 136, 127, 134, 132, 123, 127, 130, 124, 131, 129, 127, 136, 131, 126, 129, 123, 120, 126, 124, 131, 136, 127, 124, 121, 116, 121, 127, 131, 139, 135, 126, 122, 116, 116, 123, 127, 133, 134, 126, 120, 120, 117, 124, 129, 134, 138, 135, 127, 125, 122, 121, 129, 130, 136, 135, 128, 120, 121, 116, 126, 134, 139, 143, 137, 126, 121, 119, 119, 134, 137, 140, 135, 124, 114, 115, 115, 127, 139, 141, 138, 126, 116, 112, 115, 122, 136, 142, 139, 128, 116, 110, 110, 119, 131, 145, 143, 135, 119, 112, 108, 115, 127, 141, 149, 140, 127, 114, 113, 113, 129, 139, 152, 147, 131, 115, 110, 111, 122, 138, 146, 155, 139, 124, 112, 114, 117, 136, 143, 153, 148, 127, 114, 108, 109, 123, 137, 144, 150, 133, 117, 110, 108, 120, 138, 145, 150, 140, 116, 105, 99, 106, 125, 139, 147, 144, 126, 111, 108, 108, 124, 137, 148, 144, 134, 114, 105, 102, 113, 128, 144, 147, 138, 125, 108, 106, 110, 125, 139, 153, 142, 133, 113, 103, 107, 119, 133, 152, 149, 137, 124, 107, 107, 120, 130, 149, 152, 140, 128, 114, 107, 117, 128, 141, 152, 144, 133, 118, 111, 112, 126, 135, 149, 146, 140, 123, 118, 111, 121, 131, 144, 147, 144, 129, 117, 113, 112, 125, 136, 144, 141, 134, 115, 113, 110, 119, 131, 142, 138, 137, 122, 113, 113, 116, 125, 140, 138, 135, 127, 114, 114, 119, 122, 135, 141, 134, 134, 123, 116, 120, 122, 127, 141, 133, 132, 127, 118, 118, 126, 125, 140, 140, 134, 132, 123, 117, 124, 125, 133, 140, 134, 131, 124, 117, 119, 126, 130, 139, 134, 131, 123, 121, 119, 125, 126, 135, 130, 130, 124, 119, 119, 122, 126, 134, 135, 129, 130, 119, 120, 122, 124, 129, 134, 125, 128, 123, 118, 124, 125, 128, 138, 132, 129, 128, 117, 118, 126, 125, 135, 132, 125, 125, 121, 117, 127, 129, 134, 138, 128, 125, 121, 116, 120, 129, 132, 139, 131, 126, 123, 120, 120, 130, 134, 140, 135, 126, 123, 118, 118, 124, 132, 138, 140, 128, 124, 120, 117, 124, 130, 138, 142, 134, 123, 122, 114, 120, 126, 132, 140, 137, 127, 122, 117, 114, 128, 130, 139, 139, 130, 122, 121, 114, 121, 131, 133, 140, 131, 125, 121, 120, 118, 131, 134, 141, 138, 127, 120, 117, 119, 123, 132, 135, 139, 131, 126, 119, 122, 124, 131, 138, 137, 135, 127, 119, 115, 121, 124, 135, 136, 136, 130, 125, 118, 120, 124, 131, 138, 137, 133, 124, 118, 112, 118, 124, 133, 137, 137, 130, 124, 119, 117, 126, 130, 136, 136, 132, 123, 119, 114, 119, 127, 131, 136, 133, 129, 122, 123, 120, 128, 131, 134, 134, 131, 124, 121, 119, 123, 130, 132, 133, 132, 129, 121, 122, 121, 130, 134, 134, 134, 131, 127, 120, 121, 121, 130, 131, 133, 133, 128, 124, 122, 122, 125, 131, 131, 133, 132, 127, 123, 122, 120, 124, 127, 130, 133, 135, 130, 126, 125, 122, 127, 129, 131, 132, 132, 123, 120, 117, 121, 122, 124, 124, 129, 137, 140, 116, 129, 118, 123, 123, 133, 138, 130, 134, 135, 120, 125, 124, 127, 144, 138, 133, 126, 123, 115, 125, 127, 124, 134, 129, 118, 120, 116, 103, 142, 135, 122, 139, 126, 111, 129, 108, 129, 154, 132, 144, 153, 119, 111, 125, 120, 144, 129, 141, 151, 129, 122, 108, 112, 122, 140, 121, 160, 128, 124, 98, 127, 118, 115, 144, 133, 145, 129, 91, 121, 117, 113, 117, 129, 152, 125, 127, 113, 126, 122, 131, 140, 130, 134, 134, 133, 128, 111, 118, 133, 143, 133, 138, 128, 127, 134, 114, 125, 140, 124, 136, 137, 124, 116, 127, 117, 124, 145, 145, 122, 134, 126, 117, 122, 119, 122, 142, 132, 131, 128, 107, 125, 122, 122, 126, 135, 137, 133, 116, 116, 108, 120, 119, 124, 135, 135, 134, 133, 123, 113, 132, 131, 139, 137, 138, 138, 114, 118, 112, 112, 135, 139, 130, 143, 135, 121, 120, 130, 125, 144, 132, 137, 140, 115, 117, 114, 121, 121, 132, 130, 142, 138, 124, 127, 124, 133, 130, 143, 137, 146, 129, 126, 116, 120, 119, 131, 143, 124, 133, 116, 118, 108, 120, 123, 142, 130, 137, 122, 121, 122, 112, 117, 133, 129, 126, 128, 116, 127, 121, 116, 128, 137, 138, 137, 138, 124, 125, 119, 130, 129, 138, 144, 138, 125, 115, 118, 105, 119, 136, 125, 136, 142, 121, 104, 130, 122, 127, 139, 135, 140, 129, 115, 119, 117, 119, 125, 140, 136, 138, 135, 116, 124, 121, 122, 137, 137, 146, 128, 116, 125, 127, 109, 125, 135, 130, 142, 119, 120, 120, 122, 118, 129, 141, 129, 140, 126, 105, 125, 122, 117, 133, 140, 136, 128, 119, 124, 117, 116, 140, 139, 134, 129, 133, 128, 115, 124, 127, 130, 141, 138, 130, 132, 111, 119, 113, 124, 135, 135, 133, 128, 118, 122, 126, 126, 133, 144, 127, 139, 121, 119, 119, 121, 124, 136, 139, 140, 134, 130, 126, 128, 122, 130, 140, 133, 127, 131, 117, 124, 110, 128, 135, 135, 121, 129, 114, 116, 122, 120, 122, 132, 127, 141, 128, 131, 122, 124, 121, 127, 129, 135, 120, 134, 129, 125, 127, 128, 142, 139, 132, 134, 125, 118, 126, 121, 125, 129, 130, 134, 134, 121, 130, 113, 120, 116, 134, 129, 133, 125, 125, 120, 123, 125, 134, 141, 128, 132, 125, 120, 119, 120, 127, 129, 139, 136, 137, 124, 127, 122, 124, 127, 137, 131, 128, 129, 119, 122, 119, 122, 139, 131, 139, 131, 119, 108, 124, 118, 132, 129, 140, 135, 128, 123, 121, 127, 120, 127, 140, 128, 131, 120, 122, 115, 121, 131, 143, 137, 135, 122, 125, 122, 116, 125, 134, 135, 126, 137, 126, 117, 125, 121, 132, 132, 128, 132, 137, 121, 117, 123, 127, 132, 135, 134, 133, 133, 115, 117, 126, 130, 126, 134, 133, 132, 123, 126, 126, 125, 128, 132, 125, 133, 123, 123, 126, 121, 120, 127, 140, 131, 128, 133, 114, 121, 125, 120, 131, 133, 127, 129, 123, 127, 126, 127, 132, 135, 129, 125, 129, 124, 123, 122, 128, 133, 127, 131, 134, 136, 123, 122, 124, 127, 130, 133, 126, 131, 122, 120, 122, 131, 127, 134, 127, 127, 130, 121, 127, 121, 129, 127, 133, 131, 133, 128, 124, 124, 122, 124, 126, 136, 126, 134, 123, 122, 123, 131, 129, 135, 132, 129, 129, 119, 119, 125, 123, 130, 129, 128, 130, 125, 124, 128, 126, 128, 132, 126, 126, 129, 120, 125, 125, 123, 128, 138, 132, 130, 129, 122, 122, 125, 128, 133, 131, 128, 127, 127, 121, 125, 129, 131, 136, 131, 126, 125, 124, 121, 125, 126, 130, 134, 127, 129, 125, 119, 124, 124, 125, 133, 128, 129, 131, 124, 124, 127, 124, 136, 133, 131, 125, 125, 121, 119, 126, 126, 129, 134, 129, 130, 129, 126, 125, 127, 128, 130, 127, 126, 128, 126, 119, 126, 125, 131, 131, 131, 128, 128, 129, 120, 128, 127, 131, 133, 128, 127, 123, 125, 124, 128, 128, 132, 132, 126, 126, 127, 127, 125, 134, 132, 133, 131, 128, 123, 127, 120, 125, 128, 127, 127, 125, 129, 125, 120, 123, 126, 129, 132, 129, 128, 127, 125, 124, 119, 128, 133, 127, 128, 126, 128, 126, 122, 131, 129, 132, 131, 127, 129, 129, 127, 125, 133, 127, 127, 126, 127, 123, 127, 125, 125, 126, 134, 125, 131, 124, 130, 126, 126, 130, 128, 129, 127, 125, 127, 124, 127, 127, 129, 131, 128, 128, 127, 127, 129, 129, 132, 130, 131, 126, 127, 122, 124, 121, 126, 128, 130, 127, 129, 128, 127, 127, 128, 128, 128, 121, 128, 123, 125, 125, 127, 130, 130, 138, 137, 135, 126, 126, 126, 120, 123, 130, 132, 133, 125, 126, 121, 119, 122, 126, 134, 131, 134, 130, 123, 127, 121, 125, 123, 130, 127, 133, 128, 130, 125, 126, 120, 127, 124, 131, 124, 131, 130, 126, 126, 127, 123, 129, 126, 125, 129, 130, 135, 125, 133, 122, 118, 121, 121, 127, 124, 133, 129, 127, 132, 128, 128, 127, 134, 130, 137, 140, 141, 134, 120, 106, 113, 107, 112, 112, 131, 139, 146, 151, 141, 137, 123, 127, 128, 131, 140, 138, 142, 128, 107, 106, 98, 103, 109, 131, 138, 151, 145, 130, 124, 122, 117, 119, 129, 135, 140, 144, 138, 124, 121, 106, 106, 104, 121, 122, 139, 139, 140, 129, 136, 119, 119, 118, 135, 137, 152, 150, 136, 129, 113, 105, 103, 113, 121, 133, 145, 140, 128, 125, 116, 124, 122, 139, 142, 156, 151, 142, 125, 118, 108, 107, 102, 124, 119, 135, 126, 125, 123, 125, 117, 126, 133, 142, 143, 147, 146, 130, 132, 114, 118, 107, 118, 118, 129, 132, 131, 119, 131, 119, 125, 116, 134, 128, 146, 146, 132, 137, 135, 120, 117, 110, 117, 117, 129, 129, 127, 134, 123, 126, 116, 129, 125, 134, 150, 144, 131, 139, 120, 121, 108, 123, 116, 133, 137, 123, 123, 125, 114, 119, 120, 134, 133, 148, 144, 130, 135, 126, 128, 118, 133, 126, 129, 134, 121, 114, 124, 115, 123, 118, 136, 125, 140, 136, 130, 128, 130, 127, 124, 123, 125, 121, 134, 129, 118, 125, 124, 122, 115, 127, 122, 133, 142, 139, 127, 135, 125, 123, 117, 130, 121, 137, 137, 127, 119, 121, 112, 112, 122, 130, 128, 148, 145, 128, 131, 127, 122, 119, 134, 128, 137, 142, 132, 118, 122, 115, 111, 118, 128, 125, 142, 146, 133, 125, 131, 122, 119, 124, 129, 131, 142, 141, 123, 123, 121, 114, 116, 124, 124, 133, 141, 139, 123, 130, 125, 123, 124, 129, 125, 131, 138, 132, 122, 128, 122, 118, 120, 121, 119, 130, 139, 128, 133, 133, 126, 121, 125, 123, 128, 138, 142, 129, 133, 126, 118, 114, 118, 120, 128, 139, 135, 126, 131, 125, 119, 124, 127, 128, 137, 144, 130, 128, 125, 123, 119, 123, 120, 125, 132, 135, 123, 127, 127, 125, 124, 128, 127, 128, 137, 132, 125, 127, 125, 119, 122, 123, 122, 128, 135, 127, 129, 128, 129, 121, 129, 125, 126, 131, 134, 126, 128, 125, 124, 118, 123, 120, 126, 136, 135, 130, 134, 131, 125, 123, 124, 122, 130, 138, 131, 130, 125, 124, 115, 121, 118, 125, 133, 140, 133, 135, 128, 125, 121, 127, 126, 129, 135, 133, 128, 127, 121, 119, 119, 124, 124, 131, 136, 131, 131, 127, 129, 124, 129, 126, 129, 132, 137, 128, 130, 121, 127, 116, 125, 121, 126, 132, 129, 129, 130, 126, 128, 126, 132, 128, 131, 136, 130, 131, 123, 124, 122, 124, 123, 123, 124, 128, 125, 131, 125, 131, 126, 131, 126, 128, 132, 134, 131, 132, 125, 127, 120, 121, 119, 123, 128, 129, 133, 127, 122, 122, 123, 128, 129, 135, 138, 134, 136, 122, 125, 119, 125, 122, 128, 130, 130, 126, 126, 118, 125, 124, 132, 128, 133, 135, 130, 131, 128, 123, 126, 126, 126, 124, 128, 129, 126, 129, 121, 123, 124, 128, 127, 128, 132, 134, 130, 133, 123, 124, 123, 128, 125, 129, 131, 129, 129, 128, 121, 125, 122, 125, 124, 131, 131, 130, 135, 128, 126, 125, 127, 124, 127, 131, 130, 132, 132, 121, 124, 121, 123, 124, 128, 135, 129, 134, 129, 121, 123, 126, 128, 130, 135, 131, 126, 132, 119, 116, 125, 124, 126, 133, 132, 126, 126, 131, 119, 126, 128, 129, 130, 134, 130, 122, 129, 128, 119, 128, 128, 125, 127, 132, 123, 123, 134, 126, 125, 132, 128, 127, 130, 131, 122, 130, 134, 122, 127, 129, 124, 124, 131, 124, 123, 130, 129, 121, 133, 130, 130, 132, 135, 122, 129, 134, 126, 121, 130, 121, 122, 128, 125, 120, 129, 132, 123, 129, 131, 125, 129, 137, 126, 126, 133, 127, 116, 131, 125, 123, 130, 130, 119, 127, 131, 124, 125, 136, 125, 130, 135, 124, 123, 128, 130, 120, 129, 132, 125, 130, 131, 120, 123, 127, 128, 122, 138, 130, 127, 132, 128, 121, 127, 131, 128, 129, 134, 126, 128, 127, 118, 120, 127, 127, 123, 134, 134, 129, 134, 137, 132, 140, 148, 146, 138, 148, 141, 137, 137, 133, 119, 124, 117, 106, 105, 100, 86, 91, 82, 78, 78, 86, 87, 88, 94, 95, 96, 103, 118, 123, 136, 142, 147, 165, 175, 178, 188, 188, 186, 184, 188, 182, 181, 190, 184, 179, 177, 168, 155, 154, 152, 136, 140, 132, 122, 115, 110, 96, 88, 95, 87, 83, 90, 77, 77, 77, 76, 85, 87, 102, 103, 108, 112, 106, 111, 107, 109, 110, 107, 112, 105, 114, 111, 116, 120, 122, 130, 129, 143, 149, 156, 170, 170, 176, 169, 170, 166, 166, 171, 167, 165, 160, 147, 139, 128, 125, 125, 127, 128, 121, 122, 119, 109, 101, 96, 96, 88, 85, 82, 77, 81, 74, 74, 71, 76, 79, 81, 94, 97, 107, 115, 116, 116, 116, 123, 122, 126, 137, 138, 141, 142, 138, 134, 132, 137, 141, 152, 160, 162, 168, 172, 165, 162, 163, 167, 164, 171, 172, 168, 170, 168, 164, 160, 161, 163, 161, 168, 162, 162, 163, 158, 151, 145, 146, 139, 140, 142, 132, 126, 126, 117, 109, 106, 112, 113, 120, 124, 118, 122, 122, 114, 106, 107, 104, 94, 98, 89, 82, 85, 85, 80, 76, 84, 80, 82, 93, 92, 98, 103, 106, 99, 100, 104, 103, 115, 128, 127, 132, 137, 132, 124, 125, 130, 133, 144, 150, 144, 153, 150, 142, 134, 140, 138, 136, 143, 141, 135, 139, 137, 129, 128, 131, 129, 131, 141, 137, 139, 141, 135, 123, 123, 118, 114, 119, 127, 118, 119, 120, 110, 101, 102, 104, 107, 116, 122, 116, 127, 123, 115, 114, 117, 114, 116, 125, 125, 124, 135, 133, 129, 134, 137, 135, 144, 154, 153, 156, 163, 156, 151, 154, 146, 147, 154, 162, 155, 161, 160, 148, 141, 142, 140, 147, 155, 158, 153, 163, 155, 146, 143, 144, 137, 139, 141, 136, 129, 132, 122, 113, 117, 112, 109, 112, 116, 109, 106, 110, 98, 93, 97, 87, 88, 92, 97, 87, 94, 92, 81, 80, 84, 81, 88, 96, 98, 93, 107, 103, 97, 103, 106, 102, 108, 114, 116, 116, 132, 126, 127, 139, 138, 143, 152, 164, 163, 166, 176, 163, 166, 169, 164, 169, 179, 188, 182, 190, 187, 170, 168, 166, 159, 163, 167, 165, 155, 160, 147, 132, 131, 123, 115, 117, 118, 111, 104, 109, 93, 88, 92, 85, 88, 92, 98, 90, 89, 90, 76, 80, 81, 77, 85, 96, 102, 99, 108, 110, 104, 113, 117, 122, 134, 142, 144, 143, 152, 145, 141, 147, 141, 141, 143, 148, 143, 142, 148, 138, 143, 146, 144, 149, 157, 166, 163, 168, 168, 155, 155, 146, 139, 139, 144, 144, 139, 143, 135, 123, 121, 116, 115, 120, 125, 125, 125, 130, 119, 115, 116, 109, 107, 108, 111, 103, 101, 100, 88, 90, 89, 90, 95, 104, 112, 112, 119, 117, 109, 110, 104, 100, 102, 109, 109, 109, 112, 108, 106, 108, 110, 116, 125, 132, 135, 138, 141, 135, 136, 136, 135, 138, 144, 151, 152, 156, 156, 150, 151, 145, 145, 146, 147, 148, 148, 148, 145, 141, 141, 139, 140, 144, 145, 145, 142, 135, 129, 123, 118, 120, 123, 130, 131, 135, 133, 133, 127, 126, 122, 121, 119, 119, 119, 119, 116, 114, 111, 113, 111, 117, 119, 123, 123, 123, 120, 117, 115, 116, 120, 127, 135, 140, 144, 141, 136, 132, 130, 128, 133, 140, 148, 148, 150, 146, 142, 138, 139, 135, 139, 139, 141, 144, 148, 146, 144, 144, 142, 136, 137, 136, 136, 139, 142, 138, 139, 139, 133, 131, 131, 129, 124, 125, 115, 107, 104, 104, 98, 106, 114, 115, 114, 117, 105, 101, 101, 102, 99, 110, 110, 109, 113, 112, 102, 102, 106, 102, 104, 111, 108, 106, 111, 102, 98, 101, 104, 101, 112, 121, 125, 131, 138, 128, 128, 128, 124, 119, 131, 133, 135, 142, 140, 135, 141, 146, 144, 146, 152, 143, 142, 143, 134, 135, 140, 144, 142, 149, 148, 142, 146, 143, 136, 141, 144, 142, 138, 141, 130, 124, 124, 115, 114, 120, 124, 124, 127, 133, 126, 128, 121, 110, 110, 111, 116, 120, 131, 134, 133, 139, 128, 123, 120, 118, 118, 122, 130, 128, 136, 135, 130, 130, 133, 136, 138, 146, 146, 143, 147, 137, 134, 133, 136, 139, 143, 152, 151, 157, 155, 144, 143, 141, 142, 143, 147, 147, 139, 142, 128, 124, 123, 123, 123, 128, 134, 130, 135, 136, 126, 126, 122, 121, 120, 126, 126, 122, 130, 119, 114, 111, 104, 100, 100, 108, 108, 119, 129, 123, 125, 120, 114, 109, 115, 115, 113, 124, 121, 116, 118, 115, 110, 108, 115, 111, 116, 127, 122, 131, 136, 137, 137, 141, 138, 130, 131, 128, 120, 127, 126, 124, 123, 126, 120, 120, 128, 124, 126, 133, 133, 132, 139, 142, 136, 139, 137, 124, 123, 119, 114, 109, 114, 111, 110, 118, 117, 113, 121, 121, 120, 124, 129, 125, 129, 130, 123, 121, 124, 119, 115, 119, 115, 112, 116, 121, 118, 125, 128, 128, 128, 136, 131, 136, 141, 139, 135, 139, 133, 128, 127, 125, 122, 125, 129, 128, 129, 136, 134, 135, 140, 137, 136, 141, 141, 136, 139, 140, 133, 133, 133, 125, 127, 130, 133, 132, 138, 137, 135, 137, 137, 133, 140, 141, 136, 133, 136, 128, 125, 126, 120, 121, 124, 124, 123, 126, 130, 126, 129, 131, 125, 128, 130, 127, 123, 123, 122, 116, 118, 117, 110, 117, 118, 122, 122, 127, 126, 125, 127, 126, 126, 133, 132, 131, 128, 129, 122, 121, 122, 117, 123, 129, 130, 132, 137, 138, 137, 139, 140, 134, 141, 139, 137, 136, 136, 134, 131, 133, 128, 123, 129, 127, 130, 132, 135, 133, 132, 132, 126, 129, 133, 130, 130, 130, 127, 121, 121, 118, 113, 118, 119, 119, 123, 126, 124, 123, 125, 123, 118, 127, 125, 126, 129, 129, 127, 123, 124, 117, 115, 119, 116, 120, 124, 125, 126, 127, 129, 126, 130, 135, 132, 136, 136, 133, 130, 129, 124, 122, 127, 128, 127, 134, 133, 132, 131, 133, 130, 127, 134, 131, 132, 135, 131, 129, 126, 126, 118, 119, 123, 118, 124, 127, 126, 127, 128, 129, 125, 130, 132, 126, 131, 128, 124, 123, 123, 119, 120, 124, 123, 122, 129, 125, 125, 127, 129, 124, 125, 130, 126, 128, 131, 126, 125, 124, 124, 118, 122, 124, 121, 127, 129, 124, 126, 126, 125, 123, 129, 131, 127, 133, 129, 125, 125, 125, 121, 122, 126, 125, 127, 134, 129, 131, 133, 132, 127, 128, 130, 125, 129, 131, 126, 127, 128, 124, 120, 124, 123, 122, 130, 129, 126, 128, 129, 125, 124, 130, 128, 125, 130, 124, 122, 123, 123, 118, 121, 122, 118, 121, 126, 121, 125, 128, 129, 125, 129, 129, 127, 131, 131, 127, 128, 129, 125, 124, 129, 126, 128, 135, 133, 132, 135, 136, 132, 135, 139, 136, 137, 140, 134, 132, 133, 130, 127, 131, 131, 128, 131, 133, 127, 129, 132, 129, 127, 131, 128, 126, 129, 129, 124, 126, 128, 121, 123, 125, 121, 123, 128, 126, 122, 127, 127, 122, 127, 127, 124, 124, 126, 121, 121, 125, 122, 122, 128, 125, 124, 128, 129, 125, 128, 131, 128, 127, 130, 127, 128, 132, 133, 128, 132, 131, 127, 130, 130, 128, 130, 133, 132, 129, 133, 130, 129, 133, 132, 131, 131, 132, 127, 126, 129, 125, 126, 130, 127, 126, 129, 130, 125, 126, 129, 125, 126, 127, 124, 125, 127, 128, 124, 126, 126, 121, 124, 124, 122, 123, 127, 125, 121, 126, 122, 122, 127, 125, 124, 125, 126, 122, 122, 125, 120, 123, 126, 122, 122, 126, 127, 123, 126, 128, 124, 127, 127, 126, 128, 131, 132, 126, 131, 128, 126, 130, 128, 127, 129, 132, 130, 128, 133, 127, 130, 133, 130, 131, 133, 135, 129, 130, 131, 125, 130, 131, 125, 127, 130, 131, 126, 129, 129, 126, 130, 127, 126, 128, 131, 129, 125, 129, 125, 126, 127, 125, 125, 127, 128, 124, 124, 126, 122, 127, 126, 125, 126, 129, 129, 126, 129, 127, 127, 129, 128, 126, 128, 129, 127, 124, 126, 126, 129, 128, 127, 128, 130, 132, 128, 127, 127, 128, 130, 127, 128, 127, 131, 130, 127, 129, 127, 128, 129, 128, 129, 130, 133, 130, 129, 129, 128, 129, 127, 127, 126, 128, 129, 127, 125, 125, 128, 128, 126, 127, 126, 128, 129, 126, 125, 125, 128, 126, 125, 128, 127, 129, 128, 126, 125, 125, 127, 124, 125, 127, 127, 129, 127, 126, 124, 127, 127, 125, 127, 126, 127, 129, 128, 124, 126, 130, 127, 126, 127, 127, 128, 131, 126, 123, 126, 128, 124, 125, 127, 125, 130, 129, 125, 124, 129, 127, 125, 127, 127, 126, 129, 127, 125, 124, 128, 124, 124, 126, 125, 124, 129, 125, 122, 126, 128, 124, 124, 126, 123, 127, 130, 124, 123, 127, 126, 122, 125, 125, 123, 129, 127, 124, 125, 128, 125, 125, 128, 126, 126, 130, 127, 125, 128, 129, 126, 128, 128, 126, 128, 131, 126, 126, 131, 129, 127, 128, 128, 126, 130, 132, 127, 128, 132, 129, 127, 129, 127, 126, 130, 129, 125, 127, 129, 125, 126, 127, 125, 127, 131, 128, 127, 131, 130, 128, 130, 127, 127, 128, 130, 124, 126, 130, 125, 127, 128, 123, 108, 136, 144, 108, 140, 126, 123, 121, 125, 132, 123, 135, 139, 128, 147, 130, 124, 136, 126, 119, 127, 127, 128, 131, 142, 115, 141, 115, 116, 115, 117, 119, 127, 140, 115, 127, 136, 126, 131, 130, 138, 134, 130, 129, 148, 123, 112, 134, 119, 140, 132, 144, 146, 141, 139, 104, 121, 124, 130, 116, 145, 118, 121, 110, 140, 128, 117, 136, 121, 119, 137, 110, 124, 138, 125, 121, 129, 136, 118, 122, 121, 122, 142, 127, 127, 125, 131, 119, 136, 142, 122, 128, 131, 132, 130, 126, 125, 130, 128, 133, 124, 137, 130, 128, 128, 136, 120, 124, 119, 128, 126, 151, 125, 134, 131, 121, 119, 118, 119, 121, 116, 135, 117, 123, 126, 131, 125, 127, 129, 132, 132, 128, 120, 122, 127, 124, 108, 129, 126, 119, 137, 138, 121, 134, 132, 126, 124, 133, 131, 126, 134, 130, 117, 132, 130, 115, 125, 132, 134, 131, 139, 128, 132, 120, 124, 124, 123, 125, 121, 134, 125, 120, 126, 129, 130, 131, 133, 134, 140, 131, 136, 129, 130, 124, 135, 117, 125, 135, 131, 142, 126, 132, 125, 123, 113, 116, 122, 127, 124, 133, 127, 121, 128, 120, 122, 126, 123, 133, 125, 123, 137, 130, 124, 129, 120, 134, 128, 129, 134, 136, 127, 135, 127, 125, 134, 132, 124, 127, 131, 121, 129, 134, 114, 126, 126, 127, 112, 138, 130, 120, 127, 132, 131, 132, 124, 133, 128, 132, 126, 127, 130, 126, 135, 127, 136, 134, 128, 130, 130, 140, 120, 120, 130, 135, 124, 124, 130, 126, 130, 112, 125, 123, 129, 131, 119, 133, 134, 129, 132, 111, 129, 128, 123, 119, 133, 140, 131, 126, 135, 130, 115, 137, 127, 125, 122, 130, 132, 124, 129, 129, 124, 129, 131, 116, 141, 129, 125, 124, 119, 125, 125, 121, 124, 122, 130, 128, 126, 126, 131, 122, 132, 125, 126, 132, 135, 121, 129, 129, 129, 125, 127, 133, 128, 130, 127, 134, 132, 118, 130, 133, 128, 116, 124, 132, 137, 113, 123, 125, 115, 125, 123, 119, 123, 130, 134, 125, 133, 123, 126, 120, 128, 126, 139, 127, 131, 136, 122, 130, 128, 133, 139, 124, 135, 129, 122, 131, 125, 126, 126, 124, 120, 132, 128, 138, 119, 128, 120, 125, 128, 119, 122, 126, 129, 126, 125, 128, 139, 119, 130, 131, 122, 133, 131, 125, 125, 128, 125, 129, 129, 126, 127, 130, 126, 129, 128, 121, 129, 127, 132, 128, 122, 142, 127, 129, 120, 127, 116, 132, 122, 127, 126, 132, 125, 126, 128, 134, 130, 124, 124, 129, 130, 129, 122, 131, 125, 123, 127, 133, 128, 126, 129, 126, 129, 126, 123, 130, 127, 122, 129, 131, 132, 129, 125, 130, 126, 124, 125, 129, 129, 132, 123, 131, 122, 128, 127, 128, 134, 131, 126, 130, 130, 121, 129, 122, 126, 127, 132, 131, 128, 138, 123, 128, 128, 120, 129, 129, 126, 124, 125, 131, 131, 124, 134, 124, 129, 125, 122, 128, 135, 126, 124, 124, 125, 127, 129, 130, 130, 132, 130, 123, 127, 129, 126, 126, 129, 124, 124, 131, 129, 128, 130, 128, 124, 129, 130, 124, 129, 127, 125, 123, 130, 125, 127, 129, 126, 122, 126, 133, 124, 128, 125, 126, 125, 129, 129, 128, 134, 128, 127, 123, 122, 124, 127, 128, 121, 122, 136, 123, 132, 128, 130, 124, 128, 125, 126, 128, 128, 121, 128, 124, 125, 123, 132, 128, 125, 130, 126, 122, 132, 120, 125, 134, 129, 123, 134, 128, 133, 130, 129, 126, 125, 125, 126, 126, 127, 124, 132, 130, 126, 131, 129, 130, 131, 127, 127, 128, 128, 130, 122, 125, 125, 125, 128, 127, 126, 128, 128, 124, 127, 122, 129, 128, 125, 132, 128, 124, 131, 127, 126, 128, 124, 122, 123, 128, 126, 126, 130, 128, 129, 128, 131, 126, 130, 128, 130, 129, 124, 124, 129, 123, 128, 125, 126, 132, 128, 132, 125, 126, 126, 129, 125, 126, 131, 130, 130, 128, 124, 125, 129, 128, 127, 128, 128, 127, 129, 126, 127, 132, 130, 128, 124, 130, 123, 130, 128, 125, 127, 128, 129, 123, 126, 129, 127, 128, 127, 122, 125, 126, 130, 123, 129, 130, 124, 130, 128, 124, 126, 128, 130, 124, 126, 130, 128, 134, 130, 126, 130, 130, 128, 123, 134, 125, 125, 130, 128, 125, 131, 129, 127, 126, 130, 122, 130, 126, 128, 125, 125, 129, 124, 129, 130, 127, 131, 128, 127, 127, 127, 122, 125, 129, 126, 129, 130, 127, 132, 128, 132, 125, 130, 125, 129, 124, 124, 128, 123, 125, 125, 126, 125, 129, 129, 128, 127, 126, 127, 128, 122, 125, 129, 125, 127, 130, 132, 131, 131, 133, 127, 126, 123, 123, 129, 129, 129, 125, 130, 126, 122, 128, 131, 127, 125, 130, 124, 131, 124, 128, 125, 130, 124, 126, 129, 128, 122, 130, 121, 124, 123, 132, 125, 128, 134, 129, 129, 131, 128, 127, 125, 127, 124, 126, 132, 130, 132, 129, 124, 120, 122, 127, 120, 124, 126, 130, 128, 134, 129, 136, 132, 131, 124, 136, 124, 125, 123, 124, 122, 124, 133, 122, 131, 131, 131, 126, 133, 124, 128, 127, 128, 124, 136, 128, 131, 136, 130, 122, 122, 127, 121, 116, 119, 125, 122, 133, 131, 134, 138, 137, 133, 130, 137, 124, 125, 120, 124, 118, 124, 121, 128, 128, 128, 124, 135, 133, 129, 126, 133, 131, 123, 134, 129, 134, 132, 130, 120, 124, 124, 121, 119, 121, 122, 126, 132, 128, 139, 134, 136, 129, 133, 131, 130, 121, 127, 117, 121, 124, 124, 128, 124, 126, 126, 128, 132, 127, 127, 133, 128, 130, 129, 136, 131, 131, 127, 119, 122, 124, 118, 117, 122, 119, 132, 127, 132, 135, 139, 131, 130, 132, 129, 128, 124, 125, 117, 120, 124, 127, 124, 129, 126, 129, 129, 130, 122, 132, 127, 127, 131, 130, 133, 132, 131, 125, 122, 124, 125, 117, 122, 120, 126, 126, 131, 132, 129, 137, 129, 133, 130, 130, 127, 128, 121, 122, 122, 126, 126, 126, 128, 125, 127, 131, 124, 127, 128, 126, 131, 132, 134, 132, 132, 127, 123, 122, 124, 120, 122, 123, 125, 126, 127, 133, 130, 136, 128, 130, 128, 129, 123, 128, 124, 125, 121, 126, 128, 128, 129, 127, 130, 128, 127, 121, 128, 123, 127, 130, 130, 135, 131, 131, 128, 124, 127, 121, 123, 122, 124, 130, 127, 130, 130, 135, 128, 127, 132, 129, 128, 125, 125, 122, 128, 124, 129, 130, 132, 126, 128, 129, 129, 124, 127, 124, 126, 128, 128, 134, 132, 134, 129, 126, 127, 121, 123, 125, 122, 127, 125, 128, 133, 134, 131, 126, 128, 129, 127, 126, 126, 125, 125, 125, 122, 131, 131, 129, 127, 128, 128, 124, 125, 128, 125, 129, 127, 131, 132, 133, 126, 129, 128, 125, 121, 123, 126, 124, 127, 126, 129, 134, 134, 127, 129, 128, 132, 126, 127, 125, 124, 130, 122, 124, 130, 130, 129, 127, 127, 128, 124, 129, 126, 126, 129, 125, 134, 132, 130, 125, 128, 128, 125, 121, 128, 124, 124, 129, 125, 131, 129, 127, 127, 128, 129, 130, 125, 129, 122, 127, 129, 124, 130, 129, 129, 126, 129, 128, 126, 124, 128, 125, 129, 126, 129, 132, 130, 128, 125, 128, 128, 125, 124, 128, 125, 129, 127, 129, 129, 128, 127, 126, 130, 128, 128, 125, 128, 124, 127, 125, 128, 128, 130, 128, 129, 127, 128, 124, 125, 128, 123, 130, 125, 133, 130, 128, 127, 126, 128, 127, 122, 125, 126, 125, 131, 125, 131, 129, 130, 125, 126, 128, 127, 127, 127, 125, 126, 127, 124, 129, 129, 129, 129, 129, 127, 128, 121, 129, 124, 125, 128, 125, 133, 128, 128, 127, 128, 129, 126, 124, 127, 124, 129, 128, 127, 130, 128, 130, 123, 127, 127, 126, 127, 128, 124, 128, 127, 127, 128, 128, 129, 128, 131, 127, 126, 123, 128, 122, 129, 126, 126, 131, 129, 129, 125, 129, 129, 125, 125, 126, 124, 131, 126, 130, 129, 128, 128, 124, 130, 126, 125, 127, 125, 126, 130, 126, 128, 127, 130, 127, 128, 129, 127, 126, 125, 127, 123, 129, 124, 128, 131, 130, 127, 129, 129, 127, 124, 126, 126, 124, 130, 124, 129, 128, 129, 127, 126, 129, 125, 127, 128, 126, 129, 131, 126, 128, 128, 129, 124, 130, 127, 127, 125, 126, 125, 126, 129, 125, 128, 132, 130, 128, 131, 128, 127, 124, 127, 122, 126, 128, 125, 131, 129, 127, 124, 127, 127, 126, 127, 131, 126, 131, 129, 127, 130, 128, 126, 125, 129, 126, 125, 126, 127, 123, 127, 128, 126, 130, 131, 129, 130, 130, 129, 127, 126, 127, 122, 128, 125, 128, 130, 129, 125, 124, 126, 127, 126, 129, 130, 127, 132, 127, 130, 130, 128, 125, 126, 128, 126, 125, 126, 125, 124, 128, 126, 129, 131, 130, 127, 129, 130, 128, 127, 127, 126, 125, 128, 124, 129, 128, 127, 125, 126, 127, 126, 124, 129, 127, 130, 131, 128, 131, 129, 128, 123, 127, 126, 126, 125, 127, 124, 125, 128, 126, 130, 129, 130, 126, 131, 128, 128, 126, 128, 123, 127, 127, 125, 129, 128, 128, 125, 128, 127, 127, 126, 127, 124, 132, 129, 129, 130, 130, 126, 123, 127, 125, 128, 127, 128, 124, 128, 126, 127, 128, 127, 127, 129, 131, 128, 127, 127, 127, 123, 129, 125, 129, 129, 129, 126, 126, 127, 128, 126, 128, 126, 127, 132, 127, 131, 129, 130, 125, 126, 126, 126, 126, 128, 126, 125, 128, 126, 130, 128, 128, 127, 132, 129, 128, 126, 128, 125, 125, 128, 123, 130, 129, 128, 126, 126, 126, 127, 126, 129, 125, 130, 131, 127, 132, 128, 129, 124, 127, 125, 125, 127, 127, 124, 128, 127, 127, 131, 128, 126, 127, 130, 128, 128, 126, 129, 124, 130, 125, 126, 130, 129, 127, 126, 126, 126, 126, 126, 127, 124, 133, 128, 130, 131, 129, 127, 126, 127, 125, 126, 128, 127, 125, 129, 126, 129, 129, 127, 125, 127, 128, 127, 127, 128, 128, 125, 130, 125, 128, 130, 128, 125, 127, 126, 126, 125, 128, 124, 126, 132, 127, 130, 129, 128, 125, 127, 125, 126, 127, 129, 126, 129, 129, 126, 128, 128, 126, 125, 129, 126, 127, 126, 129, 125, 128, 129, 126, 130, 130, 127, 126, 126, 124, 126, 126, 128, 125, 130, 130, 129, 130, 129, 127, 126, 126, 125, 126, 127, 127, 126, 129, 127, 127, 129, 129, 126, 127, 128, 128, 128, 126, 128, 125, 129, 127, 127, 129, 129, 127, 127, 125, 125, 126, 127, 127, 125, 131, 128, 131, 130, 130, 127, 126, 125, 125, 126, 127, 126, 127, 129, 126, 129, 129, 128, 125, 127, 126, 129, 127, 127, 126, 127, 129, 127, 129, 129, 129, 126, 126, 125, 126, 126, 126, 125, 128, 130, 129, 131, 129, 129, 126, 126, 125, 128, 126, 128, 126, 129, 127, 128, 129, 128, 127, 125, 126, 127, 127, 125, 128, 127, 130, 129, 129, 130, 130, 128, 126, 125, 125, 126, 125, 126, 125, 129, 129, 130, 130, 129, 129, 127, 126, 127, 127, 126, 128, 126, 130, 126, 128, 128, 127, 126, 125, 126, 128, 126, 126, 127, 128, 130, 128, 131, 130, 130, 126, 125, 124, 126, 124, 124, 125, 126, 129, 129, 131, 129, 129, 129, 126, 125, 127, 126, 127, 128, 127, 129, 127, 129, 127, 127, 125, 124, 126, 128, 125, 127, 128, 129, 128, 128, 130, 129, 130, 127, 126, 125, 127, 123, 125, 125, 128, 128, 130, 130, 129, 129, 128, 125, 124, 127, 125, 128, 127, 130, 128, 128, 129, 127, 127, 126, 124, 127, 127, 126, 127, 127, 130, 126, 129, 129, 129, 129, 126, 126, 126, 127, 124, 125, 127, 128, 128, 131, 129, 129, 128, 128, 124, 126, 126, 125, 128, 127, 129, 127, 130, 128, 127, 127, 126, 125, 129, 126, 127, 126, 129, 129, 126, 130, 128, 129, 128, 126, 125, 127, 125, 125, 125, 128, 127, 128, 131, 130, 130, 128, 127, 124, 127, 126, 127, 127, 128, 128, 127, 130, 128, 127, 127, 125, 125, 128, 126, 128, 126, 130, 127, 127, 130, 128, 129, 127, 126, 126, 127, 126, 125, 125, 129, 126, 129, 130, 130, 128, 128, 126, 124, 127, 126, 127, 127, 130, 127, 129, 130, 128, 126, 127, 125, 127, 127, 127, 127, 126, 131, 126, 128, 130, 128, 128, 127, 127, 127, 127, 127, 124, 126, 130, 126, 130, 130, 129, 127, 127, 125, 125, 127, 127, 126, 128, 130, 126, 130, 130, 128, 126, 127, 125, 128, 127, 128, 125, 128, 129, 125, 129, 129, 128, 127, 127, 127, 127, 127, 127, 124, 129, 128, 127, 130, 130, 128, 126, 126, 125, 126, 126, 127, 125, 129, 129, 127, 130, 130, 127, 126, 126, 125, 127, 126, 127, 124, 130, 127, 127, 129, 129, 127, 127, 127, 127, 126, 127, 126, 124, 130, 127, 128, 130, 130, 127, 127, 126, 126, 125, 127, 126, 126, 130, 127, 129, 130, 129, 127, 126, 126, 126, 126, 128, 126, 127, 130, 127, 128, 129, 129, 127, 127, 127, 127, 126, 127, 125, 127, 130, 126, 128, 129, 129, 126, 127, 126, 126, 125, 128, 125, 128, 129, 127, 129, 130, 128, 127, 127, 126, 127, 125, 127, 124, 127, 128, 126, 129, 129, 128, 127, 127, 127, 127, 126, 128, 124, 129, 128, 127, 128, 128, 128, 126, 126, 126, 126, 126, 127, 126, 129, 128, 129, 130, 130, 128, 127, 126, 126, 126, 125, 127, 124, 129, 127, 127, 129, 129, 127, 127, 127, 128, 127, 127, 127, 125, 130, 126, 128, 128, 129, 126, 126, 126, 126, 125, 128, 125, 128, 128, 128, 129, 129, 130, 126, 128, 125, 125, 123, 123, 130, 131, 141, 144, 149, 146, 149, 148, 142, 136, 135, 125, 122, 109, 102, 94, 84, 80, 80, 81, 85, 84, 86, 82, 88, 87, 95, 108, 113, 126, 133, 143, 143, 147, 160, 163, 171, 175, 180, 184, 186, 182, 181, 184, 185, 185, 181, 176, 168, 159, 149, 141, 133, 131, 120, 118, 111, 101, 98, 90, 86, 83, 80, 81, 78, 77, 83, 84, 91, 91, 99, 99, 104, 101, 101, 103, 104, 107, 111, 112, 112, 115, 117, 121, 119, 127, 134, 143, 143, 149, 150, 154, 158, 162, 167, 166, 170, 171, 167, 163, 160, 159, 158, 156, 149, 144, 135, 131, 119, 117, 109, 104, 99, 95, 86, 82, 80, 83, 84, 90, 94, 92, 93, 92, 90, 90, 93, 97, 97, 102, 103, 105, 110, 120, 126, 139, 145, 150, 150, 154, 151, 148, 149, 153, 155, 157, 159, 159, 163, 165, 166, 167, 173, 172, 172, 172, 173, 169, 170, 173, 174, 173, 172, 174, 175, 175, 174, 173, 173, 172, 162, 157, 150, 143, 140, 134, 132, 124, 119, 112, 108, 105, 108, 107, 114, 112, 108, 100, 94, 89, 86, 83, 82, 80, 78, 73, 66, 69, 71, 76, 80, 83, 83, 78, 75, 71, 70, 72, 79, 80, 85, 85, 89, 93, 103, 108, 121, 128, 135, 132, 132, 131, 130, 132, 134, 138, 139, 138, 138, 137, 136, 140, 146, 152, 156, 154, 153, 152, 149, 144, 145, 145, 148, 144, 139, 133, 134, 131, 133, 137, 139, 141, 136, 132, 126, 120, 117, 119, 118, 119, 116, 113, 111, 116, 116, 121, 127, 132, 131, 131, 126, 124, 125, 126, 131, 137, 138, 143, 141, 145, 148, 150, 156, 161, 161, 163, 158, 158, 154, 157, 155, 159, 159, 160, 155, 157, 151, 153, 155, 155, 155, 152, 148, 145, 139, 136, 132, 130, 129, 126, 121, 121, 116, 120, 120, 124, 121, 120, 116, 113, 107, 107, 100, 104, 102, 98, 97, 94, 96, 98, 99, 104, 103, 101, 98, 92, 90, 90, 87, 90, 93, 93, 91, 92, 94, 97, 101, 107, 106, 111, 110, 108, 111, 113, 118, 122, 127, 133, 132, 135, 140, 143, 152, 157, 162, 167, 169, 168, 164, 165, 168, 168, 174, 173, 168, 168, 164, 161, 162, 163, 164, 164, 160, 153, 142, 134, 129, 123, 123, 119, 114, 109, 104, 98, 95, 95, 97, 96, 99, 93, 89, 87, 83, 84, 88, 93, 97, 96, 97, 97, 98, 102, 105, 110, 116, 117, 117, 115, 119, 120, 125, 131, 137, 139, 143, 140, 144, 148, 150, 157, 162, 164, 164, 160, 160, 159, 159, 162, 164, 164, 165, 160, 160, 159, 161, 160, 159, 158, 153, 146, 141, 133, 133, 131, 130, 129, 126, 123, 122, 119, 121, 121, 120, 120, 117, 112, 109, 105, 107, 107, 108, 109, 107, 106, 105, 104, 106, 106, 111, 111, 110, 110, 106, 107, 108, 107, 114, 116, 116, 114, 112, 114, 116, 120, 123, 125, 126, 126, 122, 122, 124, 127, 130, 134, 136, 133, 132, 133, 134, 139, 142, 143, 146, 144, 138, 134, 134, 138, 137, 142, 141, 138, 135, 132, 130, 135, 136, 140, 137, 136, 133, 125, 124, 125, 124, 130, 130, 127, 125, 121, 118, 117, 120, 122, 120, 122, 117, 114, 109, 108, 110, 115, 118, 118, 114, 113, 112, 111, 116, 120, 123, 128, 127, 125, 125, 124, 126, 126, 134, 136, 136, 138, 136, 136, 138, 142, 147, 150, 153, 152, 144, 146, 143, 140, 145, 149, 147, 146, 140, 140, 140, 141, 139, 139, 142, 139, 134, 131, 129, 127, 127, 128, 128, 126, 125, 122, 118, 119, 119, 118, 121, 119, 114, 113, 111, 111, 111, 112, 110, 109, 109, 104, 104, 107, 108, 109, 110, 111, 111, 109, 112, 110, 110, 114, 114, 112, 113, 112, 113, 115, 117, 121, 123, 125, 121, 120, 122, 123, 127, 130, 132, 130, 129, 130, 131, 134, 139, 142, 145, 147, 143, 140, 143, 142, 146, 146, 148, 150, 146, 142, 136, 139, 142, 143, 145, 144, 141, 136, 131, 133, 131, 133, 137, 134, 131, 125, 119, 117, 120, 119, 121, 122, 123, 119, 116, 112, 113, 117, 118, 120, 117, 117, 114, 112, 112, 118, 121, 126, 128, 125, 124, 124, 124, 127, 131, 133, 138, 136, 136, 133, 135, 133, 137, 142, 143, 144, 144, 143, 144, 140, 142, 147, 146, 145, 141, 138, 137, 134, 133, 135, 136, 133, 133, 129, 129, 129, 129, 129, 130, 128, 128, 125, 122, 119, 121, 119, 120, 121, 120, 118, 115, 113, 112, 111, 113, 117, 117, 118, 117, 117, 119, 118, 119, 117, 119, 117, 116, 114, 115, 113, 115, 114, 117, 119, 123, 125, 129, 131, 129, 135, 130, 131, 129, 123, 130, 117, 118, 145, 127, 109, 140, 117, 141, 124, 144, 132, 139, 139, 146, 133, 156, 126, 140, 138, 132, 125, 129, 122, 122, 129, 115, 126, 129, 124, 112, 123, 121, 122, 140, 134, 120, 133, 123, 123, 126, 127, 131, 134, 110, 124, 133, 104, 113, 130, 122, 148, 127, 154, 140, 149, 125, 122, 122, 143, 111, 130, 133, 117, 113, 107, 125, 117, 113, 140, 117, 142, 122, 124, 139, 157, 126, 146, 145, 156, 112, 132, 107, 134, 123, 137, 123, 136, 138, 135, 151, 150, 129, 153, 143, 152, 138, 130, 124, 135, 129, 118, 126, 131, 111, 117, 127, 119, 117, 131, 126, 124, 145, 136, 120, 134, 132, 117, 121, 115, 115, 109, 113, 108, 110, 108, 122, 113, 117, 119, 133, 125, 130, 126, 121, 120, 132, 112, 117, 130, 120, 113, 136, 117, 120, 136, 129, 126, 142, 127, 130, 130, 136, 121, 128, 139, 137, 127, 138, 130, 131, 123, 133, 120, 124, 128, 127, 128, 131, 120, 130, 141, 123, 142, 137, 142, 131, 130, 128, 131, 124, 127, 134, 124, 132, 128, 128, 112, 139, 131, 141, 138, 123, 124, 125, 115, 105, 122, 116, 119, 115, 119, 112, 115, 122, 119, 126, 126, 128, 128, 125, 118, 139, 121, 136, 132, 122, 135, 129, 119, 125, 138, 128, 149, 130, 139, 142, 129, 125, 136, 136, 131, 145, 134, 116, 132, 130, 111, 111, 144, 127, 124, 128, 134, 131, 125, 121, 138, 139, 134, 131, 140, 133, 130, 126, 123, 132, 129, 125, 128, 129, 136, 119, 130, 131, 136, 119, 129, 123, 131, 126, 116, 126, 128, 124, 120, 123, 124, 119, 132, 113, 116, 133, 122, 115, 130, 130, 130, 126, 130, 133, 124, 125, 134, 126, 121, 114, 131, 128, 118, 134, 123, 129, 135, 131, 122, 138, 121, 132, 119, 133, 129, 128, 134, 124, 119, 131, 130, 125, 135, 127, 124, 127, 122, 128, 128, 130, 130, 140, 137, 134, 133, 124, 128, 127, 114, 124, 133, 123, 124, 129, 121, 124, 118, 132, 137, 139, 115, 130, 119, 116, 128, 121, 125, 127, 122, 129, 122, 127, 121, 130, 118, 137, 134, 135, 126, 140, 131, 133, 136, 135, 143, 137, 128, 126, 124, 126, 133, 133, 130, 132, 129, 135, 131, 129, 137, 123, 132, 123, 136, 121, 116, 122, 117, 123, 130, 121, 134, 129, 113, 122, 124, 121, 130, 125, 123, 127, 132, 115, 127, 118, 129, 121, 120, 121, 129, 118, 119, 125, 121, 129, 125, 132, 130, 126, 131, 123, 123, 125, 128, 122, 131, 121, 132, 126, 127, 130, 133, 129, 122, 133, 137, 129, 129, 129, 139, 127, 129, 137, 138, 128, 130, 117, 133, 130, 127, 126, 132, 133, 129, 132, 134, 131, 131, 124, 136, 127, 125, 129, 129, 124, 120, 123, 126, 128, 134, 130, 127, 131, 124, 123, 124, 127, 125, 131, 119, 125, 123, 131, 126, 123, 131, 123, 127, 124, 115, 130, 121, 127, 122, 127, 135, 126, 128, 129, 121, 131, 122, 126, 132, 129, 125, 129, 126, 130, 129, 130, 135, 135, 129, 126, 126, 131, 132, 132, 132, 134, 127, 131, 127, 132, 128, 133, 126, 129, 129, 129, 126, 126, 124, 126, 126, 134, 129, 131, 123, 128, 117, 124, 128, 122, 127, 126, 125, 122, 124, 125, 128, 128, 128, 123, 126, 128, 124, 126, 126, 120, 125, 128, 125, 128, 131, 126, 122, 119, 127, 122, 126, 125, 126, 125, 128, 123, 130, 132, 129, 126, 128, 122, 126, 126, 120, 133, 129, 126, 129, 132, 129, 134, 127, 131, 127, 129, 130, 135, 127, 127, 123, 127, 127, 126, 129, 133, 133, 130, 123, 124, 127, 128, 125, 125, 130, 131, 125, 131, 123, 122, 128, 124, 129, 130, 122, 129, 123, 124, 127, 125, 127, 134, 130, 131, 126, 121, 127, 121, 130, 126, 128, 128, 130, 124, 126, 127, 126, 129, 132, 130, 128, 125, 130, 125, 125, 131, 125, 130, 131, 126, 129, 126, 130, 126, 134, 124, 136, 128, 130, 127, 125, 126, 132, 128, 132, 131, 127, 126, 124, 127, 126, 130, 129, 127, 126, 127, 123, 124, 128, 123, 129, 130, 129, 125, 127, 123, 130, 122, 127, 125, 127, 125, 125, 124, 122, 130, 125, 125, 128, 129, 127, 127, 128, 130, 124, 127, 131, 129, 132, 128, 128, 127, 128, 122, 128, 131, 126, 124, 129, 125, 128, 132, 128, 130, 129, 128, 126, 129, 124, 131, 125, 125, 127, 127, 130, 128, 127, 130, 126, 130, 128, 126, 130, 126, 128, 127, 127, 124, 128, 128, 129, 130, 125, 126, 123, 126, 120, 127, 129, 130, 128, 127, 129, 125, 126, 123, 125, 124, 123, 126, 124, 123, 127, 126, 129, 127, 131, 131, 132, 127, 131, 128, 124, 125, 127, 129, 128, 125, 130, 125, 127, 124, 131, 130, 127, 126, 129, 127, 129, 126, 129, 132, 127, 129, 125, 127, 128, 127, 129, 128, 126, 128, 125, 125, 126, 125, 125, 129, 132, 133, 132, 134, 126, 124, 123, 126, 125, 124, 123, 123, 127, 126, 129, 130, 131, 129, 131, 129, 128, 124, 126, 122, 123, 128, 123, 131, 129, 128, 128, 128, 124, 125, 117, 128, 129, 134, 131, 135, 131, 134, 125, 125, 125, 123, 117, 127, 125, 126, 124, 130, 126, 133, 126, 133, 131, 127, 127, 126, 125, 122, 124, 124, 131, 127, 131, 131, 134, 131, 130, 130, 124, 126, 121, 121, 127, 130, 127, 131, 128, 132, 132, 130, 127, 130, 122, 124, 125, 127, 120, 124, 125, 127, 128, 133, 134, 133, 127, 130, 127, 126, 121, 124, 123, 126, 127, 129, 125, 131, 125, 133, 132, 126, 128, 122, 123, 127, 126, 123, 127, 127, 127, 138, 132, 130, 129, 124, 120, 130, 120, 127, 128, 126, 126, 134, 130, 132, 130, 129, 130, 128, 120, 122, 122, 121, 125, 131, 127, 130, 131, 128, 137, 130, 129, 128, 124, 121, 126, 124, 128, 123, 127, 124, 132, 134, 128, 130, 125, 130, 124, 125, 126, 124, 122, 128, 128, 131, 125, 126, 128, 131, 136, 130, 130, 127, 120, 124, 125, 127, 123, 126, 125, 133, 129, 129, 128, 132, 128, 132, 129, 124, 123, 119, 126, 128, 127, 128, 133, 127, 131, 132, 128, 127, 126, 118, 124, 129, 128, 126, 130, 127, 133, 127, 128, 130, 128, 122, 130, 128, 126, 125, 126, 125, 128, 126, 127, 129, 126, 126, 134, 131, 129, 125, 123, 124, 130, 126, 127, 128, 127, 125, 128, 131, 131, 126, 127, 131, 130, 126, 123, 125, 125, 126, 124, 127, 127, 124, 128, 138, 136, 131, 127, 125, 123, 123, 125, 123, 128, 125, 130, 132, 131, 129, 128, 129, 130, 125, 124, 124, 126, 126, 127, 129, 131, 128, 124, 125, 132, 129, 124, 125, 126, 122, 129, 132, 130, 131, 126, 128, 131, 129, 124, 126, 125, 126, 125, 127, 125, 128, 127, 127, 133, 129, 125, 126, 125, 130, 129, 130, 127, 125, 122, 127, 131, 128, 126, 127, 129, 134, 129, 127, 124, 127, 123, 125, 127, 125, 124, 125, 129, 130, 128, 130, 130, 129, 129, 127, 129, 124, 122, 124, 127, 129, 126, 131, 131, 127, 128, 126, 128, 128, 122, 125, 126, 125, 128, 127, 131, 132, 132, 127, 129, 126, 119, 125, 126, 127, 126, 130, 128, 129, 131, 124, 131, 129, 124, 123, 128, 124, 127, 126, 128, 131, 131, 128, 129, 130, 128, 126, 127, 125, 125, 122, 130, 132, 132, 126, 128, 127, 128, 126, 127, 128, 128, 124, 128, 130, 126, 126, 125, 130, 129, 126, 127, 127, 131, 127, 131, 129, 126, 125, 122, 128, 130, 126, 127, 127, 125, 128, 129, 130, 128, 126, 124, 124, 128, 122, 126, 130, 128, 132, 129, 128, 128, 129, 125, 127, 125, 123, 122, 124, 123, 131, 130, 131, 131, 130, 125, 128, 128, 124, 124, 124, 124, 132, 127, 129, 128, 131, 128, 128, 128, 126, 126, 127, 126, 128, 126, 127, 126, 128, 131, 128, 131, 129, 122, 126, 127, 128, 128, 128, 127, 127, 131, 124, 127, 128, 126, 130, 131, 129, 126, 127, 128, 128, 130, 124, 125, 124, 122, 128, 130, 129, 131, 129, 130, 132, 129, 123, 124, 126, 123, 127, 127, 124, 129, 127, 131, 132, 131, 126, 127, 126, 125, 125, 126, 123, 125, 126, 131, 133, 133, 128, 127, 127, 127, 124, 124, 123, 126, 125, 129, 130, 130, 128, 126, 130, 131, 128, 127, 127, 128, 125, 127, 126, 125, 125, 123, 130, 132, 128, 130, 128, 126, 127, 128, 129, 126, 125, 123, 127, 129, 126, 130, 131, 128, 132, 131, 127, 125, 124, 123, 127, 127, 126, 125, 127, 127, 132, 130, 132, 129, 127, 125, 127, 126, 124, 123, 125, 125, 131, 130, 130, 130, 129, 126, 129, 128, 126, 124, 126, 126, 128, 126, 127, 128, 129, 129, 129, 130, 128, 124, 126, 127, 127, 126, 126, 127, 128, 128, 126, 130, 129, 126, 129, 128, 127, 127, 126, 128, 129, 127, 125, 126, 125, 126, 129, 130, 129, 129, 126, 127, 129, 126, 124, 125, 125, 125, 129, 127, 127, 130, 128, 129, 130, 127, 125, 127, 127, 126, 128, 130, 130, 141, 135, 142, 148, 146, 139, 144, 144, 136, 137, 130, 122, 117, 109, 102, 100, 92, 89, 86, 83, 83, 74, 78, 81, 88, 91, 98, 104, 110, 114, 123, 138, 138, 147, 157, 163, 171, 179, 185, 193, 193, 192, 191, 194, 195, 185, 183, 177, 170, 164, 151, 145, 140, 129, 123, 120, 111, 102, 93, 87, 84, 83, 82, 85, 85, 83, 83, 89, 90, 89, 93, 97, 102, 105, 103, 107, 107, 108, 110, 112, 111, 113, 114, 118, 122, 126, 128, 133, 136, 142, 148, 151, 155, 160, 162, 167, 169, 170, 166, 167, 163, 159, 155, 150, 144, 140, 133, 131, 124, 118, 111, 110, 106, 104, 99, 93, 92, 89, 87, 88, 85, 86, 83, 83, 85, 86, 88, 88, 93, 97, 99, 106, 109, 115, 122, 124, 130, 133, 135, 136, 142, 143, 146, 149, 149, 153, 156, 154, 159, 161, 161, 160, 163, 165, 169, 169, 172, 173, 176, 174, 179, 176, 175, 171, 170, 170, 166, 161, 158, 154, 153, 148, 147, 144, 141, 135, 135, 133, 133, 127, 125, 123, 123, 119, 119, 117, 115, 111, 108, 109, 106, 101, 100, 99, 98, 97, 94, 92, 90, 87, 84, 85, 83, 81, 80, 82, 86, 89, 90, 94, 97, 98, 101, 107, 109, 113, 116, 122, 128, 132, 134, 139, 142, 142, 142, 143, 141, 141, 140, 140, 140, 141, 139, 140, 139, 139, 138, 137, 135, 134, 131, 131, 131, 133, 130, 132, 131, 131, 127, 126, 125, 123, 120, 119, 116, 114, 113, 112, 111, 111, 109, 110, 111, 112, 112, 116, 116, 118, 117, 116, 116, 115, 115, 116, 121, 124, 127, 131, 134, 139, 142, 144, 147, 148, 147, 150, 153, 155, 155, 156, 155, 156, 156, 153, 156, 155, 151, 149, 148, 148, 147, 146, 148, 148, 150, 149, 151, 148, 146, 145, 142, 141, 139, 132, 131, 130, 128, 124, 124, 120, 117, 112, 110, 109, 107, 103, 102, 99, 98, 94, 94, 92, 92, 89, 89, 89, 87, 85, 87, 89, 93, 94, 94, 94, 96, 95, 96, 100, 103, 106, 110, 113, 118, 121, 122, 128, 131, 135, 140, 147, 153, 157, 161, 164, 168, 169, 170, 173, 175, 177, 179, 179, 181, 183, 182, 181, 182, 180, 176, 174, 169, 163, 156, 150, 145, 139, 133, 127, 122, 118, 112, 110, 107, 103, 98, 96, 94, 91, 88, 88, 86, 84, 82, 81, 80, 78, 77, 79, 83, 88, 90, 96, 101, 109, 113, 119, 125, 128, 130, 132, 135, 138, 137, 138, 139, 141, 142, 142, 145, 146, 144, 143, 145, 146, 146, 147, 150, 154, 157, 157, 161, 160, 160, 159, 158, 157, 152, 147, 143, 140, 138, 135, 134, 132, 130, 126, 124, 124, 121, 118, 117, 118, 119, 117, 117, 116, 114, 112, 109, 107, 104, 100, 98, 97, 98, 97, 99, 102, 103, 105, 107, 110, 110, 110, 109, 107, 108, 106, 105, 105, 105, 105, 106, 109, 112, 114, 118, 122, 126, 129, 131, 133, 133, 133, 134, 139, 143, 146, 150, 152, 155, 155, 154, 153, 149, 146, 143, 140, 139, 136, 137, 138, 140, 143, 143, 145, 143, 140, 136, 134, 133, 129, 128, 128, 128, 129, 127, 128, 128, 127, 126, 127, 128, 125, 122, 121, 119, 119, 118, 119, 119, 117, 116, 116, 117, 117, 115, 115, 115, 117, 117, 121, 124, 127, 129, 132, 135, 136, 135, 135, 135, 137, 136, 138, 139, 141, 142, 143, 145, 144, 139, 138, 136, 136, 137, 139, 144, 148, 149, 148, 147, 145, 138, 135, 133, 135, 136, 138, 141, 142, 142, 138, 134, 131, 123, 118, 114, 112, 110, 107, 109, 109, 108, 109, 109, 110, 107, 105, 104, 103, 104, 103, 107, 109, 111, 112, 112, 112, 110, 108, 108, 107, 108, 105, 104, 104, 104, 103, 103, 106, 109, 110, 116, 121, 126, 128, 131, 132, 131, 129, 127, 127, 129, 129, 133, 137, 142, 143, 146, 146, 144, 140, 137, 136, 137, 139, 143, 145, 148, 147, 144, 143, 142, 140, 139, 142, 145, 144, 142, 137, 131, 124, 118, 117, 118, 121, 123, 128, 132, 130, 126, 122, 118, 115, 113, 114, 117, 119, 122, 125, 130, 133, 131, 130, 127, 126, 123, 125, 127, 129, 130, 132, 135, 136, 135, 137, 140, 144, 144, 144, 142, 140, 135, 135, 138, 142, 143, 149, 151, 154, 153, 151, 149, 145, 142, 140, 140, 140, 136, 134, 132, 131, 130, 128, 129, 131, 132, 131, 132, 131, 126, 123, 121, 121, 122, 121, 124, 125, 124, 122, 119, 115, 109, 106, 106, 110, 115, 118, 123, 125, 124, 121, 118, 115, 111, 110, 110, 113, 116, 117, 120, 121, 121, 119, 116, 116, 117, 117, 122, 126, 131, 132, 133, 133, 132, 128, 124, 124, 125, 124, 128, 129, 131, 130, 131, 130, 128, 125, 123, 123, 126, 126, 130, 131, 133, 133, 131, 131, 130, 126, 123, 122, 121, 119, 119, 116, 116, 116, 116, 118, 119, 118, 117, 120, 124, 124, 124, 124, 125, 124, 121, 121, 119, 118, 117, 118, 122, 122, 120, 121, 122, 123, 124, 128, 131, 133, 134, 136, 139, 138, 134, 132, 132, 132, 129, 130, 130, 130, 130, 132, 134, 134, 132, 134, 135, 139, 140, 140, 140, 139, 135, 135, 136, 135, 133, 134, 133, 135, 133, 131, 129, 130, 130, 131, 132, 134, 132, 133, 132, 134, 132, 130, 129, 127, 125, 124, 122, 123, 123, 122, 122, 125, 125, 123, 123, 123, 124, 123, 122, 123, 124, 123, 123, 124, 124, 121, 122, 122, 122, 120, 120, 125, 127, 127, 129, 130, 131, 129, 130, 130, 131, 130, 129, 132, 133, 132, 135, 134, 135, 135, 136, 136, 136, 133, 132, 135, 137, 136, 136, 134, 135, 133, 131, 130, 129, 127, 126, 126, 128, 127, 128, 128, 129, 128, 128, 129, 127, 124, 123, 123, 124, 122, 122, 120, 121, 122, 121, 121, 122, 122, 123, 124, 127, 126, 126, 126, 126, 125, 124, 124, 122, 122, 120, 120, 123, 123, 123, 125, 127, 130, 131, 132, 132, 134, 133, 132, 133, 132, 131, 132, 130, 131, 129, 127, 127, 128, 126, 127, 130, 131, 131, 132, 130, 132, 130, 127, 127, 127, 125, 123, 123, 122, 121, 123, 124, 126, 127, 127, 128, 128, 126, 124, 125, 126, 125, 126, 126, 127, 126, 124, 124, 124, 123, 124, 122, 124, 124, 125, 126, 127, 127, 127, 127, 127, 126, 125, 124, 126, 124, 123, 123, 122, 124, 124, 124, 126, 127, 127, 127, 129, 129, 129, 130, 128, 128, 128, 127, 127, 127, 125, 125, 127, 128, 127, 128, 126, 127, 127, 127, 127, 128, 127, 127, 128, 129, 128, 128, 126, 126, 125, 124, 125, 125, 123, 123, 124, 125, 124, 124, 123, 125, 126, 126, 126, 126, 124, 122, 121, 122, 121, 121, 123, 124, 126, 127, 128, 129, 129, 128, 128, 131, 131, 129, 130, 132, 133, 133, 133, 133, 133, 133, 132, 135, 134, 133, 135, 135, 135, 135, 134, 133, 133, 132, 131, 134, 133, 130, 130, 128, 130, 129, 127, 127, 128, 126, 126, 127, 127, 126, 127, 127, 129, 127, 126, 126, 125, 123, 122, 122, 124, 123, 123, 123, 125, 124, 124, 124, 124, 123, 123, 123, 125, 125, 126, 127, 127, 127, 126, 127, 126, 126, 126, 125, 129, 129, 129, 130, 131, 131, 131, 132, 132, 133, 131, 130, 131, 130, 130, 131, 130, 131, 132, 132, 132, 132, 130, 129, 130, 129, 128, 129, 128, 130, 129, 128, 127, 126, 124, 124, 125, 126, 126, 126, 125, 126, 125, 125, 125, 125, 123, 124, 124, 124, 123, 122, 121, 124, 124, 125, 126, 125, 125, 124, 123, 125, 124, 123, 122, 124, 124, 125, 125, 125, 125, 124, 123, 126, 125, 125, 126, 126, 127, 128, 127, 127, 128, 127, 126, 129, 128, 128, 129, 128, 130, 130, 130, 130, 131, 129, 129, 131, 131, 131, 131, 130, 132, 131, 129, 129, 130, 128, 128, 128, 128, 128, 128, 127, 129, 128, 128, 128, 128, 127, 127, 127, 128, 127, 127, 127, 128, 127, 126, 125, 125, 125, 125, 125, 127, 126, 126, 127, 127, 127, 128, 128, 128, 129, 128, 127, 130, 128, 127, 127, 127, 128, 128, 128, 128, 129, 128, 128, 129, 128, 127, 128, 127, 130, 129, 129, 129, 129, 128, 128, 129, 129, 129, 129, 127, 130, 130, 129, 129, 130, 128, 128, 129, 129, 128, 128, 127, 128, 127, 127, 128, 128, 127, 127, 126, 128, 126, 125, 125, 127, 127, 127, 127, 127, 127, 127, 125, 127, 125, 125, 125, 126, 126, 126, 126, 126, 126, 126, 125, 127, 126, 126, 128, 127, 128, 128, 126, 126, 127, 127, 126, 128, 127, 127, 128, 127, 128, 127, 126, 126, 127, 127, 126, 128, 128, 127, 127, 126, 128, 127, 127, 127, 127, 126, 126, 125, 126, 126, 126, 126, 128, 127, 127, 127, 126, 125, 124, 123, 124, 124, 124, 124, 126, 126, 127, 126, 126, 126, 126, 124, 127, 126, 126, 125, 125, 125, 126, 126, 126, 126, 125, 125, 127, 127, 127, 127, 127, 127, 128, 128, 129, 129, 128, 128, 129, 127, 128, 128, 127, 129, 129, 128, 129, 128, 128, 128, 129, 129, 129, 129, 128, 130, 129, 128, 128, 127, 127, 126, 127, 128, 128, 128, 128, 129, 129, 129, 129, 128, 128, 128, 127, 126, 127, 126, 128, 129, 131, 132, 131, 124, 130, 115, 118, 149, 124, 123, 140, 118, 128, 115, 133, 123, 132, 135, 137, 131, 145, 118, 136, 124, 122, 124, 125, 126, 131, 135, 130, 137, 127, 113, 111, 123, 114, 132, 137, 131, 116, 136, 119, 141, 133, 131, 137, 130, 111, 134, 142, 121, 124, 132, 127, 141, 128, 152, 143, 140, 130, 109, 116, 126, 107, 132, 125, 128, 104, 129, 141, 120, 120, 140, 111, 141, 119, 115, 128, 143, 106, 121, 134, 130, 110, 129, 122, 145, 130, 136, 120, 132, 122, 131, 141, 134, 115, 130, 131, 133, 126, 125, 136, 149, 128, 121, 142, 123, 121, 132, 141, 124, 122, 118, 120, 119, 141, 131, 127, 142, 138, 124, 128, 114, 123, 118, 129, 122, 117, 124, 125, 122, 125, 132, 134, 134, 133, 130, 130, 116, 129, 113, 122, 126, 123, 115, 137, 111, 130, 141, 134, 130, 141, 130, 137, 124, 132, 110, 128, 129, 122, 121, 130, 122, 131, 127, 128, 136, 135, 122, 134, 124, 125, 120, 129, 128, 118, 129, 118, 131, 125, 126, 129, 144, 131, 136, 131, 133, 126, 126, 129, 124, 130, 125, 136, 125, 127, 130, 129, 117, 118, 125, 129, 124, 131, 121, 126, 125, 129, 117, 130, 118, 119, 122, 123, 125, 138, 129, 138, 125, 128, 127, 129, 126, 132, 133, 135, 135, 116, 129, 127, 121, 123, 139, 126, 130, 137, 121, 119, 133, 131, 110, 125, 134, 120, 120, 129, 132, 133, 132, 128, 134, 131, 128, 118, 133, 127, 132, 131, 127, 134, 125, 119, 127, 135, 133, 122, 136, 134, 134, 112, 125, 118, 131, 116, 122, 125, 130, 121, 121, 126, 136, 129, 140, 119, 121, 134, 117, 118, 128, 133, 129, 128, 131, 133, 119, 128, 139, 132, 123, 127, 137, 126, 116, 131, 126, 124, 136, 120, 124, 130, 122, 127, 125, 127, 126, 135, 120, 124, 121, 133, 124, 125, 133, 127, 125, 124, 118, 128, 129, 130, 133, 133, 132, 129, 125, 128, 130, 124, 130, 126, 137, 116, 123, 134, 133, 121, 129, 134, 133, 125, 114, 127, 116, 125, 129, 122, 127, 117, 126, 129, 125, 132, 135, 127, 130, 130, 131, 120, 123, 129, 128, 128, 128, 133, 134, 126, 127, 126, 131, 128, 137, 124, 125, 127, 119, 127, 125, 131, 131, 119, 127, 116, 133, 122, 127, 128, 131, 127, 128, 125, 134, 126, 121, 127, 123, 123, 127, 124, 127, 129, 129, 131, 136, 132, 135, 126, 124, 123, 129, 121, 125, 130, 128, 131, 121, 132, 130, 131, 127, 129, 121, 127, 123, 123, 127, 125, 131, 123, 132, 131, 130, 127, 123, 128, 127, 126, 127, 128, 125, 121, 130, 130, 138, 131, 123, 125, 131, 120, 126, 125, 131, 128, 128, 134, 126, 133, 122, 130, 130, 126, 127, 130, 128, 126, 119, 126, 130, 133, 135, 130, 133, 130, 118, 124, 130, 128, 124, 128, 123, 127, 128, 134, 128, 132, 131, 126, 128, 123, 124, 131, 125, 123, 124, 130, 130, 122, 129, 131, 123, 133, 127, 132, 129, 125, 121, 123, 124, 133, 127, 132, 129, 130, 120, 125, 129, 130, 128, 128, 129, 127, 121, 129, 128, 133, 130, 126, 127, 126, 125, 128, 122, 126, 128, 129, 125, 131, 129, 128, 122, 128, 122, 134, 123, 125, 124, 123, 124, 127, 128, 128, 136, 127, 126, 119, 128, 124, 131, 127, 128, 123, 126, 123, 128, 126, 131, 129, 128, 127, 125, 122, 126, 123, 129, 132, 123, 127, 132, 130, 121, 124, 128, 125, 129, 123, 127, 133, 126, 122, 134, 128, 131, 133, 125, 124, 126, 123, 131, 129, 129, 130, 126, 131, 125, 127, 133, 130, 129, 126, 126, 125, 123, 127, 123, 125, 130, 129, 128, 129, 125, 126, 128, 126, 124, 128, 124, 131, 121, 123, 127, 125, 130, 134, 129, 127, 126, 128, 125, 130, 131, 123, 129, 126, 124, 123, 128, 125, 128, 131, 132, 127, 127, 126, 129, 123, 127, 131, 122, 130, 126, 123, 125, 130, 128, 130, 129, 128, 127, 123, 130, 125, 125, 129, 130, 127, 128, 130, 127, 125, 127, 132, 125, 130, 128, 127, 126, 129, 124, 130, 129, 127, 132, 127, 123, 124, 128, 127, 132, 126, 127, 125, 125, 126, 127, 129, 127, 131, 124, 124, 126, 126, 127, 129, 130, 133, 124, 130, 130, 124, 131, 128, 129, 128, 128, 121, 128, 129, 123, 128, 134, 126, 130, 130, 127, 128, 128, 124, 129, 127, 126, 128, 122, 126, 127, 127, 127, 127, 132, 128, 126, 126, 126, 127, 125, 131, 131, 135, 142, 139, 144, 146, 145, 146, 146, 143, 136, 135, 127, 127, 118, 106, 97, 97, 85, 84, 84, 81, 84, 82, 83, 89, 87, 94, 102, 110, 118, 125, 136, 145, 145, 160, 166, 175, 172, 180, 190, 192, 188, 192, 196, 191, 190, 184, 181, 170, 161, 156, 151, 144, 137, 131, 119, 115, 106, 100, 90, 93, 85, 83, 81, 80, 77, 87, 84, 87, 87, 90, 89, 94, 91, 96, 100, 103, 106, 106, 112, 115, 108, 114, 114, 122, 121, 132, 132, 135, 142, 144, 149, 158, 166, 169, 178, 179, 171, 165, 157, 152, 153, 154, 162, 170, 157, 146, 130, 119, 115, 113, 120, 120, 111, 98, 85, 76, 79, 83, 91, 98, 94, 83, 80, 75, 81, 90, 101, 110, 107, 100, 102, 96, 108, 124, 135, 155, 150, 140, 133, 127, 129, 143, 159, 177, 184, 171, 163, 152, 144, 152, 166, 182, 190, 175, 168, 150, 145, 155, 172, 195, 204, 190, 175, 159, 152, 150, 172, 183, 191, 172, 156, 139, 126, 121, 135, 140, 154, 138, 127, 114, 99, 94, 103, 115, 131, 124, 111, 96, 82, 68, 78, 94, 113, 110, 99, 82, 69, 55, 64, 81, 97, 106, 94, 80, 73, 58, 62, 80, 98, 112, 110, 106, 98, 86, 88, 101, 124, 138, 141, 136, 129, 117, 115, 128, 142, 162, 159, 154, 143, 130, 123, 136, 148, 168, 168, 165, 159, 143, 133, 142, 152, 167, 170, 165, 153, 142, 121, 128, 133, 150, 150, 145, 134, 124, 106, 109, 113, 129, 138, 136, 126, 120, 99, 112, 111, 129, 137, 139, 132, 125, 108, 115, 121, 135, 145, 149, 146, 140, 127, 128, 143, 156, 166, 168, 163, 163, 148, 142, 151, 158, 171, 168, 161, 157, 145, 138, 146, 147, 162, 159, 150, 145, 133, 123, 133, 133, 141, 145, 137, 126, 118, 105, 116, 120, 129, 128, 124, 113, 110, 91, 97, 105, 113, 116, 114, 102, 101, 87, 90, 97, 108, 115, 111, 101, 101, 84, 85, 91, 100, 112, 113, 102, 100, 88, 86, 96, 104, 114, 123, 114, 112, 103, 95, 106, 119, 129, 143, 139, 135, 132, 125, 134, 147, 160, 168, 167, 163, 156, 144, 148, 158, 171, 179, 177, 169, 162, 149, 147, 151, 159, 163, 160, 148, 141, 120, 111, 117, 122, 130, 131, 119, 113, 98, 88, 91, 99, 104, 110, 101, 97, 84, 76, 78, 93, 102, 111, 110, 104, 98, 92, 93, 103, 114, 122, 123, 121, 113, 106, 111, 124, 136, 147, 149, 146, 142, 133, 136, 143, 155, 158, 166, 160, 157, 147, 144, 152, 167, 168, 174, 166, 157, 151, 143, 143, 155, 156, 157, 152, 146, 133, 129, 125, 138, 142, 142, 137, 128, 118, 114, 111, 118, 125, 124, 124, 119, 110, 104, 102, 110, 114, 118, 119, 115, 108, 102, 98, 103, 115, 114, 121, 116, 111, 103, 102, 106, 118, 119, 125, 125, 117, 111, 109, 108, 120, 126, 129, 131, 126, 116, 119, 118, 129, 135, 140, 142, 136, 129, 126, 127, 136, 143, 143, 145, 139, 133, 131, 131, 138, 144, 142, 145, 140, 133, 134, 129, 129, 139, 134, 137, 136, 130, 125, 124, 121, 132, 131, 132, 131, 123, 119, 121, 115, 124, 125, 123, 125, 119, 110, 111, 106, 116, 117, 120, 125, 119, 112, 114, 108, 117, 126, 125, 128, 125, 117, 123, 122, 126, 136, 132, 140, 142, 129, 134, 134, 135, 146, 146, 146, 149, 140, 140, 142, 138, 145, 147, 147, 149, 139, 133, 136, 130, 141, 141, 138, 140, 134, 129, 133, 127, 133, 132, 127, 128, 124, 115, 120, 115, 118, 123, 120, 120, 121, 110, 117, 113, 113, 118, 115, 116, 118, 109, 110, 108, 108, 115, 114, 114, 119, 111, 111, 112, 111, 116, 115, 114, 121, 113, 112, 117, 115, 121, 120, 119, 125, 123, 120, 126, 125, 127, 130, 126, 134, 133, 128, 135, 135, 137, 140, 136, 139, 143, 138, 143, 145, 145, 144, 141, 140, 144, 139, 141, 144, 141, 142, 138, 137, 141, 136, 135, 137, 133, 131, 126, 125, 127, 123, 121, 126, 125, 122, 120, 117, 120, 118, 115, 120, 121, 118, 116, 112, 116, 118, 116, 121, 125, 124, 120, 118, 120, 124, 123, 128, 133, 132, 129, 128, 129, 134, 133, 137, 142, 141, 139, 134, 134, 139, 139, 143, 146, 147, 145, 138, 137, 139, 139, 139, 143, 144, 140, 132, 131, 129, 132, 131, 136, 137, 134, 126, 121, 119, 121, 121, 125, 128, 126, 118, 116, 113, 117, 118, 120, 126, 122, 116, 111, 108, 111, 114, 116, 119, 120, 117, 108, 113, 114, 120, 143, 142, 147, 139, 133, 125, 129, 130, 127, 136, 134, 121, 110, 104, 93, 97, 91, 95, 95, 88, 81, 78, 82, 86, 96, 104, 117, 122, 115, 118, 121, 138, 145, 164, 177, 185, 179, 180, 185, 194, 199, 205, 206, 205, 197, 185, 175, 172, 167, 162, 158, 151, 136, 123, 111, 106, 104, 102, 97, 95, 84, 75, 71, 71, 74, 81, 86, 92, 89, 80, 83, 87, 94, 101, 106, 117, 116, 108, 107, 104, 112, 121, 126, 136, 136, 127, 125, 128, 137, 150, 160, 168, 174, 167, 164, 165, 171, 179, 185, 186, 183, 166, 152, 144, 142, 142, 148, 144, 139, 124, 107, 101, 99, 101, 110, 109, 107, 96, 82, 75, 75, 82, 91, 95, 98, 93, 82, 78, 82, 90, 105, 115, 123, 127, 117, 113, 118, 123, 137, 145, 150, 153, 142, 131, 130, 133, 145, 156, 162, 166, 158, 148, 149, 153, 164, 179, 182, 187, 179, 167, 164, 166, 171, 180, 182, 184, 175, 163, 155, 155, 158, 165, 165, 164, 155, 140, 132, 130, 128, 137, 135, 134, 127, 109, 101, 97, 97, 106, 107, 105, 102, 89, 79, 76, 77, 87, 92, 87, 82, 67, 56, 57, 58, 66, 76, 75, 79, 72, 65, 66, 74, 86, 104, 108, 114, 111, 104, 103, 111, 117, 135, 138, 141, 135, 123, 119, 125, 131, 149, 157, 160, 157, 146, 140, 144, 148, 161, 170, 166, 161, 146, 135, 137, 142, 151, 161, 156, 154, 140, 128, 126, 130, 137, 147, 144, 141, 129, 117, 113, 116, 121, 133, 135, 133, 125, 113, 111, 114, 121, 136, 141, 142, 138, 127, 123, 128, 134, 148, 156, 157, 152, 143, 135, 138, 144, 155, 165, 167, 163, 154, 146, 146, 150, 160, 167, 168, 161, 146, 136, 131, 132, 140, 148, 150, 145, 131, 120, 116, 117, 124, 135, 138, 135, 123, 112, 106, 107, 113, 123, 125, 122, 110, 99, 91, 91, 97, 107, 114, 113, 104, 95, 87, 87, 92, 100, 105, 105, 98, 87, 81, 80, 86, 95, 104, 108, 105, 97, 92, 92, 97, 108, 119, 126, 126, 120, 116, 118, 123, 135, 147, 155, 156, 150, 146, 145, 150, 160, 170, 177, 178, 171, 165, 162, 163, 168, 175, 180, 179, 170, 159, 152, 149, 151, 154, 157, 154, 143, 130, 121, 117, 116, 120, 122, 120, 109, 98, 89, 85, 87, 92, 97, 99, 94, 86, 81, 80, 86, 93, 100, 104, 102, 97, 95, 95, 99, 107, 114, 120, 122, 118, 117, 116, 119, 127, 136, 143, 146, 142, 140, 140, 142, 148, 156, 160, 164, 159, 155, 152, 151, 155, 160, 164, 166, 161, 154, 150, 148, 148, 152, 154, 154, 148, 139, 134, 130, 128, 130, 130, 132, 129, 120, 117, 115, 115, 120, 123, 124, 122, 114, 111, 110, 110, 113, 115, 115, 115, 109, 106, 106, 106, 108, 113, 115, 118, 113, 110, 108, 110, 113, 118, 121, 123, 118, 115, 114, 115, 118, 123, 125, 128, 127, 123, 123, 124, 128, 133, 136, 138, 136, 132, 131, 132, 134, 138, 139, 140, 138, 134, 133, 134, 136, 139, 142, 143, 142, 136, 133, 132, 135, 138, 140, 139, 138, 131, 129, 129, 131, 133, 134, 134, 134, 128, 124, 123, 121, 122, 123, 123, 124, 119, 115, 114, 115, 117, 119, 118, 120, 118, 115, 115, 117, 119, 122, 122, 124, 125, 123, 124, 128, 131, 133, 134, 133, 135, 132, 134, 137, 139, 141, 142, 142, 144, 142, 141, 142, 143, 144, 145, 144, 142, 138, 135, 136, 137, 138, 138, 136, 134, 131, 128, 127, 128, 128, 128, 126, 125, 122, 119, 119, 119, 119, 118, 116, 114, 113, 111, 111, 112, 112, 111, 110, 110, 109, 107, 108, 111, 111, 112, 111, 109, 108, 106, 107, 110, 113, 114, 114, 113, 112, 111, 113, 116, 119, 121, 122, 123, 123, 122, 124, 127, 131, 134, 135, 136, 136, 134, 135, 138, 142, 144, 145, 144, 145, 143, 144, 146, 148, 149, 149, 147, 146, 142, 141, 143, 145, 145, 143, 140, 137, 133, 131, 132, 133, 134, 133, 130, 127, 124, 121, 121, 123, 125, 124, 121, 117, 114, 112, 114, 117, 120, 119, 118, 116, 115, 114, 115, 119, 122, 123, 123, 121, 120, 119, 122, 126, 130, 132, 132, 131, 131, 130, 131, 136, 140, 142, 142, 141, 139, 137, 137, 140, 143, 146, 144, 141, 137, 135, 134, 136, 139, 141, 140, 137, 134, 131, 129, 131, 132, 134, 131, 129, 124, 121, 119, 120, 122, 125, 124, 121, 117, 114, 113, 116, 118, 120, 120, 117, 114, 112, 110, 111, 114, 118, 119, 118, 115, 114, 112, 113, 118, 122, 124, 123, 122, 120, 119, 119, 122, 125, 129, 129, 127, 125, 124, 124, 128, 132, 135, 134, 132, 129, 127, 126, 130, 133, 135, 135, 132, 130, 128, 126, 128, 130, 134, 134, 133, 129, 127, 124, 126, 130, 133, 135, 133, 128, 126, 124, 124, 129, 130, 131, 129, 126, 124, 122, 123, 127, 131, 133, 131, 127, 123, 120, 120, 124, 127, 128, 127, 126, 124, 123, 122, 126, 129, 131, 131, 128, 127, 125, 127, 136, 130, 126, 125, 119, 118, 118, 125, 141, 150, 153, 148, 136, 126, 121, 122, 131, 145, 145, 138, 127, 113, 109, 114, 129, 143, 154, 144, 135, 120, 114, 115, 126, 136, 151, 147, 133, 125, 108, 103, 110, 122, 131, 145, 137, 128, 119, 105, 106, 116, 131, 145, 156, 139, 129, 103, 90, 98, 114, 130, 148, 144, 124, 118, 99, 103, 116, 129, 132, 145, 130, 125, 121, 112, 118, 125, 128, 136, 141, 124, 125, 113, 109, 121, 128, 133, 148, 143, 129, 133, 118, 120, 127, 132, 140, 157, 144, 141, 135, 118, 123, 127, 131, 142, 147, 125, 133, 120, 116, 129, 137, 137, 152, 137, 123, 129, 113, 119, 130, 134, 134, 142, 118, 119, 116, 107, 116, 127, 127, 136, 139, 121, 131, 117, 113, 122, 131, 127, 144, 129, 118, 122, 105, 110, 128, 133, 137, 151, 122, 127, 119, 110, 125, 140, 133, 148, 137, 116, 124, 109, 114, 130, 138, 136, 151, 128, 123, 120, 111, 120, 138, 141, 147, 151, 122, 121, 109, 108, 121, 143, 141, 156, 139, 118, 117, 105, 112, 134, 145, 146, 154, 122, 117, 109, 103, 117, 139, 141, 153, 144, 122, 119, 105, 105, 124, 138, 143, 152, 130, 118, 107, 95, 106, 132, 143, 155, 154, 130, 119, 105, 101, 120, 140, 143, 151, 134, 115, 108, 99, 106, 132, 142, 149, 154, 132, 122, 116, 108, 121, 138, 138, 150, 141, 118, 115, 105, 105, 128, 139, 145, 155, 134, 122, 120, 109, 121, 140, 140, 147, 140, 116, 116, 111, 107, 129, 139, 139, 146, 128, 116, 121, 112, 117, 137, 137, 139, 138, 117, 117, 119, 110, 127, 139, 135, 139, 127, 112, 118, 113, 118, 139, 145, 143, 142, 124, 116, 117, 114, 127, 142, 143, 139, 130, 114, 114, 116, 122, 137, 148, 144, 138, 128, 116, 117, 119, 124, 137, 143, 133, 130, 117, 108, 113, 117, 128, 146, 143, 135, 128, 112, 112, 118, 121, 139, 142, 130, 123, 111, 105, 115, 117, 129, 142, 136, 129, 122, 112, 117, 122, 125, 136, 135, 127, 121, 111, 110, 120, 124, 136, 138, 131, 122, 117, 110, 120, 128, 139, 145, 137, 125, 117, 114, 117, 129, 135, 144, 136, 127, 114, 113, 116, 130, 141, 149, 144, 135, 123, 113, 116, 123, 137, 149, 144, 133, 122, 110, 112, 121, 130, 152, 153, 141, 130, 113, 110, 119, 126, 141, 154, 136, 131, 112, 105, 114, 127, 135, 157, 145, 131, 121, 102, 107, 119, 129, 146, 153, 130, 125, 107, 104, 115, 128, 139, 156, 141, 124, 112, 100, 108, 123, 135, 151};&lt;br /&gt;
const uint16_t sizeMusique=sizeof musique;&lt;br /&gt;
// pour lire le tableau, avec i variant de 0 à sizeMusique&lt;br /&gt;
// OCR4A=pgm_read_byte(musique+i)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20748</id>
		<title>Cours:ArduinoBoutonsNano</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20748"/>
				<updated>2026-01-25T08:41:53Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* {{Bleu|En observant le changement de valeur du bouton}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Cours:TPs_1103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:ArduinoBoutonsCorrection|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:shieldNanoinfo|{{Rouge|'''Carte d'extension arduino pour les Tps d'info'''}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce Tp va permettre d'introduire quelques éléments indispensables à la programmation d'une carte arduino, et surtout d'apprendre à se servir d'une documentation, [https://docs.arduino.cc/language-reference/ en l'occurrence celle disponible sur le site arduino].&lt;br /&gt;
&lt;br /&gt;
Il convient de bien comprendre qu'une carte arduino (et plus exactement toute carte utilisant un [http://fr.wikipedia.org/wiki/Microcontrôleur microcontrôleur]) peut servir à faire de multiples tâches. On utilise nécessairement des extensions ([http://arduino.cc/en/Main/ArduinoShields shields]) et nous devrons spécifier dans le programme la façon de &amp;quot;communiquer&amp;quot;/gérer cette carte. Physiquement, cette communication s'opère à travers de connexions dont le nombre dépend de la carte utilisée. Nous utiliserons [https://store.arduino.cc/collections/boards/products/arduino-nano une carte arduino NANO]  qui possède 2 connecteurs pour l'échange de données, numérotés de 0 à 13 et de A0 à A5, soit un total de 20 connexions.&lt;br /&gt;
&lt;br /&gt;
Si nous nous considérons à la place de la carte arduino, chaque connexion peut être :&lt;br /&gt;
*'''une entrée/INPUT''' (mesure, observation). Par ex,&lt;br /&gt;
**capteur de température&lt;br /&gt;
**interrupteur&lt;br /&gt;
**mesure de tension&lt;br /&gt;
**microphone&lt;br /&gt;
*'''une sortie/OUTPUT''' (action). Par ex,&lt;br /&gt;
**résistance chauffante&lt;br /&gt;
**lampe, voyant lumineux&lt;br /&gt;
**haut parleur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Notions fondamentales=&lt;br /&gt;
&lt;br /&gt;
==Gestion des sorties==&lt;br /&gt;
&lt;br /&gt;
On souhaite allumer et éteindre une led sur la carte.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons les 2 leds (sérigraphie L1 et L2 sur la carte) qui sont reliées sur la carte arduino :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Led !! numéro arduino&lt;br /&gt;
|-&lt;br /&gt;
| L1 || D5&lt;br /&gt;
|-&lt;br /&gt;
| L2 || D13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Principe===&lt;br /&gt;
Nous pouvons maintenant écrire le programme qui comporte '''nécessairement''' une partie configuration ( '''setup'''() ) et une boucle ( '''loop'''() ) :&lt;br /&gt;
*le setup() exécuté une seule fois&lt;br /&gt;
*le loop() exécuté en boucle ('''loop''' veut dire boucle en anglais)&lt;br /&gt;
&lt;br /&gt;
On commence par la partie configuration qui nous permet de définir les entrées et sorties :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut ensuite décrire le comportement souhaité :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Saisir le programme, l'exécuter et constater que ....}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|ça ne clignote pas !}}&lt;br /&gt;
&lt;br /&gt;
En effet, les instructions étant exécutées très rapidement, il est impossible d'observer le clignotement. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Todo|Ajoutons donc une temporisation ce qui nous donne le programme suivant :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous trouverez des détails sur la fonction [https://www.arduino.cc/reference/en/language/functions/time/delay/ delay() sur cette page].&lt;br /&gt;
&lt;br /&gt;
{{Todo|Utilisons maintenant une variable pour la position de la led afin de rendre notre code plus facilement lisible et modifiable :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int ledPin = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(ledPin,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(ledPin,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(ledPin,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avec cette structure, vous pouvez maintenant facilement changer de led.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Ex avec les leds}}===&lt;br /&gt;
&lt;br /&gt;
Écrire les programmes répondant aux cahiers des charges suivants :&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer une led pendant 1s et l'éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer 2 leds pendant 100ms et les éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer en alternance la led L1 puis la led L2, chacune étant allumée 1s}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer la led L1 puis les 2 leds puis seulement la led L2 puis tout éteint, en changeant toutes les 500ms}}&lt;br /&gt;
&lt;br /&gt;
===Clignotement===&lt;br /&gt;
&lt;br /&gt;
Nous allons essayer de faire clignoter les leds à des rythmes différents.&lt;br /&gt;
&lt;br /&gt;
Commençons par utiliser une variable pour changer l'état de la led :&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool etatLed1 = false; //variable booléenne pour mémoriser l'état de la led&lt;br /&gt;
const unsigned int pinLed1 = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(pinLed1,OUTPUT);        // déclarer la broche en sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  etatLed1 = ! etatLed1;          // inverser l'état de la variable booléenne&lt;br /&gt;
  digitalWrite(pinLed1,etatLed1); // modifier l'état de la sortie&lt;br /&gt;
  _delay_ms(200);                 // attendre 200ms avant de recommencer -&amp;gt; rythme de clignotement&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Vérifier le bon fonctionnement et comprendre ce programme}}&lt;br /&gt;
&lt;br /&gt;
On souhaite réduire la valeur du delay tout en conservant la même vitesse de clignotement :&lt;br /&gt;
*réduire le delay à 20ms&lt;br /&gt;
*déclarer une variable cptLed1 de type int&lt;br /&gt;
*incrémenter ce compteur à chaque itération&lt;br /&gt;
*si le compteur vaut 10 :&lt;br /&gt;
**remettre le compteur à 0&lt;br /&gt;
**changer l'état de la variable etatLed1&lt;br /&gt;
**modifier l'état de la sortie&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications demandées}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons préparé la structure du programme, il est assez simple d'ajouter une 2ème led qui clignotera à un rythme différent :&lt;br /&gt;
*ajouter les variables nécessaires pour cette 2ème led :&lt;br /&gt;
**etatLed2&lt;br /&gt;
**pinLed2&lt;br /&gt;
**cptLed2&lt;br /&gt;
*ajouter la 2ème led en sortie&lt;br /&gt;
*modifier le loop pour que la 2ème led change d'état toutes les 140ms&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications pour avoir les 2 leds qui clignotent à des rythmes différents}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gestion d'une entrée}}==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitons maintenant observer l'état d'un bouton sur la carte. Il s'agit donc d'une entrée : la carte arduino observe l'état du bouton, ce n'est pas elle qui modifie son état !&lt;br /&gt;
&lt;br /&gt;
De façon analogue à la partie précédente, trouvons sur [[Cours:Shieldinfo|la page de documentation le tableau suivant :]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bouton !! Arduino Pin !! Port !! Interruption !!  Niveau logique de l'entrée arduino si bouton appuyé&lt;br /&gt;
|-&lt;br /&gt;
| haut ||  3 || PD3 || int1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| bas || 2 || PD2 || int0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous choisissons le bouton référencé '''A''' et retenons donc le numéro de patte arduino associé : {{Rouge|2}}&lt;br /&gt;
&lt;br /&gt;
On utilisera astucieusement 2 variables comme :&lt;br /&gt;
*'''bpPin''' : qui représentera la position physique du bouton&lt;br /&gt;
*'''etatBp''' : qui représentera la valeur du bouton&lt;br /&gt;
&lt;br /&gt;
Il suffit de configurer la patte du bouton en '''entrée''' ( pinMode() ) et de lire l'état de cette patte ( digitalRead() ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int bpPin = 5;&lt;br /&gt;
unsigned int etatBp;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(bpPin,INPUT); // le bouton est connecté sur la patte représentée par la variable bpPin&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatBp = digitalRead(bpPin); // lecture de l'état de l'entrée&lt;br /&gt;
   .....                        // la variable etatBp sera utilisée dans la suite de l'algorithme pour tenir compte de l'état du bouton&lt;br /&gt;
   .....                        // ex : if ( etatBp == 0) {....;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 1: Entrée, sortie ???=&lt;br /&gt;
==1 bp, 1 led==&lt;br /&gt;
&lt;br /&gt;
Commençons tout simplement par commander une sortie tout ou rien (2 états possibles) à l'aide d'un bouton poussoir.&lt;br /&gt;
&lt;br /&gt;
On prendra la led L1, et le bouton du haut.&lt;br /&gt;
&lt;br /&gt;
On se servira des fonctions suivantes :&lt;br /&gt;
*[http://arduino.cc/en/Reference/PinMode '''pinMode()'''] permettant de configurer les entrées et sorties(e/s).&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalWrite '''digitalWrite()'''] permettant de modifier l'état d'une sortie.&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalRead '''digitalRead()'''] permettant de lire l'état d'une entrée.&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter le programme suivant pour que la led ne s'allume que si le bouton est appuyé.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
unsigned int ledPin= ... ;   // qques variables pour la position&lt;br /&gt;
unsigned int bpPin = ... ;   // des e/s&lt;br /&gt;
unsigned int etatBp;         // et récupérer l'état du bouton&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     pinMode(...,INPUT);      // configuration des e/s&lt;br /&gt;
     pinMode(...,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
     etatBp = ..........;     // &amp;quot;Lecture&amp;quot; de l'état de l'entrée&lt;br /&gt;
     ...................;     // &amp;quot;Écriture&amp;quot; de l'état de la sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
On ajoute le deuxième bouton.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led uniquement si les 2 boutons sont appuyés}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led si au moins l'un des 2 boutons est appuyé}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led s'il n'y a qu'un bouton appuyé}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 2: Détection de changement d'état=&lt;br /&gt;
&lt;br /&gt;
Modifions légèrement le comportement. Nous souhaitons désormais que l'état de la led change à chaque appui sur le bouton du bas. On détecte non plus un état du bouton, mais un changement d'état de celui-ci.&lt;br /&gt;
&lt;br /&gt;
==Par interruption==&lt;br /&gt;
&lt;br /&gt;
Sans entrer dans le détail pour le moment et sans être exhaustif, nous utiliserons les interruptions de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
===Mise en place===&lt;br /&gt;
&lt;br /&gt;
Dans la fonction {{Rouge|setup()}}, nous utiliserons la fonction [http://arduino.cc/en/Reference/AttachInterrupt {{Rouge|attachInterrupt()}}] qui permettra d'exécuter une fonction particulière lors d'un événement parmi :&lt;br /&gt;
*{{Rouge|CHANGE}}  : la fonction d'interruption est exécutée sur une changement d'état de l'entrée&lt;br /&gt;
*{{Rouge|RISING}}  : la fonction d'interruption est exécutée sur un passage de l'état 0 à 1 de l'entrée&lt;br /&gt;
*{{Rouge|FALLING}} : la fonction d'interruption est exécutée sur un passage de l'état 1 à 0 de l'entrée&lt;br /&gt;
&lt;br /&gt;
On précise également le numéro de l'interruption qui nous intéresse comme indiqué dans le tableau un peut plus haut sur cette page.&lt;br /&gt;
&lt;br /&gt;
'''Exemple :'''&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
   pinMode(5,OUTPUT);               // On précise que la pin (patte) 13 est une sortie dans la suite de l'exemple.&lt;br /&gt;
   attachInterrupt(0,reagir,RISING); // La fonction reagir() sera exécutée lorsque le bouton A (int0) sera relâché.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Utilisation}}===&lt;br /&gt;
&lt;br /&gt;
Il convient bien entendu de déclarer la fonction d'interruption ({{Rouge|reagir}} ici) qui permettra par exemple de placer un drapeau (flag) dans un état particulier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile int appui;&lt;br /&gt;
int etatLed = 0;&lt;br /&gt;
&lt;br /&gt;
void reagir()&lt;br /&gt;
{&lt;br /&gt;
   appui = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   if ( appui == 1)&lt;br /&gt;
   {&lt;br /&gt;
      etatLed = !etatLed ;&lt;br /&gt;
      digitalWrite(5,etatLed);&lt;br /&gt;
      appui = 0 ;&lt;br /&gt;
   }&lt;br /&gt;
   delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
{{Todo|Recopier le programme, vérifier son fonctionnement et profitez en pour tester les différents mode de déclenchement de l'interruption.}}&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide de la méthode précédente, ajouter le deuxième bouton pour que :}}&lt;br /&gt;
* la led s'allume lors de l'appui sur le bouton haut.&lt;br /&gt;
* la led s'éteigne lors du relâchement du bouton bas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|En observant le changement de valeur du bouton}}==&lt;br /&gt;
[[Image:Fronts.PNG|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il convient de remarquer que juste avant l'appui, la valeur lue sur l'entrée correspondant au bouton est à l'état 1, et que dès l'appui la valeur passe à l'état 0.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez 2 variables de type [http://arduino.cc/en/Reference/int int] (par exemple etatPresent et etatPasse), qui permettront de détecter cette transition.&lt;br /&gt;
&lt;br /&gt;
On utilisera également une variable etatSortie de type [http://arduino.cc/en/Reference/UnsignedInt unsigned int] pour mémoriser l'état de la sortie.&lt;br /&gt;
&lt;br /&gt;
Le programme ressemblera donc à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int etatPresent=0,etatPasse=0;&lt;br /&gt;
unsigned int etatSortie=0;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     .....            // configuration des e/s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatPasse=etatPresent;                                // mémorise l'état précédent (le présent devient le passé)&lt;br /&gt;
   etatPresent=digitalRead(??);                          // lecture de la valeur actuelle&lt;br /&gt;
   if ( ( etatPresent == ?? ) &amp;amp;&amp;amp; ( etatPasse == ?? ) )   // si appui alors ....&lt;br /&gt;
   {&lt;br /&gt;
         .....&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire le programme répondant au cahier des charges. Un programme pour le front montant et un autre pour le front descendant.}}&lt;br /&gt;
&lt;br /&gt;
=Ex 4: Game over !=&lt;br /&gt;
&lt;br /&gt;
Certains systèmes pour lesquels la sécurité est primordiale comportent un interrupteur de type &amp;quot;homme mort&amp;quot; permettant de vérifier la présence et l'état de conscience de l'opérateur.&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser l'un des boutons poussoirs de notre carte pour réaliser cette fonction.&lt;br /&gt;
&lt;br /&gt;
Le principe est le suivant : toute les 3s on allume une led. L'opérateur doit alors appuyer sur un bouton poussoir (que vous choisirez) dans les 3s suivantes. Dès l'appui, la 1ère led doit s'éteindre et la 2ème led s'allume.&lt;br /&gt;
&lt;br /&gt;
Si l'opérateur n'a pas appuyé dans le délais imparti, toutes les leds s'éteignent.&lt;br /&gt;
&lt;br /&gt;
On pourra utiliser la fonction [http://arduino.cc/en/Reference/Millis millis()], [http://arduino.cc/en/Tutorial/BlinkWithoutDelay un exemple d'utilisation étant donné sur ce lien]. Vous pouvez ajouter dans votre programme une ligne delay(1), qui permettra de rythmer le programme.&lt;br /&gt;
&lt;br /&gt;
{{Question|A vous de jouer !}}&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20747</id>
		<title>Cours:ArduinoBoutonsNano</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20747"/>
				<updated>2026-01-25T08:39:25Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* {{Bleu|En observant le changement de valeur du bouton}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Cours:TPs_1103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:ArduinoBoutonsCorrection|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:shieldNanoinfo|{{Rouge|'''Carte d'extension arduino pour les Tps d'info'''}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce Tp va permettre d'introduire quelques éléments indispensables à la programmation d'une carte arduino, et surtout d'apprendre à se servir d'une documentation, [https://docs.arduino.cc/language-reference/ en l'occurrence celle disponible sur le site arduino].&lt;br /&gt;
&lt;br /&gt;
Il convient de bien comprendre qu'une carte arduino (et plus exactement toute carte utilisant un [http://fr.wikipedia.org/wiki/Microcontrôleur microcontrôleur]) peut servir à faire de multiples tâches. On utilise nécessairement des extensions ([http://arduino.cc/en/Main/ArduinoShields shields]) et nous devrons spécifier dans le programme la façon de &amp;quot;communiquer&amp;quot;/gérer cette carte. Physiquement, cette communication s'opère à travers de connexions dont le nombre dépend de la carte utilisée. Nous utiliserons [https://store.arduino.cc/collections/boards/products/arduino-nano une carte arduino NANO]  qui possède 2 connecteurs pour l'échange de données, numérotés de 0 à 13 et de A0 à A5, soit un total de 20 connexions.&lt;br /&gt;
&lt;br /&gt;
Si nous nous considérons à la place de la carte arduino, chaque connexion peut être :&lt;br /&gt;
*'''une entrée/INPUT''' (mesure, observation). Par ex,&lt;br /&gt;
**capteur de température&lt;br /&gt;
**interrupteur&lt;br /&gt;
**mesure de tension&lt;br /&gt;
**microphone&lt;br /&gt;
*'''une sortie/OUTPUT''' (action). Par ex,&lt;br /&gt;
**résistance chauffante&lt;br /&gt;
**lampe, voyant lumineux&lt;br /&gt;
**haut parleur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Notions fondamentales=&lt;br /&gt;
&lt;br /&gt;
==Gestion des sorties==&lt;br /&gt;
&lt;br /&gt;
On souhaite allumer et éteindre une led sur la carte.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons les 2 leds (sérigraphie L1 et L2 sur la carte) qui sont reliées sur la carte arduino :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Led !! numéro arduino&lt;br /&gt;
|-&lt;br /&gt;
| L1 || D5&lt;br /&gt;
|-&lt;br /&gt;
| L2 || D13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Principe===&lt;br /&gt;
Nous pouvons maintenant écrire le programme qui comporte '''nécessairement''' une partie configuration ( '''setup'''() ) et une boucle ( '''loop'''() ) :&lt;br /&gt;
*le setup() exécuté une seule fois&lt;br /&gt;
*le loop() exécuté en boucle ('''loop''' veut dire boucle en anglais)&lt;br /&gt;
&lt;br /&gt;
On commence par la partie configuration qui nous permet de définir les entrées et sorties :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut ensuite décrire le comportement souhaité :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Saisir le programme, l'exécuter et constater que ....}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|ça ne clignote pas !}}&lt;br /&gt;
&lt;br /&gt;
En effet, les instructions étant exécutées très rapidement, il est impossible d'observer le clignotement. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Todo|Ajoutons donc une temporisation ce qui nous donne le programme suivant :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous trouverez des détails sur la fonction [https://www.arduino.cc/reference/en/language/functions/time/delay/ delay() sur cette page].&lt;br /&gt;
&lt;br /&gt;
{{Todo|Utilisons maintenant une variable pour la position de la led afin de rendre notre code plus facilement lisible et modifiable :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int ledPin = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(ledPin,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(ledPin,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(ledPin,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avec cette structure, vous pouvez maintenant facilement changer de led.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Ex avec les leds}}===&lt;br /&gt;
&lt;br /&gt;
Écrire les programmes répondant aux cahiers des charges suivants :&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer une led pendant 1s et l'éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer 2 leds pendant 100ms et les éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer en alternance la led L1 puis la led L2, chacune étant allumée 1s}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer la led L1 puis les 2 leds puis seulement la led L2 puis tout éteint, en changeant toutes les 500ms}}&lt;br /&gt;
&lt;br /&gt;
===Clignotement===&lt;br /&gt;
&lt;br /&gt;
Nous allons essayer de faire clignoter les leds à des rythmes différents.&lt;br /&gt;
&lt;br /&gt;
Commençons par utiliser une variable pour changer l'état de la led :&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool etatLed1 = false; //variable booléenne pour mémoriser l'état de la led&lt;br /&gt;
const unsigned int pinLed1 = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(pinLed1,OUTPUT);        // déclarer la broche en sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  etatLed1 = ! etatLed1;          // inverser l'état de la variable booléenne&lt;br /&gt;
  digitalWrite(pinLed1,etatLed1); // modifier l'état de la sortie&lt;br /&gt;
  _delay_ms(200);                 // attendre 200ms avant de recommencer -&amp;gt; rythme de clignotement&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Vérifier le bon fonctionnement et comprendre ce programme}}&lt;br /&gt;
&lt;br /&gt;
On souhaite réduire la valeur du delay tout en conservant la même vitesse de clignotement :&lt;br /&gt;
*réduire le delay à 20ms&lt;br /&gt;
*déclarer une variable cptLed1 de type int&lt;br /&gt;
*incrémenter ce compteur à chaque itération&lt;br /&gt;
*si le compteur vaut 10 :&lt;br /&gt;
**remettre le compteur à 0&lt;br /&gt;
**changer l'état de la variable etatLed1&lt;br /&gt;
**modifier l'état de la sortie&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications demandées}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons préparé la structure du programme, il est assez simple d'ajouter une 2ème led qui clignotera à un rythme différent :&lt;br /&gt;
*ajouter les variables nécessaires pour cette 2ème led :&lt;br /&gt;
**etatLed2&lt;br /&gt;
**pinLed2&lt;br /&gt;
**cptLed2&lt;br /&gt;
*ajouter la 2ème led en sortie&lt;br /&gt;
*modifier le loop pour que la 2ème led change d'état toutes les 140ms&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications pour avoir les 2 leds qui clignotent à des rythmes différents}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gestion d'une entrée}}==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitons maintenant observer l'état d'un bouton sur la carte. Il s'agit donc d'une entrée : la carte arduino observe l'état du bouton, ce n'est pas elle qui modifie son état !&lt;br /&gt;
&lt;br /&gt;
De façon analogue à la partie précédente, trouvons sur [[Cours:Shieldinfo|la page de documentation le tableau suivant :]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bouton !! Arduino Pin !! Port !! Interruption !!  Niveau logique de l'entrée arduino si bouton appuyé&lt;br /&gt;
|-&lt;br /&gt;
| haut ||  3 || PD3 || int1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| bas || 2 || PD2 || int0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous choisissons le bouton référencé '''A''' et retenons donc le numéro de patte arduino associé : {{Rouge|2}}&lt;br /&gt;
&lt;br /&gt;
On utilisera astucieusement 2 variables comme :&lt;br /&gt;
*'''bpPin''' : qui représentera la position physique du bouton&lt;br /&gt;
*'''etatBp''' : qui représentera la valeur du bouton&lt;br /&gt;
&lt;br /&gt;
Il suffit de configurer la patte du bouton en '''entrée''' ( pinMode() ) et de lire l'état de cette patte ( digitalRead() ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int bpPin = 5;&lt;br /&gt;
unsigned int etatBp;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(bpPin,INPUT); // le bouton est connecté sur la patte représentée par la variable bpPin&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatBp = digitalRead(bpPin); // lecture de l'état de l'entrée&lt;br /&gt;
   .....                        // la variable etatBp sera utilisée dans la suite de l'algorithme pour tenir compte de l'état du bouton&lt;br /&gt;
   .....                        // ex : if ( etatBp == 0) {....;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 1: Entrée, sortie ???=&lt;br /&gt;
==1 bp, 1 led==&lt;br /&gt;
&lt;br /&gt;
Commençons tout simplement par commander une sortie tout ou rien (2 états possibles) à l'aide d'un bouton poussoir.&lt;br /&gt;
&lt;br /&gt;
On prendra la led L1, et le bouton du haut.&lt;br /&gt;
&lt;br /&gt;
On se servira des fonctions suivantes :&lt;br /&gt;
*[http://arduino.cc/en/Reference/PinMode '''pinMode()'''] permettant de configurer les entrées et sorties(e/s).&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalWrite '''digitalWrite()'''] permettant de modifier l'état d'une sortie.&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalRead '''digitalRead()'''] permettant de lire l'état d'une entrée.&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter le programme suivant pour que la led ne s'allume que si le bouton est appuyé.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
unsigned int ledPin= ... ;   // qques variables pour la position&lt;br /&gt;
unsigned int bpPin = ... ;   // des e/s&lt;br /&gt;
unsigned int etatBp;         // et récupérer l'état du bouton&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     pinMode(...,INPUT);      // configuration des e/s&lt;br /&gt;
     pinMode(...,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
     etatBp = ..........;     // &amp;quot;Lecture&amp;quot; de l'état de l'entrée&lt;br /&gt;
     ...................;     // &amp;quot;Écriture&amp;quot; de l'état de la sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
On ajoute le deuxième bouton.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led uniquement si les 2 boutons sont appuyés}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led si au moins l'un des 2 boutons est appuyé}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led s'il n'y a qu'un bouton appuyé}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 2: Détection de changement d'état=&lt;br /&gt;
&lt;br /&gt;
Modifions légèrement le comportement. Nous souhaitons désormais que l'état de la led change à chaque appui sur le bouton du bas. On détecte non plus un état du bouton, mais un changement d'état de celui-ci.&lt;br /&gt;
&lt;br /&gt;
==Par interruption==&lt;br /&gt;
&lt;br /&gt;
Sans entrer dans le détail pour le moment et sans être exhaustif, nous utiliserons les interruptions de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
===Mise en place===&lt;br /&gt;
&lt;br /&gt;
Dans la fonction {{Rouge|setup()}}, nous utiliserons la fonction [http://arduino.cc/en/Reference/AttachInterrupt {{Rouge|attachInterrupt()}}] qui permettra d'exécuter une fonction particulière lors d'un événement parmi :&lt;br /&gt;
*{{Rouge|CHANGE}}  : la fonction d'interruption est exécutée sur une changement d'état de l'entrée&lt;br /&gt;
*{{Rouge|RISING}}  : la fonction d'interruption est exécutée sur un passage de l'état 0 à 1 de l'entrée&lt;br /&gt;
*{{Rouge|FALLING}} : la fonction d'interruption est exécutée sur un passage de l'état 1 à 0 de l'entrée&lt;br /&gt;
&lt;br /&gt;
On précise également le numéro de l'interruption qui nous intéresse comme indiqué dans le tableau un peut plus haut sur cette page.&lt;br /&gt;
&lt;br /&gt;
'''Exemple :'''&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
   pinMode(5,OUTPUT);               // On précise que la pin (patte) 13 est une sortie dans la suite de l'exemple.&lt;br /&gt;
   attachInterrupt(0,reagir,RISING); // La fonction reagir() sera exécutée lorsque le bouton A (int0) sera relâché.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Utilisation}}===&lt;br /&gt;
&lt;br /&gt;
Il convient bien entendu de déclarer la fonction d'interruption ({{Rouge|reagir}} ici) qui permettra par exemple de placer un drapeau (flag) dans un état particulier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile int appui;&lt;br /&gt;
int etatLed = 0;&lt;br /&gt;
&lt;br /&gt;
void reagir()&lt;br /&gt;
{&lt;br /&gt;
   appui = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   if ( appui == 1)&lt;br /&gt;
   {&lt;br /&gt;
      etatLed = !etatLed ;&lt;br /&gt;
      digitalWrite(5,etatLed);&lt;br /&gt;
      appui = 0 ;&lt;br /&gt;
   }&lt;br /&gt;
   delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
{{Todo|Recopier le programme, vérifier son fonctionnement et profitez en pour tester les différents mode de déclenchement de l'interruption.}}&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide de la méthode précédente, ajouter le deuxième bouton pour que :}}&lt;br /&gt;
* la led s'allume lors de l'appui sur le bouton haut.&lt;br /&gt;
* la led s'éteigne lors du relâchement du bouton bas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|En observant le changement de valeur du bouton}}==&lt;br /&gt;
[[Image:Fronts.PNG|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il convient de remarquer que juste avant l'appui, la valeur lue sur l'entrée correspondant au bouton est à l'état 1, et que dès l'appui la valeur passe à l'état 0.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez 2 variables de type [http://arduino.cc/en/Reference/int int] (par exemple etatPresent et etatPasse), qui permettront de détecter cette transition.&lt;br /&gt;
&lt;br /&gt;
On utilisera également une variable etatSortie de type [http://arduino.cc/en/Reference/UnsignedInt unsigned int] pour mémoriser l'état de la sortie.&lt;br /&gt;
&lt;br /&gt;
Le programme ressemblera donc à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int etatPresent=0,etatPasse=0;&lt;br /&gt;
unsigned int etatSortie=0;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     .....            // configuration des e/s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatPasse=etatPresent;                                // mémorise l'état précédent (le présent devient le passé)&lt;br /&gt;
   etatPresent=digitalRead(??);                          // lecture de la valeur actuelle&lt;br /&gt;
   if ( ( etatPresent == ?? ) &amp;amp;&amp;amp; ( etatPasse == ?? ) )   // si appui alors ....&lt;br /&gt;
   {&lt;br /&gt;
         .....&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire le programme répondant au cahier des charges.}}&lt;br /&gt;
&lt;br /&gt;
=Ex 4: Game over !=&lt;br /&gt;
&lt;br /&gt;
Certains systèmes pour lesquels la sécurité est primordiale comportent un interrupteur de type &amp;quot;homme mort&amp;quot; permettant de vérifier la présence et l'état de conscience de l'opérateur.&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser l'un des boutons poussoirs de notre carte pour réaliser cette fonction.&lt;br /&gt;
&lt;br /&gt;
Le principe est le suivant : toute les 3s on allume une led. L'opérateur doit alors appuyer sur un bouton poussoir (que vous choisirez) dans les 3s suivantes. Dès l'appui, la 1ère led doit s'éteindre et la 2ème led s'allume.&lt;br /&gt;
&lt;br /&gt;
Si l'opérateur n'a pas appuyé dans le délais imparti, toutes les leds s'éteignent.&lt;br /&gt;
&lt;br /&gt;
On pourra utiliser la fonction [http://arduino.cc/en/Reference/Millis millis()], [http://arduino.cc/en/Tutorial/BlinkWithoutDelay un exemple d'utilisation étant donné sur ce lien]. Vous pouvez ajouter dans votre programme une ligne delay(1), qui permettra de rythmer le programme.&lt;br /&gt;
&lt;br /&gt;
{{Question|A vous de jouer !}}&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20746</id>
		<title>Cours:ArduinoBoutonsNano</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20746"/>
				<updated>2026-01-25T08:38:37Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* {{Bleu|En observant le changement de valeur du bouton}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Cours:TPs_1103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:ArduinoBoutonsCorrection|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:shieldNanoinfo|{{Rouge|'''Carte d'extension arduino pour les Tps d'info'''}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce Tp va permettre d'introduire quelques éléments indispensables à la programmation d'une carte arduino, et surtout d'apprendre à se servir d'une documentation, [https://docs.arduino.cc/language-reference/ en l'occurrence celle disponible sur le site arduino].&lt;br /&gt;
&lt;br /&gt;
Il convient de bien comprendre qu'une carte arduino (et plus exactement toute carte utilisant un [http://fr.wikipedia.org/wiki/Microcontrôleur microcontrôleur]) peut servir à faire de multiples tâches. On utilise nécessairement des extensions ([http://arduino.cc/en/Main/ArduinoShields shields]) et nous devrons spécifier dans le programme la façon de &amp;quot;communiquer&amp;quot;/gérer cette carte. Physiquement, cette communication s'opère à travers de connexions dont le nombre dépend de la carte utilisée. Nous utiliserons [https://store.arduino.cc/collections/boards/products/arduino-nano une carte arduino NANO]  qui possède 2 connecteurs pour l'échange de données, numérotés de 0 à 13 et de A0 à A5, soit un total de 20 connexions.&lt;br /&gt;
&lt;br /&gt;
Si nous nous considérons à la place de la carte arduino, chaque connexion peut être :&lt;br /&gt;
*'''une entrée/INPUT''' (mesure, observation). Par ex,&lt;br /&gt;
**capteur de température&lt;br /&gt;
**interrupteur&lt;br /&gt;
**mesure de tension&lt;br /&gt;
**microphone&lt;br /&gt;
*'''une sortie/OUTPUT''' (action). Par ex,&lt;br /&gt;
**résistance chauffante&lt;br /&gt;
**lampe, voyant lumineux&lt;br /&gt;
**haut parleur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Notions fondamentales=&lt;br /&gt;
&lt;br /&gt;
==Gestion des sorties==&lt;br /&gt;
&lt;br /&gt;
On souhaite allumer et éteindre une led sur la carte.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons les 2 leds (sérigraphie L1 et L2 sur la carte) qui sont reliées sur la carte arduino :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Led !! numéro arduino&lt;br /&gt;
|-&lt;br /&gt;
| L1 || D5&lt;br /&gt;
|-&lt;br /&gt;
| L2 || D13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Principe===&lt;br /&gt;
Nous pouvons maintenant écrire le programme qui comporte '''nécessairement''' une partie configuration ( '''setup'''() ) et une boucle ( '''loop'''() ) :&lt;br /&gt;
*le setup() exécuté une seule fois&lt;br /&gt;
*le loop() exécuté en boucle ('''loop''' veut dire boucle en anglais)&lt;br /&gt;
&lt;br /&gt;
On commence par la partie configuration qui nous permet de définir les entrées et sorties :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut ensuite décrire le comportement souhaité :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Saisir le programme, l'exécuter et constater que ....}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|ça ne clignote pas !}}&lt;br /&gt;
&lt;br /&gt;
En effet, les instructions étant exécutées très rapidement, il est impossible d'observer le clignotement. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Todo|Ajoutons donc une temporisation ce qui nous donne le programme suivant :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous trouverez des détails sur la fonction [https://www.arduino.cc/reference/en/language/functions/time/delay/ delay() sur cette page].&lt;br /&gt;
&lt;br /&gt;
{{Todo|Utilisons maintenant une variable pour la position de la led afin de rendre notre code plus facilement lisible et modifiable :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int ledPin = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(ledPin,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(ledPin,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(ledPin,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avec cette structure, vous pouvez maintenant facilement changer de led.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Ex avec les leds}}===&lt;br /&gt;
&lt;br /&gt;
Écrire les programmes répondant aux cahiers des charges suivants :&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer une led pendant 1s et l'éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer 2 leds pendant 100ms et les éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer en alternance la led L1 puis la led L2, chacune étant allumée 1s}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer la led L1 puis les 2 leds puis seulement la led L2 puis tout éteint, en changeant toutes les 500ms}}&lt;br /&gt;
&lt;br /&gt;
===Clignotement===&lt;br /&gt;
&lt;br /&gt;
Nous allons essayer de faire clignoter les leds à des rythmes différents.&lt;br /&gt;
&lt;br /&gt;
Commençons par utiliser une variable pour changer l'état de la led :&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool etatLed1 = false; //variable booléenne pour mémoriser l'état de la led&lt;br /&gt;
const unsigned int pinLed1 = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(pinLed1,OUTPUT);        // déclarer la broche en sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  etatLed1 = ! etatLed1;          // inverser l'état de la variable booléenne&lt;br /&gt;
  digitalWrite(pinLed1,etatLed1); // modifier l'état de la sortie&lt;br /&gt;
  _delay_ms(200);                 // attendre 200ms avant de recommencer -&amp;gt; rythme de clignotement&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Vérifier le bon fonctionnement et comprendre ce programme}}&lt;br /&gt;
&lt;br /&gt;
On souhaite réduire la valeur du delay tout en conservant la même vitesse de clignotement :&lt;br /&gt;
*réduire le delay à 20ms&lt;br /&gt;
*déclarer une variable cptLed1 de type int&lt;br /&gt;
*incrémenter ce compteur à chaque itération&lt;br /&gt;
*si le compteur vaut 10 :&lt;br /&gt;
**remettre le compteur à 0&lt;br /&gt;
**changer l'état de la variable etatLed1&lt;br /&gt;
**modifier l'état de la sortie&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications demandées}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons préparé la structure du programme, il est assez simple d'ajouter une 2ème led qui clignotera à un rythme différent :&lt;br /&gt;
*ajouter les variables nécessaires pour cette 2ème led :&lt;br /&gt;
**etatLed2&lt;br /&gt;
**pinLed2&lt;br /&gt;
**cptLed2&lt;br /&gt;
*ajouter la 2ème led en sortie&lt;br /&gt;
*modifier le loop pour que la 2ème led change d'état toutes les 140ms&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications pour avoir les 2 leds qui clignotent à des rythmes différents}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gestion d'une entrée}}==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitons maintenant observer l'état d'un bouton sur la carte. Il s'agit donc d'une entrée : la carte arduino observe l'état du bouton, ce n'est pas elle qui modifie son état !&lt;br /&gt;
&lt;br /&gt;
De façon analogue à la partie précédente, trouvons sur [[Cours:Shieldinfo|la page de documentation le tableau suivant :]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bouton !! Arduino Pin !! Port !! Interruption !!  Niveau logique de l'entrée arduino si bouton appuyé&lt;br /&gt;
|-&lt;br /&gt;
| haut ||  3 || PD3 || int1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| bas || 2 || PD2 || int0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous choisissons le bouton référencé '''A''' et retenons donc le numéro de patte arduino associé : {{Rouge|2}}&lt;br /&gt;
&lt;br /&gt;
On utilisera astucieusement 2 variables comme :&lt;br /&gt;
*'''bpPin''' : qui représentera la position physique du bouton&lt;br /&gt;
*'''etatBp''' : qui représentera la valeur du bouton&lt;br /&gt;
&lt;br /&gt;
Il suffit de configurer la patte du bouton en '''entrée''' ( pinMode() ) et de lire l'état de cette patte ( digitalRead() ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int bpPin = 5;&lt;br /&gt;
unsigned int etatBp;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(bpPin,INPUT); // le bouton est connecté sur la patte représentée par la variable bpPin&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatBp = digitalRead(bpPin); // lecture de l'état de l'entrée&lt;br /&gt;
   .....                        // la variable etatBp sera utilisée dans la suite de l'algorithme pour tenir compte de l'état du bouton&lt;br /&gt;
   .....                        // ex : if ( etatBp == 0) {....;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 1: Entrée, sortie ???=&lt;br /&gt;
==1 bp, 1 led==&lt;br /&gt;
&lt;br /&gt;
Commençons tout simplement par commander une sortie tout ou rien (2 états possibles) à l'aide d'un bouton poussoir.&lt;br /&gt;
&lt;br /&gt;
On prendra la led L1, et le bouton du haut.&lt;br /&gt;
&lt;br /&gt;
On se servira des fonctions suivantes :&lt;br /&gt;
*[http://arduino.cc/en/Reference/PinMode '''pinMode()'''] permettant de configurer les entrées et sorties(e/s).&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalWrite '''digitalWrite()'''] permettant de modifier l'état d'une sortie.&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalRead '''digitalRead()'''] permettant de lire l'état d'une entrée.&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter le programme suivant pour que la led ne s'allume que si le bouton est appuyé.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
unsigned int ledPin= ... ;   // qques variables pour la position&lt;br /&gt;
unsigned int bpPin = ... ;   // des e/s&lt;br /&gt;
unsigned int etatBp;         // et récupérer l'état du bouton&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     pinMode(...,INPUT);      // configuration des e/s&lt;br /&gt;
     pinMode(...,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
     etatBp = ..........;     // &amp;quot;Lecture&amp;quot; de l'état de l'entrée&lt;br /&gt;
     ...................;     // &amp;quot;Écriture&amp;quot; de l'état de la sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
On ajoute le deuxième bouton.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led uniquement si les 2 boutons sont appuyés}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led si au moins l'un des 2 boutons est appuyé}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led s'il n'y a qu'un bouton appuyé}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 2: Détection de changement d'état=&lt;br /&gt;
&lt;br /&gt;
Modifions légèrement le comportement. Nous souhaitons désormais que l'état de la led change à chaque appui sur le bouton du bas. On détecte non plus un état du bouton, mais un changement d'état de celui-ci.&lt;br /&gt;
&lt;br /&gt;
==Par interruption==&lt;br /&gt;
&lt;br /&gt;
Sans entrer dans le détail pour le moment et sans être exhaustif, nous utiliserons les interruptions de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
===Mise en place===&lt;br /&gt;
&lt;br /&gt;
Dans la fonction {{Rouge|setup()}}, nous utiliserons la fonction [http://arduino.cc/en/Reference/AttachInterrupt {{Rouge|attachInterrupt()}}] qui permettra d'exécuter une fonction particulière lors d'un événement parmi :&lt;br /&gt;
*{{Rouge|CHANGE}}  : la fonction d'interruption est exécutée sur une changement d'état de l'entrée&lt;br /&gt;
*{{Rouge|RISING}}  : la fonction d'interruption est exécutée sur un passage de l'état 0 à 1 de l'entrée&lt;br /&gt;
*{{Rouge|FALLING}} : la fonction d'interruption est exécutée sur un passage de l'état 1 à 0 de l'entrée&lt;br /&gt;
&lt;br /&gt;
On précise également le numéro de l'interruption qui nous intéresse comme indiqué dans le tableau un peut plus haut sur cette page.&lt;br /&gt;
&lt;br /&gt;
'''Exemple :'''&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
   pinMode(5,OUTPUT);               // On précise que la pin (patte) 13 est une sortie dans la suite de l'exemple.&lt;br /&gt;
   attachInterrupt(0,reagir,RISING); // La fonction reagir() sera exécutée lorsque le bouton A (int0) sera relâché.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Utilisation}}===&lt;br /&gt;
&lt;br /&gt;
Il convient bien entendu de déclarer la fonction d'interruption ({{Rouge|reagir}} ici) qui permettra par exemple de placer un drapeau (flag) dans un état particulier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile int appui;&lt;br /&gt;
int etatLed = 0;&lt;br /&gt;
&lt;br /&gt;
void reagir()&lt;br /&gt;
{&lt;br /&gt;
   appui = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   if ( appui == 1)&lt;br /&gt;
   {&lt;br /&gt;
      etatLed = !etatLed ;&lt;br /&gt;
      digitalWrite(5,etatLed);&lt;br /&gt;
      appui = 0 ;&lt;br /&gt;
   }&lt;br /&gt;
   delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
{{Todo|Recopier le programme, vérifier son fonctionnement et profitez en pour tester les différents mode de déclenchement de l'interruption.}}&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide de la méthode précédente, ajouter le deuxième bouton pour que :}}&lt;br /&gt;
* la led s'allume lors de l'appui sur le bouton haut.&lt;br /&gt;
* la led s'éteigne lors du relâchement du bouton bas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|En observant le changement de valeur du bouton}}==&lt;br /&gt;
[[Image:Fronts.png|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il convient de remarquer que juste avant l'appui, la valeur lue sur l'entrée correspondant au bouton est à l'état 1, et que dès l'appui la valeur passe à l'état 0.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez 2 variables de type [http://arduino.cc/en/Reference/int int] (par exemple etatPresent et etatPasse), qui permettront de détecter cette transition.&lt;br /&gt;
&lt;br /&gt;
On utilisera également une variable etatSortie de type [http://arduino.cc/en/Reference/UnsignedInt unsigned int] pour mémoriser l'état de la sortie.&lt;br /&gt;
&lt;br /&gt;
Le programme ressemblera donc à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int etatPresent=0,etatPasse=0;&lt;br /&gt;
unsigned int etatSortie=0;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     .....            // configuration des e/s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatPasse=etatPresent;                                // mémorise l'état précédent (le présent devient le passé)&lt;br /&gt;
   etatPresent=digitalRead(??);                          // lecture de la valeur actuelle&lt;br /&gt;
   if ( ( etatPresent == ?? ) &amp;amp;&amp;amp; ( etatPasse == ?? ) )   // si appui alors ....&lt;br /&gt;
   {&lt;br /&gt;
         .....&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire le programme répondant au cahier des charges.}}&lt;br /&gt;
&lt;br /&gt;
=Ex 4: Game over !=&lt;br /&gt;
&lt;br /&gt;
Certains systèmes pour lesquels la sécurité est primordiale comportent un interrupteur de type &amp;quot;homme mort&amp;quot; permettant de vérifier la présence et l'état de conscience de l'opérateur.&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser l'un des boutons poussoirs de notre carte pour réaliser cette fonction.&lt;br /&gt;
&lt;br /&gt;
Le principe est le suivant : toute les 3s on allume une led. L'opérateur doit alors appuyer sur un bouton poussoir (que vous choisirez) dans les 3s suivantes. Dès l'appui, la 1ère led doit s'éteindre et la 2ème led s'allume.&lt;br /&gt;
&lt;br /&gt;
Si l'opérateur n'a pas appuyé dans le délais imparti, toutes les leds s'éteignent.&lt;br /&gt;
&lt;br /&gt;
On pourra utiliser la fonction [http://arduino.cc/en/Reference/Millis millis()], [http://arduino.cc/en/Tutorial/BlinkWithoutDelay un exemple d'utilisation étant donné sur ce lien]. Vous pouvez ajouter dans votre programme une ligne delay(1), qui permettra de rythmer le programme.&lt;br /&gt;
&lt;br /&gt;
{{Question|A vous de jouer !}}&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:Fronts.PNG&amp;diff=20745</id>
		<title>Fichier:Fronts.PNG</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Fichier:Fronts.PNG&amp;diff=20745"/>
				<updated>2026-01-25T08:37:54Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20744</id>
		<title>Cours:ArduinoBoutonsNano</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20744"/>
				<updated>2026-01-25T08:37:08Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* {{Bleu|En observant le changement de valeur du bouton}} */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Cours:TPs_1103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:ArduinoBoutonsCorrection|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:shieldNanoinfo|{{Rouge|'''Carte d'extension arduino pour les Tps d'info'''}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce Tp va permettre d'introduire quelques éléments indispensables à la programmation d'une carte arduino, et surtout d'apprendre à se servir d'une documentation, [https://docs.arduino.cc/language-reference/ en l'occurrence celle disponible sur le site arduino].&lt;br /&gt;
&lt;br /&gt;
Il convient de bien comprendre qu'une carte arduino (et plus exactement toute carte utilisant un [http://fr.wikipedia.org/wiki/Microcontrôleur microcontrôleur]) peut servir à faire de multiples tâches. On utilise nécessairement des extensions ([http://arduino.cc/en/Main/ArduinoShields shields]) et nous devrons spécifier dans le programme la façon de &amp;quot;communiquer&amp;quot;/gérer cette carte. Physiquement, cette communication s'opère à travers de connexions dont le nombre dépend de la carte utilisée. Nous utiliserons [https://store.arduino.cc/collections/boards/products/arduino-nano une carte arduino NANO]  qui possède 2 connecteurs pour l'échange de données, numérotés de 0 à 13 et de A0 à A5, soit un total de 20 connexions.&lt;br /&gt;
&lt;br /&gt;
Si nous nous considérons à la place de la carte arduino, chaque connexion peut être :&lt;br /&gt;
*'''une entrée/INPUT''' (mesure, observation). Par ex,&lt;br /&gt;
**capteur de température&lt;br /&gt;
**interrupteur&lt;br /&gt;
**mesure de tension&lt;br /&gt;
**microphone&lt;br /&gt;
*'''une sortie/OUTPUT''' (action). Par ex,&lt;br /&gt;
**résistance chauffante&lt;br /&gt;
**lampe, voyant lumineux&lt;br /&gt;
**haut parleur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Notions fondamentales=&lt;br /&gt;
&lt;br /&gt;
==Gestion des sorties==&lt;br /&gt;
&lt;br /&gt;
On souhaite allumer et éteindre une led sur la carte.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons les 2 leds (sérigraphie L1 et L2 sur la carte) qui sont reliées sur la carte arduino :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Led !! numéro arduino&lt;br /&gt;
|-&lt;br /&gt;
| L1 || D5&lt;br /&gt;
|-&lt;br /&gt;
| L2 || D13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Principe===&lt;br /&gt;
Nous pouvons maintenant écrire le programme qui comporte '''nécessairement''' une partie configuration ( '''setup'''() ) et une boucle ( '''loop'''() ) :&lt;br /&gt;
*le setup() exécuté une seule fois&lt;br /&gt;
*le loop() exécuté en boucle ('''loop''' veut dire boucle en anglais)&lt;br /&gt;
&lt;br /&gt;
On commence par la partie configuration qui nous permet de définir les entrées et sorties :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut ensuite décrire le comportement souhaité :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Saisir le programme, l'exécuter et constater que ....}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|ça ne clignote pas !}}&lt;br /&gt;
&lt;br /&gt;
En effet, les instructions étant exécutées très rapidement, il est impossible d'observer le clignotement. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Todo|Ajoutons donc une temporisation ce qui nous donne le programme suivant :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous trouverez des détails sur la fonction [https://www.arduino.cc/reference/en/language/functions/time/delay/ delay() sur cette page].&lt;br /&gt;
&lt;br /&gt;
{{Todo|Utilisons maintenant une variable pour la position de la led afin de rendre notre code plus facilement lisible et modifiable :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int ledPin = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(ledPin,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(ledPin,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(ledPin,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avec cette structure, vous pouvez maintenant facilement changer de led.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Ex avec les leds}}===&lt;br /&gt;
&lt;br /&gt;
Écrire les programmes répondant aux cahiers des charges suivants :&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer une led pendant 1s et l'éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer 2 leds pendant 100ms et les éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer en alternance la led L1 puis la led L2, chacune étant allumée 1s}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer la led L1 puis les 2 leds puis seulement la led L2 puis tout éteint, en changeant toutes les 500ms}}&lt;br /&gt;
&lt;br /&gt;
===Clignotement===&lt;br /&gt;
&lt;br /&gt;
Nous allons essayer de faire clignoter les leds à des rythmes différents.&lt;br /&gt;
&lt;br /&gt;
Commençons par utiliser une variable pour changer l'état de la led :&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool etatLed1 = false; //variable booléenne pour mémoriser l'état de la led&lt;br /&gt;
const unsigned int pinLed1 = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(pinLed1,OUTPUT);        // déclarer la broche en sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  etatLed1 = ! etatLed1;          // inverser l'état de la variable booléenne&lt;br /&gt;
  digitalWrite(pinLed1,etatLed1); // modifier l'état de la sortie&lt;br /&gt;
  _delay_ms(200);                 // attendre 200ms avant de recommencer -&amp;gt; rythme de clignotement&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Vérifier le bon fonctionnement et comprendre ce programme}}&lt;br /&gt;
&lt;br /&gt;
On souhaite réduire la valeur du delay tout en conservant la même vitesse de clignotement :&lt;br /&gt;
*réduire le delay à 20ms&lt;br /&gt;
*déclarer une variable cptLed1 de type int&lt;br /&gt;
*incrémenter ce compteur à chaque itération&lt;br /&gt;
*si le compteur vaut 10 :&lt;br /&gt;
**remettre le compteur à 0&lt;br /&gt;
**changer l'état de la variable etatLed1&lt;br /&gt;
**modifier l'état de la sortie&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications demandées}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons préparé la structure du programme, il est assez simple d'ajouter une 2ème led qui clignotera à un rythme différent :&lt;br /&gt;
*ajouter les variables nécessaires pour cette 2ème led :&lt;br /&gt;
**etatLed2&lt;br /&gt;
**pinLed2&lt;br /&gt;
**cptLed2&lt;br /&gt;
*ajouter la 2ème led en sortie&lt;br /&gt;
*modifier le loop pour que la 2ème led change d'état toutes les 140ms&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications pour avoir les 2 leds qui clignotent à des rythmes différents}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gestion d'une entrée}}==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitons maintenant observer l'état d'un bouton sur la carte. Il s'agit donc d'une entrée : la carte arduino observe l'état du bouton, ce n'est pas elle qui modifie son état !&lt;br /&gt;
&lt;br /&gt;
De façon analogue à la partie précédente, trouvons sur [[Cours:Shieldinfo|la page de documentation le tableau suivant :]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bouton !! Arduino Pin !! Port !! Interruption !!  Niveau logique de l'entrée arduino si bouton appuyé&lt;br /&gt;
|-&lt;br /&gt;
| haut ||  3 || PD3 || int1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| bas || 2 || PD2 || int0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous choisissons le bouton référencé '''A''' et retenons donc le numéro de patte arduino associé : {{Rouge|2}}&lt;br /&gt;
&lt;br /&gt;
On utilisera astucieusement 2 variables comme :&lt;br /&gt;
*'''bpPin''' : qui représentera la position physique du bouton&lt;br /&gt;
*'''etatBp''' : qui représentera la valeur du bouton&lt;br /&gt;
&lt;br /&gt;
Il suffit de configurer la patte du bouton en '''entrée''' ( pinMode() ) et de lire l'état de cette patte ( digitalRead() ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int bpPin = 5;&lt;br /&gt;
unsigned int etatBp;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(bpPin,INPUT); // le bouton est connecté sur la patte représentée par la variable bpPin&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatBp = digitalRead(bpPin); // lecture de l'état de l'entrée&lt;br /&gt;
   .....                        // la variable etatBp sera utilisée dans la suite de l'algorithme pour tenir compte de l'état du bouton&lt;br /&gt;
   .....                        // ex : if ( etatBp == 0) {....;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 1: Entrée, sortie ???=&lt;br /&gt;
==1 bp, 1 led==&lt;br /&gt;
&lt;br /&gt;
Commençons tout simplement par commander une sortie tout ou rien (2 états possibles) à l'aide d'un bouton poussoir.&lt;br /&gt;
&lt;br /&gt;
On prendra la led L1, et le bouton du haut.&lt;br /&gt;
&lt;br /&gt;
On se servira des fonctions suivantes :&lt;br /&gt;
*[http://arduino.cc/en/Reference/PinMode '''pinMode()'''] permettant de configurer les entrées et sorties(e/s).&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalWrite '''digitalWrite()'''] permettant de modifier l'état d'une sortie.&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalRead '''digitalRead()'''] permettant de lire l'état d'une entrée.&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter le programme suivant pour que la led ne s'allume que si le bouton est appuyé.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
unsigned int ledPin= ... ;   // qques variables pour la position&lt;br /&gt;
unsigned int bpPin = ... ;   // des e/s&lt;br /&gt;
unsigned int etatBp;         // et récupérer l'état du bouton&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     pinMode(...,INPUT);      // configuration des e/s&lt;br /&gt;
     pinMode(...,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
     etatBp = ..........;     // &amp;quot;Lecture&amp;quot; de l'état de l'entrée&lt;br /&gt;
     ...................;     // &amp;quot;Écriture&amp;quot; de l'état de la sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
On ajoute le deuxième bouton.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led uniquement si les 2 boutons sont appuyés}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led si au moins l'un des 2 boutons est appuyé}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led s'il n'y a qu'un bouton appuyé}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 2: Détection de changement d'état=&lt;br /&gt;
&lt;br /&gt;
Modifions légèrement le comportement. Nous souhaitons désormais que l'état de la led change à chaque appui sur le bouton du bas. On détecte non plus un état du bouton, mais un changement d'état de celui-ci.&lt;br /&gt;
&lt;br /&gt;
==Par interruption==&lt;br /&gt;
&lt;br /&gt;
Sans entrer dans le détail pour le moment et sans être exhaustif, nous utiliserons les interruptions de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
===Mise en place===&lt;br /&gt;
&lt;br /&gt;
Dans la fonction {{Rouge|setup()}}, nous utiliserons la fonction [http://arduino.cc/en/Reference/AttachInterrupt {{Rouge|attachInterrupt()}}] qui permettra d'exécuter une fonction particulière lors d'un événement parmi :&lt;br /&gt;
*{{Rouge|CHANGE}}  : la fonction d'interruption est exécutée sur une changement d'état de l'entrée&lt;br /&gt;
*{{Rouge|RISING}}  : la fonction d'interruption est exécutée sur un passage de l'état 0 à 1 de l'entrée&lt;br /&gt;
*{{Rouge|FALLING}} : la fonction d'interruption est exécutée sur un passage de l'état 1 à 0 de l'entrée&lt;br /&gt;
&lt;br /&gt;
On précise également le numéro de l'interruption qui nous intéresse comme indiqué dans le tableau un peut plus haut sur cette page.&lt;br /&gt;
&lt;br /&gt;
'''Exemple :'''&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
   pinMode(5,OUTPUT);               // On précise que la pin (patte) 13 est une sortie dans la suite de l'exemple.&lt;br /&gt;
   attachInterrupt(0,reagir,RISING); // La fonction reagir() sera exécutée lorsque le bouton A (int0) sera relâché.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Utilisation}}===&lt;br /&gt;
&lt;br /&gt;
Il convient bien entendu de déclarer la fonction d'interruption ({{Rouge|reagir}} ici) qui permettra par exemple de placer un drapeau (flag) dans un état particulier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile int appui;&lt;br /&gt;
int etatLed = 0;&lt;br /&gt;
&lt;br /&gt;
void reagir()&lt;br /&gt;
{&lt;br /&gt;
   appui = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   if ( appui == 1)&lt;br /&gt;
   {&lt;br /&gt;
      etatLed = !etatLed ;&lt;br /&gt;
      digitalWrite(5,etatLed);&lt;br /&gt;
      appui = 0 ;&lt;br /&gt;
   }&lt;br /&gt;
   delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
{{Todo|Recopier le programme, vérifier son fonctionnement et profitez en pour tester les différents mode de déclenchement de l'interruption.}}&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide de la méthode précédente, ajouter le deuxième bouton pour que :}}&lt;br /&gt;
* la led s'allume lors de l'appui sur le bouton haut.&lt;br /&gt;
* la led s'éteigne lors du relâchement du bouton bas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|En observant le changement de valeur du bouton}}==&lt;br /&gt;
[[Image:CdcInformatique.gif|vignette]]&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il convient de remarquer que juste avant l'appui, la valeur lue sur l'entrée correspondant au bouton est à l'état 1, et que dès l'appui la valeur passe à l'état 0.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez 2 variables de type [http://arduino.cc/en/Reference/int int] (par exemple etatPresent et etatPasse), qui permettront de détecter cette transition.&lt;br /&gt;
&lt;br /&gt;
On utilisera également une variable etatSortie de type [http://arduino.cc/en/Reference/UnsignedInt unsigned int] pour mémoriser l'état de la sortie.&lt;br /&gt;
&lt;br /&gt;
Le programme ressemblera donc à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int etatPresent=0,etatPasse=0;&lt;br /&gt;
unsigned int etatSortie=0;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     .....            // configuration des e/s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatPasse=etatPresent;                                // mémorise l'état précédent (le présent devient le passé)&lt;br /&gt;
   etatPresent=digitalRead(??);                          // lecture de la valeur actuelle&lt;br /&gt;
   if ( ( etatPresent == ?? ) &amp;amp;&amp;amp; ( etatPasse == ?? ) )   // si appui alors ....&lt;br /&gt;
   {&lt;br /&gt;
         .....&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire le programme répondant au cahier des charges.}}&lt;br /&gt;
&lt;br /&gt;
=Ex 4: Game over !=&lt;br /&gt;
&lt;br /&gt;
Certains systèmes pour lesquels la sécurité est primordiale comportent un interrupteur de type &amp;quot;homme mort&amp;quot; permettant de vérifier la présence et l'état de conscience de l'opérateur.&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser l'un des boutons poussoirs de notre carte pour réaliser cette fonction.&lt;br /&gt;
&lt;br /&gt;
Le principe est le suivant : toute les 3s on allume une led. L'opérateur doit alors appuyer sur un bouton poussoir (que vous choisirez) dans les 3s suivantes. Dès l'appui, la 1ère led doit s'éteindre et la 2ème led s'allume.&lt;br /&gt;
&lt;br /&gt;
Si l'opérateur n'a pas appuyé dans le délais imparti, toutes les leds s'éteignent.&lt;br /&gt;
&lt;br /&gt;
On pourra utiliser la fonction [http://arduino.cc/en/Reference/Millis millis()], [http://arduino.cc/en/Tutorial/BlinkWithoutDelay un exemple d'utilisation étant donné sur ce lien]. Vous pouvez ajouter dans votre programme une ligne delay(1), qui permettra de rythmer le programme.&lt;br /&gt;
&lt;br /&gt;
{{Question|A vous de jouer !}}&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20743</id>
		<title>Cours:ArduinoBoutonsNano</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:ArduinoBoutonsNano&amp;diff=20743"/>
				<updated>2026-01-25T08:36:31Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* 2 bps, 1 led */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt; [[Cours:TPs_1103|{{Rouge|&amp;lt;big&amp;gt;'''Retour à la liste des Tps'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:ArduinoBoutonsCorrection|{{Vert|&amp;lt;big&amp;gt;'''Éléments de correction'''&amp;lt;/big&amp;gt;}}]]&lt;br /&gt;
&lt;br /&gt;
 [[Cours:shieldNanoinfo|{{Rouge|'''Carte d'extension arduino pour les Tps d'info'''}}]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ce Tp va permettre d'introduire quelques éléments indispensables à la programmation d'une carte arduino, et surtout d'apprendre à se servir d'une documentation, [https://docs.arduino.cc/language-reference/ en l'occurrence celle disponible sur le site arduino].&lt;br /&gt;
&lt;br /&gt;
Il convient de bien comprendre qu'une carte arduino (et plus exactement toute carte utilisant un [http://fr.wikipedia.org/wiki/Microcontrôleur microcontrôleur]) peut servir à faire de multiples tâches. On utilise nécessairement des extensions ([http://arduino.cc/en/Main/ArduinoShields shields]) et nous devrons spécifier dans le programme la façon de &amp;quot;communiquer&amp;quot;/gérer cette carte. Physiquement, cette communication s'opère à travers de connexions dont le nombre dépend de la carte utilisée. Nous utiliserons [https://store.arduino.cc/collections/boards/products/arduino-nano une carte arduino NANO]  qui possède 2 connecteurs pour l'échange de données, numérotés de 0 à 13 et de A0 à A5, soit un total de 20 connexions.&lt;br /&gt;
&lt;br /&gt;
Si nous nous considérons à la place de la carte arduino, chaque connexion peut être :&lt;br /&gt;
*'''une entrée/INPUT''' (mesure, observation). Par ex,&lt;br /&gt;
**capteur de température&lt;br /&gt;
**interrupteur&lt;br /&gt;
**mesure de tension&lt;br /&gt;
**microphone&lt;br /&gt;
*'''une sortie/OUTPUT''' (action). Par ex,&lt;br /&gt;
**résistance chauffante&lt;br /&gt;
**lampe, voyant lumineux&lt;br /&gt;
**haut parleur&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Notions fondamentales=&lt;br /&gt;
&lt;br /&gt;
==Gestion des sorties==&lt;br /&gt;
&lt;br /&gt;
On souhaite allumer et éteindre une led sur la carte.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons les 2 leds (sérigraphie L1 et L2 sur la carte) qui sont reliées sur la carte arduino :&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Led !! numéro arduino&lt;br /&gt;
|-&lt;br /&gt;
| L1 || D5&lt;br /&gt;
|-&lt;br /&gt;
| L2 || D13&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Principe===&lt;br /&gt;
Nous pouvons maintenant écrire le programme qui comporte '''nécessairement''' une partie configuration ( '''setup'''() ) et une boucle ( '''loop'''() ) :&lt;br /&gt;
*le setup() exécuté une seule fois&lt;br /&gt;
*le loop() exécuté en boucle ('''loop''' veut dire boucle en anglais)&lt;br /&gt;
&lt;br /&gt;
On commence par la partie configuration qui nous permet de définir les entrées et sorties :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut ensuite décrire le comportement souhaité :&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Saisir le programme, l'exécuter et constater que ....}}&lt;br /&gt;
&lt;br /&gt;
{{Rouge|ça ne clignote pas !}}&lt;br /&gt;
&lt;br /&gt;
En effet, les instructions étant exécutées très rapidement, il est impossible d'observer le clignotement. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Todo|Ajoutons donc une temporisation ce qui nous donne le programme suivant :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(5,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(5,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(5,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vous trouverez des détails sur la fonction [https://www.arduino.cc/reference/en/language/functions/time/delay/ delay() sur cette page].&lt;br /&gt;
&lt;br /&gt;
{{Todo|Utilisons maintenant une variable pour la position de la led afin de rendre notre code plus facilement lisible et modifiable :}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int ledPin = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(ledPin,OUTPUT); // on précise ici que la patte 5 est une sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  digitalWrite(ledPin,0); // extinction de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
  digitalWrite(ledPin,1); // éclairement de la led&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Avec cette structure, vous pouvez maintenant facilement changer de led.&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Ex avec les leds}}===&lt;br /&gt;
&lt;br /&gt;
Écrire les programmes répondant aux cahiers des charges suivants :&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer une led pendant 1s et l'éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer 2 leds pendant 100ms et les éteindre pendant 3s.}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer en alternance la led L1 puis la led L2, chacune étant allumée 1s}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Allumer la led L1 puis les 2 leds puis seulement la led L2 puis tout éteint, en changeant toutes les 500ms}}&lt;br /&gt;
&lt;br /&gt;
===Clignotement===&lt;br /&gt;
&lt;br /&gt;
Nous allons essayer de faire clignoter les leds à des rythmes différents.&lt;br /&gt;
&lt;br /&gt;
Commençons par utiliser une variable pour changer l'état de la led :&lt;br /&gt;
&amp;lt;source lang=cpp&amp;gt;&lt;br /&gt;
bool etatLed1 = false; //variable booléenne pour mémoriser l'état de la led&lt;br /&gt;
const unsigned int pinLed1 = 5;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(pinLed1,OUTPUT);        // déclarer la broche en sortie&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
  etatLed1 = ! etatLed1;          // inverser l'état de la variable booléenne&lt;br /&gt;
  digitalWrite(pinLed1,etatLed1); // modifier l'état de la sortie&lt;br /&gt;
  _delay_ms(200);                 // attendre 200ms avant de recommencer -&amp;gt; rythme de clignotement&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Todo|Vérifier le bon fonctionnement et comprendre ce programme}}&lt;br /&gt;
&lt;br /&gt;
On souhaite réduire la valeur du delay tout en conservant la même vitesse de clignotement :&lt;br /&gt;
*réduire le delay à 20ms&lt;br /&gt;
*déclarer une variable cptLed1 de type int&lt;br /&gt;
*incrémenter ce compteur à chaque itération&lt;br /&gt;
*si le compteur vaut 10 :&lt;br /&gt;
**remettre le compteur à 0&lt;br /&gt;
**changer l'état de la variable etatLed1&lt;br /&gt;
**modifier l'état de la sortie&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications demandées}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Maintenant que nous avons préparé la structure du programme, il est assez simple d'ajouter une 2ème led qui clignotera à un rythme différent :&lt;br /&gt;
*ajouter les variables nécessaires pour cette 2ème led :&lt;br /&gt;
**etatLed2&lt;br /&gt;
**pinLed2&lt;br /&gt;
**cptLed2&lt;br /&gt;
*ajouter la 2ème led en sortie&lt;br /&gt;
*modifier le loop pour que la 2ème led change d'état toutes les 140ms&lt;br /&gt;
&lt;br /&gt;
{{Question|Faire les modifications pour avoir les 2 leds qui clignotent à des rythmes différents}}&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|Gestion d'une entrée}}==&lt;br /&gt;
&lt;br /&gt;
Nous souhaitons maintenant observer l'état d'un bouton sur la carte. Il s'agit donc d'une entrée : la carte arduino observe l'état du bouton, ce n'est pas elle qui modifie son état !&lt;br /&gt;
&lt;br /&gt;
De façon analogue à la partie précédente, trouvons sur [[Cours:Shieldinfo|la page de documentation le tableau suivant :]]&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Bouton !! Arduino Pin !! Port !! Interruption !!  Niveau logique de l'entrée arduino si bouton appuyé&lt;br /&gt;
|-&lt;br /&gt;
| haut ||  3 || PD3 || int1 || 0&lt;br /&gt;
|-&lt;br /&gt;
| bas || 2 || PD2 || int0 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nous choisissons le bouton référencé '''A''' et retenons donc le numéro de patte arduino associé : {{Rouge|2}}&lt;br /&gt;
&lt;br /&gt;
On utilisera astucieusement 2 variables comme :&lt;br /&gt;
*'''bpPin''' : qui représentera la position physique du bouton&lt;br /&gt;
*'''etatBp''' : qui représentera la valeur du bouton&lt;br /&gt;
&lt;br /&gt;
Il suffit de configurer la patte du bouton en '''entrée''' ( pinMode() ) et de lire l'état de cette patte ( digitalRead() ) :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const unsigned int bpPin = 5;&lt;br /&gt;
unsigned int etatBp;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
  pinMode(bpPin,INPUT); // le bouton est connecté sur la patte représentée par la variable bpPin&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatBp = digitalRead(bpPin); // lecture de l'état de l'entrée&lt;br /&gt;
   .....                        // la variable etatBp sera utilisée dans la suite de l'algorithme pour tenir compte de l'état du bouton&lt;br /&gt;
   .....                        // ex : if ( etatBp == 0) {....;}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 1: Entrée, sortie ???=&lt;br /&gt;
==1 bp, 1 led==&lt;br /&gt;
&lt;br /&gt;
Commençons tout simplement par commander une sortie tout ou rien (2 états possibles) à l'aide d'un bouton poussoir.&lt;br /&gt;
&lt;br /&gt;
On prendra la led L1, et le bouton du haut.&lt;br /&gt;
&lt;br /&gt;
On se servira des fonctions suivantes :&lt;br /&gt;
*[http://arduino.cc/en/Reference/PinMode '''pinMode()'''] permettant de configurer les entrées et sorties(e/s).&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalWrite '''digitalWrite()'''] permettant de modifier l'état d'une sortie.&lt;br /&gt;
*[http://arduino.cc/en/Reference/DigitalRead '''digitalRead()'''] permettant de lire l'état d'une entrée.&lt;br /&gt;
&lt;br /&gt;
{{Question|Compléter le programme suivant pour que la led ne s'allume que si le bouton est appuyé.}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
unsigned int ledPin= ... ;   // qques variables pour la position&lt;br /&gt;
unsigned int bpPin = ... ;   // des e/s&lt;br /&gt;
unsigned int etatBp;         // et récupérer l'état du bouton&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     pinMode(...,INPUT);      // configuration des e/s&lt;br /&gt;
     pinMode(...,OUTPUT);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
     etatBp = ..........;     // &amp;quot;Lecture&amp;quot; de l'état de l'entrée&lt;br /&gt;
     ...................;     // &amp;quot;Écriture&amp;quot; de l'état de la sortie&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
On ajoute le deuxième bouton.&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led uniquement si les 2 boutons sont appuyés}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led si au moins l'un des 2 boutons est appuyé}}&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire un programme qui allume la led s'il n'y a qu'un bouton appuyé}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Ex 2: Détection de changement d'état=&lt;br /&gt;
&lt;br /&gt;
Modifions légèrement le comportement. Nous souhaitons désormais que l'état de la led change à chaque appui sur le bouton du bas. On détecte non plus un état du bouton, mais un changement d'état de celui-ci.&lt;br /&gt;
&lt;br /&gt;
==Par interruption==&lt;br /&gt;
&lt;br /&gt;
Sans entrer dans le détail pour le moment et sans être exhaustif, nous utiliserons les interruptions de la façon suivante :&lt;br /&gt;
&lt;br /&gt;
===Mise en place===&lt;br /&gt;
&lt;br /&gt;
Dans la fonction {{Rouge|setup()}}, nous utiliserons la fonction [http://arduino.cc/en/Reference/AttachInterrupt {{Rouge|attachInterrupt()}}] qui permettra d'exécuter une fonction particulière lors d'un événement parmi :&lt;br /&gt;
*{{Rouge|CHANGE}}  : la fonction d'interruption est exécutée sur une changement d'état de l'entrée&lt;br /&gt;
*{{Rouge|RISING}}  : la fonction d'interruption est exécutée sur un passage de l'état 0 à 1 de l'entrée&lt;br /&gt;
*{{Rouge|FALLING}} : la fonction d'interruption est exécutée sur un passage de l'état 1 à 0 de l'entrée&lt;br /&gt;
&lt;br /&gt;
On précise également le numéro de l'interruption qui nous intéresse comme indiqué dans le tableau un peut plus haut sur cette page.&lt;br /&gt;
&lt;br /&gt;
'''Exemple :'''&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
   pinMode(5,OUTPUT);               // On précise que la pin (patte) 13 est une sortie dans la suite de l'exemple.&lt;br /&gt;
   attachInterrupt(0,reagir,RISING); // La fonction reagir() sera exécutée lorsque le bouton A (int0) sera relâché.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==={{Vert|Utilisation}}===&lt;br /&gt;
&lt;br /&gt;
Il convient bien entendu de déclarer la fonction d'interruption ({{Rouge|reagir}} ici) qui permettra par exemple de placer un drapeau (flag) dans un état particulier :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
volatile int appui;&lt;br /&gt;
int etatLed = 0;&lt;br /&gt;
&lt;br /&gt;
void reagir()&lt;br /&gt;
{&lt;br /&gt;
   appui = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   if ( appui == 1)&lt;br /&gt;
   {&lt;br /&gt;
      etatLed = !etatLed ;&lt;br /&gt;
      digitalWrite(5,etatLed);&lt;br /&gt;
      appui = 0 ;&lt;br /&gt;
   }&lt;br /&gt;
   delay(1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Test===&lt;br /&gt;
&lt;br /&gt;
{{Todo|Recopier le programme, vérifier son fonctionnement et profitez en pour tester les différents mode de déclenchement de l'interruption.}}&lt;br /&gt;
&lt;br /&gt;
==2 bps, 1 led==&lt;br /&gt;
&lt;br /&gt;
{{Question|A l'aide de la méthode précédente, ajouter le deuxième bouton pour que :}}&lt;br /&gt;
* la led s'allume lors de l'appui sur le bouton haut.&lt;br /&gt;
* la led s'éteigne lors du relâchement du bouton bas.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=={{Bleu|En observant le changement de valeur du bouton}}==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Pour ce faire, il convient de remarquer que juste avant l'appui, la valeur lue sur l'entrée correspondant au bouton est à l'état 1, et que dès l'appui la valeur passe à l'état 0.&lt;br /&gt;
&lt;br /&gt;
Vous utiliserez 2 variables de type [http://arduino.cc/en/Reference/int int] (par exemple etatPresent et etatPasse), qui permettront de détecter cette transition.&lt;br /&gt;
&lt;br /&gt;
On utilisera également une variable etatSortie de type [http://arduino.cc/en/Reference/UnsignedInt unsigned int] pour mémoriser l'état de la sortie.&lt;br /&gt;
&lt;br /&gt;
Le programme ressemblera donc à :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int etatPresent=0,etatPasse=0;&lt;br /&gt;
unsigned int etatSortie=0;&lt;br /&gt;
&lt;br /&gt;
void setup()&lt;br /&gt;
{&lt;br /&gt;
     .....            // configuration des e/s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop()&lt;br /&gt;
{&lt;br /&gt;
   etatPasse=etatPresent;                                // mémorise l'état précédent (le présent devient le passé)&lt;br /&gt;
   etatPresent=digitalRead(??);                          // lecture de la valeur actuelle&lt;br /&gt;
   if ( ( etatPresent == ?? ) &amp;amp;&amp;amp; ( etatPasse == ?? ) )   // si appui alors ....&lt;br /&gt;
   {&lt;br /&gt;
         .....&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Question|Écrire le programme répondant au cahier des charges.}}&lt;br /&gt;
&lt;br /&gt;
=Ex 4: Game over !=&lt;br /&gt;
&lt;br /&gt;
Certains systèmes pour lesquels la sécurité est primordiale comportent un interrupteur de type &amp;quot;homme mort&amp;quot; permettant de vérifier la présence et l'état de conscience de l'opérateur.&lt;br /&gt;
&lt;br /&gt;
Nous allons utiliser l'un des boutons poussoirs de notre carte pour réaliser cette fonction.&lt;br /&gt;
&lt;br /&gt;
Le principe est le suivant : toute les 3s on allume une led. L'opérateur doit alors appuyer sur un bouton poussoir (que vous choisirez) dans les 3s suivantes. Dès l'appui, la 1ère led doit s'éteindre et la 2ème led s'allume.&lt;br /&gt;
&lt;br /&gt;
Si l'opérateur n'a pas appuyé dans le délais imparti, toutes les leds s'éteignent.&lt;br /&gt;
&lt;br /&gt;
On pourra utiliser la fonction [http://arduino.cc/en/Reference/Millis millis()], [http://arduino.cc/en/Tutorial/BlinkWithoutDelay un exemple d'utilisation étant donné sur ce lien]. Vous pouvez ajouter dans votre programme une ligne delay(1), qui permettra de rythmer le programme.&lt;br /&gt;
&lt;br /&gt;
{{Question|A vous de jouer !}}&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20712</id>
		<title>Cours:InfoS1EvalTP2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20712"/>
				<updated>2026-01-16T14:51:17Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|capteur de niveau}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un capteur de niveau en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur une série de leds l'information de hauteur du liquide contenu dans la cuve.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série. Cette partie est indépendante du capteur de niveau.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;start arduino&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**affiche &amp;quot;boucle n°:&amp;quot;&lt;br /&gt;
**incrémente une variable à chaque boucle et affiche sa valeur&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage au bout de 1,5s :''' &lt;br /&gt;
&lt;br /&gt;
 start arduino&lt;br /&gt;
 boucle n°:1&lt;br /&gt;
 boucle n°:2&lt;br /&gt;
 boucle n°:3&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
&lt;br /&gt;
Pour démarrer la pompe de remplissage de la cuve, on utilise un bouton poussoir. Cela permet également d'allumer le voyant signalant le fonctionnement de la pompe.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer si la pompe est en fonctionnement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Réaliser le programme permettant d'allumer la led pour indiquer le fonctionnement de la pompe lorsqu'on appuie sur le bouton. Dans un premier temps, quand on relâche le bouton la pompe s'arrête.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifiez votre programme pour effectuer une mesure de la hauteur du liquide (cuve vide... 10 m) toutes les {{Rouge|250 ms}} lorsque la pompe est en {{Rouge|marche manuelle}}.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
La cuve, lorsqu'elle est vide, a une hauteur de 10 mètres. Afin de tester votre programme plus facilement, nous utiliserons une échelle réduite de 1/10, soit 1 mètre pour 10 mètres.&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
&lt;br /&gt;
Vous allez utiliser les leds de couleurs que vous avez utilisées pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
&lt;br /&gt;
On affichera une information de hauteur de la façon suivante sur les LEDs :&lt;br /&gt;
*si la cuve est pleine à plus de 50%, on allume les 8 LEDs en vert.&lt;br /&gt;
*si la cuve est pleine à plus de 20% à 50% on allumera les LEDs en orange de façon proportionnelle.&lt;br /&gt;
:: 50% 8 LEDs en vert&lt;br /&gt;
:: 35% 4 LEDs en vert et 4 LEDs en orange&lt;br /&gt;
:: 20% 8 LEDx en orange&lt;br /&gt;
*si la cuve est pleine à moins de 20%&lt;br /&gt;
:: la cuve est vide 8 LEDs en rouge&lt;br /&gt;
:: 10% 4 LEDs en rouge et 4 LEDs en orange&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
L'appui sur le BP du haut démarre la pompe en mode automatique, l'appui sur le BP du bas (broche 2) arrête la pompe et le mode automatique. Quand la distance d &amp;lt; 1 m la pompe s'arrête automatiquement et ne peut pas redémarrer avec le BP du Haut tant que la distance d &amp;lt; 2.5 m. Si d &amp;gt; 6 m alors la pompe de remplissage démarre.&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement (watchdog), on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour le mode automatique et faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&amp;lt;br&amp;gt;&lt;br /&gt;
Vous pourrez utiliser l'instruction '''Timer1.detachInterrupt()''' quand le mode automatique est à l'arrêt.&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20711</id>
		<title>Cours:Sujet2Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20711"/>
				<updated>2026-01-16T14:49:47Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut '''start arduino''' qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le comptage commence à 1 et pas à 0 &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que ça boucle plus de 1,5 secondes &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le chiffre soit dans la continuïté; pas sur la ligne dessous '''boucle n°:1'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int i = 1;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;start arduino&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  Serial.print(&amp;quot;boucle n°:&amp;quot;);&lt;br /&gt;
  Serial.println(i++);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
La déclaration des pins d'entrée/sortie n'est pas obligatoire&amp;lt;br&amp;gt;&lt;br /&gt;
Il faut le BP du haut et la led de gauche&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : si on appuie sur le BP la led s'allume et s'éteint si on relache le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int buttonPin = 3;  // the number of the pushbutton pin&lt;br /&gt;
const int ledPin = 5;     // the number of the LED pin&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledPin,   OUTPUT);    // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(buttonPin, INPUT);  // initialize the pushbutton pin as an input:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
   // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(buttonPin)) {    &lt;br /&gt;
    digitalWrite(ledPin, LOW);  // turn LED off:&lt;br /&gt;
  } else {    &lt;br /&gt;
    digitalWrite(ledPin, HIGH); // turn LED on:&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
la librairie donne la distance en centimètre, il faut convertir la distance entre le capteur et la surface du liquide en mètre.&amp;lt;br&amp;gt;&lt;br /&gt;
on utilise une échelle au 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que la librairie HCSR04.h soit incluse sans aucune aide '''#include &amp;lt;HCSR04.h&amp;gt;'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut que les pins 7 triggerPin et 6 echoPin soient déclarées sans aucune aide '''UltraSonicDistanceSensor distanceSensor(7, 6);'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut un délai de 250 ms entre chaque mesure de distance '''delay(250);'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que l'affichage ou la mesure de la hauteur du liquide, que quand la pompe fonctionne&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Si le programme fonctionne à 100 % quand le capteur et proche de l'écran hauteur proche de 10 m quand le capteur à plus d'un mètre de l'écran '''cuve vide''' entre les deux la hauteur en mètre&amp;lt;br&amp;gt;&lt;br /&gt;
ils peuvent utiliser leur mallette pour simuler la surface de l'eau&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define echelle 1 / 10&lt;br /&gt;
#define hauteurCuve 10&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
    float distance = distanceSensor.measureDistanceCm() * echelle * 1.0;&lt;br /&gt;
    if (distance &amp;gt;= hauteurCuve) {&lt;br /&gt;
      Serial.println(&amp;quot;Cuve vide&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      Serial.print(&amp;quot;Hauteur du liquide : &amp;quot;);&lt;br /&gt;
      Serial.println(hauteurCuve - distance);&lt;br /&gt;
    }&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
Les étudiants peuvent utiliser des '''else if ()''' pour faire les paliers.&amp;lt;br&amp;gt; &lt;br /&gt;
J'ai aussi utilisé une structure pour simplifier mais ce n'est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour tester le code j'ai mis hauteur = 3.4; cela me permet de m'affranchir du fonctionnement du capteur à ultrasons. Il suffit de faire varier cette distance de 0 à 10 m pour voir si leur code fonctionne.&amp;lt;br&amp;gt;&lt;br /&gt;
Il y a aussi la solution pour le réglage de la luminosité qui est la question suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define echelle 1 / 10.0&lt;br /&gt;
#define hauteurCuve 10.0&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
// Create an ledStrip object and specify the pin it will use.&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
// Create a buffer for holding the colors (3 bytes per color).&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color tableauCouleurs[nbLeds];&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color c) {&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setAll(Color c) {&lt;br /&gt;
  setRange(0, nbLeds, c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed(float hauteur) {&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  const Color ROUGE = { luminosite*255.0/1023.0, 0, 0 };&lt;br /&gt;
  const Color ORANGE = { luminosite*255.0/1023.0, luminosite*160.0/1023.0, 0 };&lt;br /&gt;
  const Color VERT = { 0, luminosite*255.0/1023.0, 0 };&lt;br /&gt;
  &lt;br /&gt;
  if (hauteur &amp;gt; hauteurCuve * 0.50) {  // cuve pleine à plus de 50%&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (hauteur &amp;gt; hauteurCuve * 0.20) {  // cuve pleine à plus de 20%&lt;br /&gt;
    int nbVert = (hauteur - hauteurCuve * 0.20) * nbLeds / (hauteurCuve * (0.50 - 0.20));&lt;br /&gt;
    int nbOrange = 8 - nbVert;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {  // cuve vide à plus de 80%&lt;br /&gt;
    int nbOrange = hauteur * nbLeds / (hauteurCuve * 0.20);&lt;br /&gt;
    int nbRouge = 8 - nbOrange;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float hauteur = hauteurCuve - (distanceSensor.measureDistanceCm() * echelle * 1.0);&lt;br /&gt;
  hauteur = 3.4;  // pour tester le code&lt;br /&gt;
  if (hauteur &amp;gt; 0) {&lt;br /&gt;
    affichageLed(hauteur);&lt;br /&gt;
    Serial.println(hauteur);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
Ici juste le principe, avec une structure c'est plus simple. Pour les étudiants ils doivent modifier dans tous leurs tableaux&amp;lt;br&amp;gt;&lt;br /&gt;
Voir code ci-dessus.&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
Formule vue en TP mesure analogique de la thermistance &amp;lt;br&amp;gt;&lt;br /&gt;
θ = 1 / ( 1/T25 + (1/β)·ln(Rθ / R25) ) &amp;lt;br&amp;gt;&lt;br /&gt;
Ici le principe pour tenir compte de la température dans la mesure de distance.&amp;lt;br&amp;gt;&lt;br /&gt;
Il est intéressant de faire afficher la température sans et avec la correction de température.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Le calcul de la température de la thermistance.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Affichage des distances avec et sans tenir compte de la température.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  float Vθ = analogRead(A0)*(5.0 / 1023.0);&lt;br /&gt;
  float Rθ=R1*Vθ/(Vcc-Vθ);&lt;br /&gt;
  float hauteur = hauteurCuve - distanceSensor.measureDistanceCm(1 / ( 1/T25 + (1/β)*ln(Rθ / R25) ));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  void modeAuto() {&lt;br /&gt;
  //void setup(){&lt;br /&gt;
  static bool auto = 0;&lt;br /&gt;
  pinMode(bpHaut, INPUT);  // l'entrée D3 est à 1 quand le BP est relaché&lt;br /&gt;
  pinMode(bpBas, INPUT);&lt;br /&gt;
  pinMode(L1, OUTPUT);  // la led s'allume quand la sortie D5 est à 1&lt;br /&gt;
  pinMode(L2, OUTPUT);&lt;br /&gt;
  //}&lt;br /&gt;
  //void loop() {&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm();&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(bpHaut)) {&lt;br /&gt;
    auto = 1;  // enclenchement mode automatique    &lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);  // blinkLED to run every 0.5 seconds&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (auto) {&lt;br /&gt;
    ledsColor();&lt;br /&gt;
    //distance = 70;&lt;br /&gt;
    if ((!digitalRead(bpHaut) &amp;amp;&amp;amp; (distance &amp;gt; 25)) | (distance &amp;gt; 60)) {&lt;br /&gt;
      digitalWrite(L1, turnOn);&lt;br /&gt;
    }&lt;br /&gt;
    if (distance &amp;lt; 10) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
    if (!digitalRead(bpBas)) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
      auto = 0;  // déclenchement mode automatique&lt;br /&gt;
      Timer1.detachInterrupt();&lt;br /&gt;
      digitalWrite(L2, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  //}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(L2, !digitalRead(L2));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20710</id>
		<title>Cours:Sujet2Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20710"/>
				<updated>2026-01-16T14:48:23Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut '''start arduino''' qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le comptage commence à 1 et pas à 0 &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que ça boucle plus de 1,5 secondes &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le chiffre soit dans la continuïté; pas sur la ligne dessous '''boucle n°:1'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int i = 1;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;start arduino&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  Serial.print(&amp;quot;boucle n°:&amp;quot;);&lt;br /&gt;
  Serial.println(i++);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
La déclaration des pins d'entrée/sortie n'est pas obligatoire&amp;lt;br&amp;gt;&lt;br /&gt;
Il faut le BP du haut et la led de gauche&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : si on appuie sur le BP la led s'allume et s'éteint si on relache le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int buttonPin = 3;  // the number of the pushbutton pin&lt;br /&gt;
const int ledPin = 5;     // the number of the LED pin&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledPin,   OUTPUT);    // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(buttonPin, INPUT);  // initialize the pushbutton pin as an input:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
   // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(buttonPin)) {    &lt;br /&gt;
    digitalWrite(ledPin, LOW);  // turn LED off:&lt;br /&gt;
  } else {    &lt;br /&gt;
    digitalWrite(ledPin, HIGH); // turn LED on:&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
la librairie donne la distance en centimètre, il faut convertir la distance entre le capteur et la surface du liquide en mètre.&amp;lt;br&amp;gt;&lt;br /&gt;
on utilise une échelle au 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que la librairie HCSR04.h soit incluse sans aucune aide '''#include &amp;lt;HCSR04.h&amp;gt;'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut que les pins 7 triggerPin et 6 echoPin soient déclarées sans aucune aide '''UltraSonicDistanceSensor distanceSensor(7, 6);'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut un délai de 250 ms entre chaque mesure de distance '''delay(250);'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que l'affichage ou la mesure de la hauteur du liquide, que quand la pompe fonctionne&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Si le programme fonctionne à 100 % quand le capteur et proche de l'écran hauteur proche de 10 m quand le capteur à plus d'un mètre de l'écran '''cuve vide''' entre les deux la hauteur en mètre&amp;lt;br&amp;gt;&lt;br /&gt;
ils peuvent utiliser leur mallette pour simuler la surface de l'eau&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define echelle 1 / 10&lt;br /&gt;
#define hauteurCuve 10&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
    float distance = distanceSensor.measureDistanceCm() * echelle * 1.0;&lt;br /&gt;
    if (distance &amp;gt;= hauteurCuve) {&lt;br /&gt;
      Serial.println(&amp;quot;Cuve vide&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      Serial.print(&amp;quot;Hauteur du liquide : &amp;quot;);&lt;br /&gt;
      Serial.println(hauteurCuve - distance);&lt;br /&gt;
    }&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
Les étudiants peuvent utiliser des '''else if ()''' pour faire les paliers.&amp;lt;br&amp;gt; &lt;br /&gt;
J'ai aussi utilisé une structure pour simplifier mais ce n'est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour tester le code j'ai mis hauteur = 3.4; cela me permet de m'affranchir du fonctionnement du capteur à ultrasons. Il suffit de faire varier cette distance de 0 à 10 m pour voir si leur code fonctionne.&amp;lt;br&amp;gt;&lt;br /&gt;
Il y a aussi la solution pour le réglage de la luminosité qui est la question suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define echelle 1 / 10.0&lt;br /&gt;
#define hauteurCuve 10.0&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
// Create an ledStrip object and specify the pin it will use.&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
// Create a buffer for holding the colors (3 bytes per color).&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color tableauCouleurs[nbLeds];&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color c) {&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setAll(Color c) {&lt;br /&gt;
  setRange(0, nbLeds, c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed(float hauteur) {&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  const Color ROUGE = { luminosite*255.0/1023.0, 0, 0 };&lt;br /&gt;
  const Color ORANGE = { luminosite*255.0/1023.0, luminosite*160.0/1023.0, 0 };&lt;br /&gt;
  const Color VERT = { 0, luminosite*255.0/1023.0, 0 };&lt;br /&gt;
  &lt;br /&gt;
  if (hauteur &amp;gt; hauteurCuve * 0.50) {  // cuve pleine à plus de 50%&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (hauteur &amp;gt; hauteurCuve * 0.20) {  // cuve pleine à plus de 20%&lt;br /&gt;
    int nbVert = (hauteur - hauteurCuve * 0.20) * nbLeds / (hauteurCuve * (0.50 - 0.20));&lt;br /&gt;
    int nbOrange = 8 - nbVert;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {  // cuve vide à plus de 80%&lt;br /&gt;
    int nbOrange = hauteur * nbLeds / (hauteurCuve * 0.20);&lt;br /&gt;
    int nbRouge = 8 - nbOrange;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float hauteur = hauteurCuve - (distanceSensor.measureDistanceCm() * echelle * 1.0);&lt;br /&gt;
  hauteur = 3.4;  // pour tester le code&lt;br /&gt;
  if (hauteur &amp;gt; 0) {&lt;br /&gt;
    affichageLed(hauteur);&lt;br /&gt;
    Serial.println(hauteur);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
Ici juste le principe, avec une structure c'est plus simple. Pour les étudiants ils doivent modifier dans tous leurs tableaux&amp;lt;br&amp;gt;&lt;br /&gt;
Voir code ci-dessus.&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
Formule vue en TP mesure analogique de la thermistance &amp;lt;br&amp;gt;&lt;br /&gt;
θ = 1 / ( 1/T25 + (1/β)·ln(Rθ / R25) ) &amp;lt;br&amp;gt;&lt;br /&gt;
Ici le principe pour tenir compte de la température dans la mesure de distance.&amp;lt;br&amp;gt;&lt;br /&gt;
Il est intéressant de faire afficher la température sans et avec la correction de température.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  float Vθ = analogRead(A0)*(5.0 / 1023.0);&lt;br /&gt;
  float Rθ=R1*Vθ/(Vcc-Vθ);&lt;br /&gt;
  float hauteur = hauteurCuve - distanceSensor.measureDistanceCm(1 / ( 1/T25 + (1/β)*ln(Rθ / R25) ));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  void modeAuto() {&lt;br /&gt;
  //void setup(){&lt;br /&gt;
  static bool auto = 0;&lt;br /&gt;
  pinMode(bpHaut, INPUT);  // l'entrée D3 est à 1 quand le BP est relaché&lt;br /&gt;
  pinMode(bpBas, INPUT);&lt;br /&gt;
  pinMode(L1, OUTPUT);  // la led s'allume quand la sortie D5 est à 1&lt;br /&gt;
  pinMode(L2, OUTPUT);&lt;br /&gt;
  //}&lt;br /&gt;
  //void loop() {&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm();&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(bpHaut)) {&lt;br /&gt;
    auto = 1;  // enclenchement mode automatique    &lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);  // blinkLED to run every 0.5 seconds&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (auto) {&lt;br /&gt;
    ledsColor();&lt;br /&gt;
    //distance = 70;&lt;br /&gt;
    if ((!digitalRead(bpHaut) &amp;amp;&amp;amp; (distance &amp;gt; 25)) | (distance &amp;gt; 60)) {&lt;br /&gt;
      digitalWrite(L1, turnOn);&lt;br /&gt;
    }&lt;br /&gt;
    if (distance &amp;lt; 10) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
    if (!digitalRead(bpBas)) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
      auto = 0;  // déclenchement mode automatique&lt;br /&gt;
      Timer1.detachInterrupt();&lt;br /&gt;
      digitalWrite(L2, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  //}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(L2, !digitalRead(L2));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet3Correction&amp;diff=20709</id>
		<title>Cours:Sujet3Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet3Correction&amp;diff=20709"/>
				<updated>2026-01-16T14:46:49Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|compteur de passage}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut '''start arduino''' qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que la vitesse de transmission soit de 115200&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut le comptage, le décomptage, les messages intermédiares avec des boucles&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le chiffre soit dans la continuïté; pas sur la ligne dessous '''Nombre de places disponibles : 999'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Serial.println(&amp;quot;start Arduino&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  Serial.println(&amp;quot;Le parking est vide&amp;quot;);&lt;br /&gt;
  for (int i = 999; i &amp;gt; 0; i--) {&lt;br /&gt;
    affichage(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;Le parking est complet&amp;quot;);&lt;br /&gt;
  for (int i = 1; i &amp;lt; 1000; i++) {&lt;br /&gt;
    affichage(i);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichage(int nbPlace) {&lt;br /&gt;
  Serial.print(&amp;quot;Nombre de places disponibles : &amp;quot;);&lt;br /&gt;
  Serial.println(nbPlace);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Comptage et décomptage des places de parking=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que les messages ne s'affichent qu'une fois, pas de défilement&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut l'affichage des messages '''Le parking est vide''', '''Le parking est complet'''&amp;lt;br&amp;gt; &lt;br /&gt;
{{Rouge|'''25%'''}} : les leds fonctionnent quand on appuie et relâche le BP&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
const int ledGauche = 5;&lt;br /&gt;
const int ledDroite = 8;&lt;br /&gt;
const int bpHaut = 3;&lt;br /&gt;
const int bpBas = 2;&lt;br /&gt;
&lt;br /&gt;
int count = 1000;&lt;br /&gt;
&lt;br /&gt;
void decomptage() {&lt;br /&gt;
  count--;&lt;br /&gt;
  if (count &amp;lt;= 0) {&lt;br /&gt;
    Serial.println(&amp;quot;Le parking est complet&amp;quot;);&lt;br /&gt;
    count = 0;&lt;br /&gt;
  } else {&lt;br /&gt;
    affichage();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void comptage() {&lt;br /&gt;
  count++;&lt;br /&gt;
  if (count &amp;gt;= 1000) {&lt;br /&gt;
    Serial.println(&amp;quot;Le parking est vide&amp;quot;);&lt;br /&gt;
    count = 1000;&lt;br /&gt;
  } else {&lt;br /&gt;
    affichage();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichage() {&lt;br /&gt;
  Serial.print(&amp;quot;Nombre de places disponibles : &amp;quot;);&lt;br /&gt;
  Serial.println(count);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(ledGauche, OUTPUT);&lt;br /&gt;
  pinMode(ledDroite, OUTPUT);&lt;br /&gt;
  // pinMode(bpHaut, INPUT); &lt;br /&gt;
  // pinMode(bpBas, INPUT);&lt;br /&gt;
  attachInterrupt(0, comptage, RISING);    // La fonction comptage() sera exécutée lorsque le bouton bas (int0) sera relâché.&lt;br /&gt;
  attachInterrupt(1, decomptage, RISING);  // La fonction decomptage() sera exécutée lorsque le bouton haut (int1) sera relâché.&lt;br /&gt;
  Serial.println(&amp;quot;Le parking est vide&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(bpHaut)) {&lt;br /&gt;
    digitalWrite(ledGauche, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(ledGauche, OFF);&lt;br /&gt;
  }&lt;br /&gt;
  if (!digitalRead(bpBas)) {&lt;br /&gt;
    digitalWrite(ledDroite, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(ledDroite, OFF);&lt;br /&gt;
  }&lt;br /&gt;
  delay(1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
Ici on remplace la fonction attachInterrup du bpHaut par une détection de front descendant. Il faut le voir en TP &lt;br /&gt;
détection front montant et descendant.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Une voiture est pésente devant le télémètre la led de gauche s'allume, la voiture n'est plus présente la led de gauche s'éteint.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : le décomptage des places fonctionne au passage de chaque voiture devant le télémètre. Le comptage par le bpBas fonctionne toujours.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define detectCar 40&lt;br /&gt;
&lt;br /&gt;
const int ledGauche = 5;&lt;br /&gt;
const int ledDroite = 13;&lt;br /&gt;
const int bpHaut = 3;&lt;br /&gt;
const int bpBas = 2;&lt;br /&gt;
&lt;br /&gt;
int count = 1000;&lt;br /&gt;
bool etatPresent = false, etatPasse = false;&lt;br /&gt;
&lt;br /&gt;
void decomptage() {&lt;br /&gt;
  count--;&lt;br /&gt;
  if (count &amp;lt;= 0) {&lt;br /&gt;
    Serial.println(&amp;quot;Le parking est complet&amp;quot;);&lt;br /&gt;
    count = 0;&lt;br /&gt;
  } else {&lt;br /&gt;
    affichage();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void comptage() {&lt;br /&gt;
  count++;&lt;br /&gt;
  if (count &amp;gt;= 1000) {&lt;br /&gt;
    Serial.println(&amp;quot;Le parking est vide&amp;quot;);&lt;br /&gt;
    count = 1000;&lt;br /&gt;
  } else {&lt;br /&gt;
    affichage();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichage() {&lt;br /&gt;
  Serial.print(&amp;quot;Nombre de places disponibles : &amp;quot;);&lt;br /&gt;
  Serial.println(count);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(ledGauche, OUTPUT);&lt;br /&gt;
  pinMode(ledDroite, OUTPUT);&lt;br /&gt;
  // pinMode(bpHaut, INPUT);&lt;br /&gt;
  // pinMode(bpBas, INPUT);&lt;br /&gt;
  attachInterrupt(0, comptage, RISING);    // La fonction comptage() sera exécutée lorsque le bouton haut (int0) sera relâché.&lt;br /&gt;
  //attachInterrupt(1, decomptage, RISING);  // La fonction decomptage() sera exécutée lorsque le bouton bas (int1) sera relâché.&lt;br /&gt;
  Serial.println(&amp;quot;Le parking est vide&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  etatPasse = etatPresent;&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm();  &lt;br /&gt;
  if (distance &amp;lt;= detectCar) {&lt;br /&gt;
    etatPresent = true;&lt;br /&gt;
  } else {&lt;br /&gt;
    etatPresent = false;&lt;br /&gt;
  }&lt;br /&gt;
  // Détection front descendant&lt;br /&gt;
  if ((etatPresent == false) &amp;amp;&amp;amp; (etatPasse == true)) {&lt;br /&gt;
    decomptage();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatPresent) {&lt;br /&gt;
    digitalWrite(ledGauche, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(ledGauche, OFF);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(bpBas)) {&lt;br /&gt;
    digitalWrite(ledDroite, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(ledDroite, OFF);&lt;br /&gt;
  }&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
Ici on ne recherche pas obligatoirement la précision scientique pour indiquer le remplissage par des LEDs. Le code affiche 8 LEDs rouges alors qu'il reste une dizaine de place.&amp;lt;br&amp;gt;&lt;br /&gt;
Les étudiants ne sont pas obligés d'utiliser une structure.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici le nombre de led est obtenu par calcul, les étudiants peuvent utiliser des '''else if''' pour chaque palier, un bonus pour les étudiants qui le font par calcul.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : les 8 LEDs vertes sont allumées si il y a plus de 300 places disponibles&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : les LEDs passent à l'orange quand il y a moins de 300 places disponibles. Les 8 LEDs sont à l'orange quand il ne reste plus que 100 places.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : les LEDs passent au rouge quand il y a moins de 100 places disponibles. Les 8 LEDs sont au rouge quand il ne reste plus de places.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : les LEDs changent de couleur quand les voitures sortent du parking.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define detecCar 40&lt;br /&gt;
&lt;br /&gt;
const int ledGauche = 5;&lt;br /&gt;
const int ledDroite = 13;&lt;br /&gt;
const int bpHaut = 3;&lt;br /&gt;
const int bpBas = 2;&lt;br /&gt;
&lt;br /&gt;
int count = 320;&lt;br /&gt;
bool etatPresent = false, etatPasse = false;&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
// Create an ledStrip object and specify the pin it will use.&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
// Create a buffer for holding the colors (3 bytes per color).&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
void decomptage() {&lt;br /&gt;
  //count--;&lt;br /&gt;
  count -= 10;&lt;br /&gt;
  if (count &amp;lt;= 0) {&lt;br /&gt;
    Serial.println(&amp;quot;Le parking est complet&amp;quot;);&lt;br /&gt;
    count = 0;&lt;br /&gt;
  } else {&lt;br /&gt;
    affichage();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void comptage() {&lt;br /&gt;
  //count++;&lt;br /&gt;
  count += 10;&lt;br /&gt;
  if (count &amp;gt;= 1000) {&lt;br /&gt;
    Serial.println(&amp;quot;Le parking est vide&amp;quot;);&lt;br /&gt;
    count = 1000;&lt;br /&gt;
  } else {&lt;br /&gt;
    affichage();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichage() {&lt;br /&gt;
  Serial.print(&amp;quot;Nombre de places disponibles : &amp;quot;);&lt;br /&gt;
  Serial.println(count);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color c) {&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setAll(Color c) {&lt;br /&gt;
  setRange(0, nbLeds, c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  if (count &amp;gt; 300) {  // il reste 300 places de parking&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (count &amp;gt; 100) {  // il reste 200 places de parking&lt;br /&gt;
    int nbVert = (count - 100) * nbLeds / (900 - 700);&lt;br /&gt;
    int nbOrange = 8 - nbVert;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {  // il reste 100 places de parking&lt;br /&gt;
    int nbOrange = count * nbLeds / (1000 - 900);&lt;br /&gt;
    int nbRouge = 8 - nbOrange;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  pinMode(ledGauche, OUTPUT);&lt;br /&gt;
  pinMode(ledDroite, OUTPUT);&lt;br /&gt;
  // pinMode(bpHaut, INPUT);&lt;br /&gt;
  // pinMode(bpBas, INPUT);&lt;br /&gt;
  attachInterrupt(0, comptage, RISING);  // La fonction comptage() sera exécutée lorsque le bouton haut (int0) sera relâché.&lt;br /&gt;
  //attachInterrupt(1, decomptage, RISING);  // La fonction decomptage() sera exécutée lorsque le bouton bas (int1) sera relâché.&lt;br /&gt;
  Serial.println(&amp;quot;Le parking est vide&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  etatPasse = etatPresent;&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm();&lt;br /&gt;
  if (distance &amp;lt;= detecCar) {&lt;br /&gt;
    etatPresent = true;&lt;br /&gt;
  } else {&lt;br /&gt;
    etatPresent = false;&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if ((etatPresent == false) &amp;amp;&amp;amp; (etatPasse == true)) {&lt;br /&gt;
    decomptage();&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (etatPresent) {&lt;br /&gt;
    digitalWrite(ledGauche, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(ledGauche, OFF);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(bpBas)) {&lt;br /&gt;
    digitalWrite(ledDroite, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(ledDroite, OFF);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  affichageLed();&lt;br /&gt;
  delay(100);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
Ce n'est pas obligatoirement simple d'obtenir r,g et o. Ici le calul se fait en long puis est casté en char.&amp;lt;br&amp;gt;&lt;br /&gt;
On peut le faire normalement en float, il ne faut pas oublier de mettre 255.0 et 1023.0.&amp;lt;br&amp;gt;&lt;br /&gt;
L'utilisation d'une structure n'est pas obligatoire, on l'a vu en cours et en C++.&amp;lt;br&amp;gt;&lt;br /&gt;
Les étudiants peuvent utiliser la fonction MAP, s'il y en a beaucoup c'est qu'ils ont la solution du sujet, nous ne l'avons pas vu.&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  int lum = analogRead(A6);  // 0..1023&lt;br /&gt;
  uint8_t r = (uint8_t)(255L * lum / 1023);&lt;br /&gt;
  uint8_t g = (uint8_t)(255L * lum / 1023);&lt;br /&gt;
  uint8_t o = (uint8_t)(160L * lum / 1023);&lt;br /&gt;
&lt;br /&gt;
  Color ROUGE = { r, 0, 0 };&lt;br /&gt;
  Color ORANGE = { r, o, 0 };&lt;br /&gt;
  Color VERT = { 0, g, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (count &amp;gt; 300) {  // il reste 300 places de parking&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (count &amp;gt; 100) {  // il reste 200 places de parking&lt;br /&gt;
    int nbVert = (count - 100) * nbLeds / (900 - 700);&lt;br /&gt;
    int nbOrange = 8 - nbVert;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {  // il reste 100 places de parking&lt;br /&gt;
    int nbOrange = count * nbLeds / (1000 - 900);&lt;br /&gt;
    int nbRouge = 8 - nbOrange;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
Formule vue en TP mesure analogique de la thermistance &amp;lt;br&amp;gt;&lt;br /&gt;
θ = 1 / ( 1/T25 + (1/β)·ln(Rθ / R25) ) avec θ en Kelvin&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
 #include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define R1 12000&lt;br /&gt;
#define Vcc 5.0&lt;br /&gt;
#define beta 3480.0&lt;br /&gt;
#define r25 8200.0&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  float Vtheta = analogRead(A0) * (5.0 / 1023.0);&lt;br /&gt;
  float Rtheta = R1 * Vtheta / (Vcc - Vtheta);&lt;br /&gt;
  float temperature = 1 / (1 / (273.15 + 25) + 1 / beta * log(Rtheta / r25)) - 273.15;&lt;br /&gt;
  temperature = -200;&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm(temperature);&lt;br /&gt;
&lt;br /&gt;
  Serial.print(temperature);&lt;br /&gt;
  Serial.print(F(&amp;quot;°C - Distance: &amp;quot;));&lt;br /&gt;
  Serial.print(distance);&lt;br /&gt;
  Serial.print(F(&amp;quot;cm - Distance: &amp;quot;));&lt;br /&gt;
  Serial.print(distanceSensor.measureDistanceCm());&lt;br /&gt;
  Serial.println(F(&amp;quot;cm&amp;quot;));&lt;br /&gt;
  delay(1000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20708</id>
		<title>Cours:Sujet2Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20708"/>
				<updated>2026-01-16T14:43:19Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Contrôle de la luminosité des leds */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut '''start arduino''' qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le comptage commence à 1 et pas à 0 &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que ça boucle plus de 1,5 secondes &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le chiffre soit dans la continuïté; pas sur la ligne dessous '''boucle n°:1'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int i = 1;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;start arduino&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  Serial.print(&amp;quot;boucle n°:&amp;quot;);&lt;br /&gt;
  Serial.println(i++);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
La déclaration des pins d'entrée/sortie n'est pas obligatoire&amp;lt;br&amp;gt;&lt;br /&gt;
Il faut le BP du haut et la led de gauche&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : si on appuie sur le BP la led s'allume et s'éteint si on relache le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int buttonPin = 3;  // the number of the pushbutton pin&lt;br /&gt;
const int ledPin = 5;     // the number of the LED pin&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledPin,   OUTPUT);    // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(buttonPin, INPUT);  // initialize the pushbutton pin as an input:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
   // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(buttonPin)) {    &lt;br /&gt;
    digitalWrite(ledPin, LOW);  // turn LED off:&lt;br /&gt;
  } else {    &lt;br /&gt;
    digitalWrite(ledPin, HIGH); // turn LED on:&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
la librairie donne la distance en centimètre, il faut convertir la distance entre le capteur et la surface du liquide en mètre.&amp;lt;br&amp;gt;&lt;br /&gt;
on utilise une échelle au 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que la librairie HCSR04.h soit incluse sans aucune aide '''#include &amp;lt;HCSR04.h&amp;gt;'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut que les pins 7 triggerPin et 6 echoPin soient déclarées sans aucune aide '''UltraSonicDistanceSensor distanceSensor(7, 6);'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut un délai de 250 ms entre chaque mesure de distance '''delay(250);'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que l'affichage ou la mesure de la hauteur du liquide, que quand la pompe fonctionne&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Si le programme fonctionne à 100 % quand le capteur et proche de l'écran hauteur proche de 10 m quand le capteur à plus d'un mètre de l'écran '''cuve vide''' entre les deux la hauteur en mètre&amp;lt;br&amp;gt;&lt;br /&gt;
ils peuvent utiliser leur mallette pour simuler la surface de l'eau&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define echelle 1 / 10&lt;br /&gt;
#define hauteurCuve 10&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
    float distance = distanceSensor.measureDistanceCm() * echelle * 1.0;&lt;br /&gt;
    if (distance &amp;gt;= hauteurCuve) {&lt;br /&gt;
      Serial.println(&amp;quot;Cuve vide&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      Serial.print(&amp;quot;Hauteur du liquide : &amp;quot;);&lt;br /&gt;
      Serial.println(hauteurCuve - distance);&lt;br /&gt;
    }&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
Les étudiants peuvent utiliser des '''else if ()''' pour faire les paliers.&amp;lt;br&amp;gt; &lt;br /&gt;
J'ai aussi utilisé une structure pour simplifier mais ce n'est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour tester le code j'ai mis hauteur = 3.4; cela me permet de m'affranchir du fonctionnement du capteur à ultrasons. Il suffit de faire varier cette distance de 0 à 10 m pour voir si leur code fonctionne.&amp;lt;br&amp;gt;&lt;br /&gt;
Il y a aussi la solution pour le réglage de la luminosité qui est la question suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define echelle 1 / 10.0&lt;br /&gt;
#define hauteurCuve 10.0&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
// Create an ledStrip object and specify the pin it will use.&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
// Create a buffer for holding the colors (3 bytes per color).&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color tableauCouleurs[nbLeds];&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color c) {&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setAll(Color c) {&lt;br /&gt;
  setRange(0, nbLeds, c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed(float hauteur) {&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  const Color ROUGE = { luminosite*255.0/1023.0, 0, 0 };&lt;br /&gt;
  const Color ORANGE = { luminosite*255.0/1023.0, luminosite*160.0/1023.0, 0 };&lt;br /&gt;
  const Color VERT = { 0, luminosite*255.0/1023.0, 0 };&lt;br /&gt;
  &lt;br /&gt;
  if (hauteur &amp;gt; hauteurCuve * 0.50) {  // cuve pleine à plus de 50%&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (hauteur &amp;gt; hauteurCuve * 0.20) {  // cuve pleine à plus de 20%&lt;br /&gt;
    int nbVert = (hauteur - hauteurCuve * 0.20) * nbLeds / (hauteurCuve * (0.50 - 0.20));&lt;br /&gt;
    int nbOrange = 8 - nbVert;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {  // cuve vide à plus de 80%&lt;br /&gt;
    int nbOrange = hauteur * nbLeds / (hauteurCuve * 0.20);&lt;br /&gt;
    int nbRouge = 8 - nbOrange;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float hauteur = hauteurCuve - (distanceSensor.measureDistanceCm() * echelle * 1.0);&lt;br /&gt;
  hauteur = 3.4;  // pour tester le code&lt;br /&gt;
  if (hauteur &amp;gt; 0) {&lt;br /&gt;
    affichageLed(hauteur);&lt;br /&gt;
    Serial.println(hauteur);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
Ici juste le principe, avec une structure c'est plus simple. Pour les étudiants ils doivent modifier dans tous leurs tableaux&amp;lt;br&amp;gt;&lt;br /&gt;
Voir code ci-dessus.&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
Formule vue en TP mesure analogique de la thermistance &amp;lt;br&amp;gt;&lt;br /&gt;
θ = 1 / ( 1/T25 + (1/β)·ln(Rθ / R25) ) &amp;lt;br&amp;gt;&lt;br /&gt;
Ici le principe pour tenir compte de la température dans la mesure de distance.&amp;lt;br&amp;gt;&lt;br /&gt;
Il est intéressant de faire afficher la température sans et avec la correction de température.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  float Vθ = analogRead(A0)*(5.0 / 1023.0);&lt;br /&gt;
  float Rθ=R1*Vθ/(Vcc-Vθ);&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm(1 / ( 1/T25 + (1/β)*ln(Rθ / R25) ));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  void modeAuto() {&lt;br /&gt;
  //void setup(){&lt;br /&gt;
  static bool auto = 0;&lt;br /&gt;
  pinMode(bpHaut, INPUT);  // l'entrée D3 est à 1 quand le BP est relaché&lt;br /&gt;
  pinMode(bpBas, INPUT);&lt;br /&gt;
  pinMode(L1, OUTPUT);  // la led s'allume quand la sortie D5 est à 1&lt;br /&gt;
  pinMode(L2, OUTPUT);&lt;br /&gt;
  //}&lt;br /&gt;
  //void loop() {&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm();&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(bpHaut)) {&lt;br /&gt;
    auto = 1;  // enclenchement mode automatique    &lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);  // blinkLED to run every 0.5 seconds&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (auto) {&lt;br /&gt;
    ledsColor();&lt;br /&gt;
    //distance = 70;&lt;br /&gt;
    if ((!digitalRead(bpHaut) &amp;amp;&amp;amp; (distance &amp;gt; 25)) | (distance &amp;gt; 60)) {&lt;br /&gt;
      digitalWrite(L1, turnOn);&lt;br /&gt;
    }&lt;br /&gt;
    if (distance &amp;lt; 10) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
    if (!digitalRead(bpBas)) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
      auto = 0;  // déclenchement mode automatique&lt;br /&gt;
      Timer1.detachInterrupt();&lt;br /&gt;
      digitalWrite(L2, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  //}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(L2, !digitalRead(L2));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20707</id>
		<title>Cours:Sujet2Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20707"/>
				<updated>2026-01-16T14:42:21Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut '''start arduino''' qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le comptage commence à 1 et pas à 0 &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que ça boucle plus de 1,5 secondes &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le chiffre soit dans la continuïté; pas sur la ligne dessous '''boucle n°:1'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int i = 1;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;start arduino&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  Serial.print(&amp;quot;boucle n°:&amp;quot;);&lt;br /&gt;
  Serial.println(i++);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
La déclaration des pins d'entrée/sortie n'est pas obligatoire&amp;lt;br&amp;gt;&lt;br /&gt;
Il faut le BP du haut et la led de gauche&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : si on appuie sur le BP la led s'allume et s'éteint si on relache le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int buttonPin = 3;  // the number of the pushbutton pin&lt;br /&gt;
const int ledPin = 5;     // the number of the LED pin&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledPin,   OUTPUT);    // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(buttonPin, INPUT);  // initialize the pushbutton pin as an input:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
   // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(buttonPin)) {    &lt;br /&gt;
    digitalWrite(ledPin, LOW);  // turn LED off:&lt;br /&gt;
  } else {    &lt;br /&gt;
    digitalWrite(ledPin, HIGH); // turn LED on:&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
la librairie donne la distance en centimètre, il faut convertir la distance entre le capteur et la surface du liquide en mètre.&amp;lt;br&amp;gt;&lt;br /&gt;
on utilise une échelle au 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que la librairie HCSR04.h soit incluse sans aucune aide '''#include &amp;lt;HCSR04.h&amp;gt;'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut que les pins 7 triggerPin et 6 echoPin soient déclarées sans aucune aide '''UltraSonicDistanceSensor distanceSensor(7, 6);'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut un délai de 250 ms entre chaque mesure de distance '''delay(250);'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que l'affichage ou la mesure de la hauteur du liquide, que quand la pompe fonctionne&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Si le programme fonctionne à 100 % quand le capteur et proche de l'écran hauteur proche de 10 m quand le capteur à plus d'un mètre de l'écran '''cuve vide''' entre les deux la hauteur en mètre&amp;lt;br&amp;gt;&lt;br /&gt;
ils peuvent utiliser leur mallette pour simuler la surface de l'eau&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define echelle 1 / 10&lt;br /&gt;
#define hauteurCuve 10&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
    float distance = distanceSensor.measureDistanceCm() * echelle * 1.0;&lt;br /&gt;
    if (distance &amp;gt;= hauteurCuve) {&lt;br /&gt;
      Serial.println(&amp;quot;Cuve vide&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      Serial.print(&amp;quot;Hauteur du liquide : &amp;quot;);&lt;br /&gt;
      Serial.println(hauteurCuve - distance);&lt;br /&gt;
    }&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
Les étudiants peuvent utiliser des '''else if ()''' pour faire les paliers.&amp;lt;br&amp;gt; &lt;br /&gt;
J'ai aussi utilisé une structure pour simplifier mais ce n'est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour tester le code j'ai mis hauteur = 3.4; cela me permet de m'affranchir du fonctionnement du capteur à ultrasons. Il suffit de faire varier cette distance de 0 à 10 m pour voir si leur code fonctionne.&amp;lt;br&amp;gt;&lt;br /&gt;
Il y a aussi la solution pour le réglage de la luminosité qui est la question suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define echelle 1 / 10.0&lt;br /&gt;
#define hauteurCuve 10.0&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
// Create an ledStrip object and specify the pin it will use.&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
// Create a buffer for holding the colors (3 bytes per color).&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color tableauCouleurs[nbLeds];&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color c) {&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setAll(Color c) {&lt;br /&gt;
  setRange(0, nbLeds, c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed(float hauteur) {&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  const Color ROUGE = { luminosite*255.0/1023.0, 0, 0 };&lt;br /&gt;
  const Color ORANGE = { luminosite*255.0/1023.0, luminosite*160.0/1023.0, 0 };&lt;br /&gt;
  const Color VERT = { 0, luminosite*255.0/1023.0, 0 };&lt;br /&gt;
  &lt;br /&gt;
  if (hauteur &amp;gt; hauteurCuve * 0.50) {  // cuve pleine à plus de 50%&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (hauteur &amp;gt; hauteurCuve * 0.20) {  // cuve pleine à plus de 20%&lt;br /&gt;
    int nbVert = (hauteur - hauteurCuve * 0.20) * nbLeds / (hauteurCuve * (0.50 - 0.20));&lt;br /&gt;
    int nbOrange = 8 - nbVert;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {  // cuve vide à plus de 80%&lt;br /&gt;
    int nbOrange = hauteur * nbLeds / (hauteurCuve * 0.20);&lt;br /&gt;
    int nbRouge = 8 - nbOrange;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float hauteur = hauteurCuve - (distanceSensor.measureDistanceCm() * echelle * 1.0);&lt;br /&gt;
  hauteur = 3.4;  // pour tester le code&lt;br /&gt;
  if (hauteur &amp;gt; 0) {&lt;br /&gt;
    affichageLed(hauteur);&lt;br /&gt;
    Serial.println(hauteur);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
Ici juste le principe, avec une structure c'est plus simple. Pour les étudiants ils doivent modifier dans tous leurs tableaux&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  int sensorValue = analogRead(A0);  // valeur entre 0 et 1023&lt;br /&gt;
&lt;br /&gt;
  const Color ROUGE = { 255 * sensorValue / 1023.0, 0, 0 };&lt;br /&gt;
  const Color ORANGE = { 255 * sensorValue / 1023.0, 80 * sensorValue / 1023.0, 0 };&lt;br /&gt;
  const Color VERT = { 0, 255 * sensorValue / 1023.0, 0 };&lt;br /&gt;
  const Color OFF = { 0, 0, 0 };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
Formule vue en TP mesure analogique de la thermistance &amp;lt;br&amp;gt;&lt;br /&gt;
θ = 1 / ( 1/T25 + (1/β)·ln(Rθ / R25) ) &amp;lt;br&amp;gt;&lt;br /&gt;
Ici le principe pour tenir compte de la température dans la mesure de distance.&amp;lt;br&amp;gt;&lt;br /&gt;
Il est intéressant de faire afficher la température sans et avec la correction de température.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  float Vθ = analogRead(A0)*(5.0 / 1023.0);&lt;br /&gt;
  float Rθ=R1*Vθ/(Vcc-Vθ);&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm(1 / ( 1/T25 + (1/β)*ln(Rθ / R25) ));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  void modeAuto() {&lt;br /&gt;
  //void setup(){&lt;br /&gt;
  static bool auto = 0;&lt;br /&gt;
  pinMode(bpHaut, INPUT);  // l'entrée D3 est à 1 quand le BP est relaché&lt;br /&gt;
  pinMode(bpBas, INPUT);&lt;br /&gt;
  pinMode(L1, OUTPUT);  // la led s'allume quand la sortie D5 est à 1&lt;br /&gt;
  pinMode(L2, OUTPUT);&lt;br /&gt;
  //}&lt;br /&gt;
  //void loop() {&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm();&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(bpHaut)) {&lt;br /&gt;
    auto = 1;  // enclenchement mode automatique    &lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);  // blinkLED to run every 0.5 seconds&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (auto) {&lt;br /&gt;
    ledsColor();&lt;br /&gt;
    //distance = 70;&lt;br /&gt;
    if ((!digitalRead(bpHaut) &amp;amp;&amp;amp; (distance &amp;gt; 25)) | (distance &amp;gt; 60)) {&lt;br /&gt;
      digitalWrite(L1, turnOn);&lt;br /&gt;
    }&lt;br /&gt;
    if (distance &amp;lt; 10) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
    if (!digitalRead(bpBas)) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
      auto = 0;  // déclenchement mode automatique&lt;br /&gt;
      Timer1.detachInterrupt();&lt;br /&gt;
      digitalWrite(L2, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  //}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(L2, !digitalRead(L2));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20706</id>
		<title>Cours:Sujet2Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet2Correction&amp;diff=20706"/>
				<updated>2026-01-16T14:41:39Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut '''start arduino''' qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le comptage commence à 1 et pas à 0 &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que ça boucle plus de 1,5 secondes &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que le chiffre soit dans la continuïté; pas sur la ligne dessous '''boucle n°:1'''&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
int i = 1;&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;start arduino&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  Serial.print(&amp;quot;boucle n°:&amp;quot;);&lt;br /&gt;
  Serial.println(i++);&lt;br /&gt;
  delay(500);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
La déclaration des pins d'entrée/sortie n'est pas obligatoire&amp;lt;br&amp;gt;&lt;br /&gt;
Il faut le BP du haut et la led de gauche&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : si on appuie sur le BP la led s'allume et s'éteint si on relache le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
const int buttonPin = 3;  // the number of the pushbutton pin&lt;br /&gt;
const int ledPin = 5;     // the number of the LED pin&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledPin,   OUTPUT);    // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(buttonPin, INPUT);  // initialize the pushbutton pin as an input:&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
   // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(buttonPin)) {    &lt;br /&gt;
    digitalWrite(ledPin, LOW);  // turn LED off:&lt;br /&gt;
  } else {    &lt;br /&gt;
    digitalWrite(ledPin, HIGH); // turn LED on:&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
la librairie donne la distance en centimètre, il faut convertir la distance entre le capteur et la surface du liquide en mètre.&amp;lt;br&amp;gt;&lt;br /&gt;
on utilise une échelle au 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que la librairie HCSR04.h soit incluse sans aucune aide '''#include &amp;lt;HCSR04.h&amp;gt;'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut que les pins 7 triggerPin et 6 echoPin soient déclarées sans aucune aide '''UltraSonicDistanceSensor distanceSensor(7, 6);'''&amp;lt;br&amp;gt;&lt;br /&gt;
il faut un délai de 250 ms entre chaque mesure de distance '''delay(250);'''&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut que l'affichage ou la mesure de la hauteur du liquide, que quand la pompe fonctionne&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Si le programme fonctionne à 100 % quand le capteur et proche de l'écran hauteur proche de 10 m quand le capteur à plus d'un mètre de l'écran '''cuve vide''' entre les deux la hauteur en mètre&amp;lt;br&amp;gt;&lt;br /&gt;
ils peuvent utiliser leur mallette pour simuler la surface de l'eau&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#define echelle 1 / 10&lt;br /&gt;
#define hauteurCuve 10&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  // check if the pushbutton is pressed. If it is, the buttonState is HIGH:&lt;br /&gt;
  if (digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
    float distance = distanceSensor.measureDistanceCm() * echelle * 1.0;&lt;br /&gt;
    if (distance &amp;gt;= hauteurCuve) {&lt;br /&gt;
      Serial.println(&amp;quot;Cuve vide&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      Serial.print(&amp;quot;Hauteur du liquide : &amp;quot;);&lt;br /&gt;
      Serial.println(hauteurCuve - distance);&lt;br /&gt;
    }&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
Les étudiants peuvent utiliser des '''else if ()''' pour faire les paliers.&amp;lt;br&amp;gt; &lt;br /&gt;
J'ai aussi utilisé une structure pour simplifier mais ce n'est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
Pour tester le code j'ai mis distance = 1.5; cela me permet de m'affranchir du fonctionnement du capteur à ultrasons. Il suffit de faire varier cette distance de 0 à 10 m pour voir si leur code fonctionne.&amp;lt;br&amp;gt;&lt;br /&gt;
Il y a aussi la solution pour le réglage de la luminosité qui est la question suivante.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define echelle 1 / 10.0&lt;br /&gt;
#define hauteurCuve 10.0&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 triggerPin and 6 echoPin.&lt;br /&gt;
&lt;br /&gt;
// Create an ledStrip object and specify the pin it will use.&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
// Create a buffer for holding the colors (3 bytes per color).&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color tableauCouleurs[nbLeds];&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color c) {&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setAll(Color c) {&lt;br /&gt;
  setRange(0, nbLeds, c);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed(float hauteur) {&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  const Color ROUGE = { luminosite*255.0/1023.0, 0, 0 };&lt;br /&gt;
  const Color ORANGE = { luminosite*255.0/1023.0, luminosite*160.0/1023.0, 0 };&lt;br /&gt;
  const Color VERT = { 0, luminosite*255.0/1023.0, 0 };&lt;br /&gt;
  &lt;br /&gt;
  if (hauteur &amp;gt; hauteurCuve * 0.50) {  // cuve pleine à plus de 50%&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (hauteur &amp;gt; hauteurCuve * 0.20) {  // cuve pleine à plus de 20%&lt;br /&gt;
    int nbVert = (hauteur - hauteurCuve * 0.20) * nbLeds / (hauteurCuve * (0.50 - 0.20));&lt;br /&gt;
    int nbOrange = 8 - nbVert;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {  // cuve vide à plus de 80%&lt;br /&gt;
    int nbOrange = hauteur * nbLeds / (hauteurCuve * 0.20);&lt;br /&gt;
    int nbRouge = 8 - nbOrange;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(5, OUTPUT);  // initialize the LED pin as an output:&lt;br /&gt;
  pinMode(3, INPUT);   // initialize the pushbutton pin as an input:&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(3)) {&lt;br /&gt;
    digitalWrite(5, HIGH);  // turn LED on:&lt;br /&gt;
  } else {&lt;br /&gt;
    digitalWrite(5, LOW);  // turn LED off:&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  float hauteur = hauteurCuve - (distanceSensor.measureDistanceCm() * echelle * 1.0);&lt;br /&gt;
  hauteur = 3.4;  // pour tester le code&lt;br /&gt;
  if (hauteur &amp;gt; 0) {&lt;br /&gt;
    affichageLed(hauteur);&lt;br /&gt;
    Serial.println(hauteur);&lt;br /&gt;
    delay(250);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
Ici juste le principe, avec une structure c'est plus simple. Pour les étudiants ils doivent modifier dans tous leurs tableaux&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void loop() {&lt;br /&gt;
  int sensorValue = analogRead(A0);  // valeur entre 0 et 1023&lt;br /&gt;
&lt;br /&gt;
  const Color ROUGE = { 255 * sensorValue / 1023.0, 0, 0 };&lt;br /&gt;
  const Color ORANGE = { 255 * sensorValue / 1023.0, 80 * sensorValue / 1023.0, 0 };&lt;br /&gt;
  const Color VERT = { 0, 255 * sensorValue / 1023.0, 0 };&lt;br /&gt;
  const Color OFF = { 0, 0, 0 };&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
Formule vue en TP mesure analogique de la thermistance &amp;lt;br&amp;gt;&lt;br /&gt;
θ = 1 / ( 1/T25 + (1/β)·ln(Rθ / R25) ) &amp;lt;br&amp;gt;&lt;br /&gt;
Ici le principe pour tenir compte de la température dans la mesure de distance.&amp;lt;br&amp;gt;&lt;br /&gt;
Il est intéressant de faire afficher la température sans et avec la correction de température.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  float Vθ = analogRead(A0)*(5.0 / 1023.0);&lt;br /&gt;
  float Rθ=R1*Vθ/(Vcc-Vθ);&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm(1 / ( 1/T25 + (1/β)*ln(Rθ / R25) ));&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
  void modeAuto() {&lt;br /&gt;
  //void setup(){&lt;br /&gt;
  static bool auto = 0;&lt;br /&gt;
  pinMode(bpHaut, INPUT);  // l'entrée D3 est à 1 quand le BP est relaché&lt;br /&gt;
  pinMode(bpBas, INPUT);&lt;br /&gt;
  pinMode(L1, OUTPUT);  // la led s'allume quand la sortie D5 est à 1&lt;br /&gt;
  pinMode(L2, OUTPUT);&lt;br /&gt;
  //}&lt;br /&gt;
  //void loop() {&lt;br /&gt;
  float distance = distanceSensor.measureDistanceCm();&lt;br /&gt;
&lt;br /&gt;
  if (!digitalRead(bpHaut)) {&lt;br /&gt;
    auto = 1;  // enclenchement mode automatique    &lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);  // blinkLED to run every 0.5 seconds&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  if (auto) {&lt;br /&gt;
    ledsColor();&lt;br /&gt;
    //distance = 70;&lt;br /&gt;
    if ((!digitalRead(bpHaut) &amp;amp;&amp;amp; (distance &amp;gt; 25)) | (distance &amp;gt; 60)) {&lt;br /&gt;
      digitalWrite(L1, turnOn);&lt;br /&gt;
    }&lt;br /&gt;
    if (distance &amp;lt; 10) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
    if (!digitalRead(bpBas)) {&lt;br /&gt;
      digitalWrite(L1, turnOff);&lt;br /&gt;
      auto = 0;  // déclenchement mode automatique&lt;br /&gt;
      Timer1.detachInterrupt();&lt;br /&gt;
      digitalWrite(L2, turnOff);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  //}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(L2, !digitalRead(L2));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20705</id>
		<title>Cours:InfoS1EvalTP2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20705"/>
				<updated>2026-01-16T13:27:26Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|capteur de niveau}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un capteur de niveau en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur une série de leds l'information de hauteur du liquide contenu dans la cuve.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série. Cette partie est indépendante du capteur de niveau.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;start arduino&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**affiche &amp;quot;boucle n°:&amp;quot;&lt;br /&gt;
**incrémente une variable à chaque boucle et affiche sa valeur&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage au bout de 1,5s :''' &lt;br /&gt;
&lt;br /&gt;
 start arduino&lt;br /&gt;
 boucle n°:1&lt;br /&gt;
 boucle n°:2&lt;br /&gt;
 boucle n°:3&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
&lt;br /&gt;
Pour démarrer la pompe de remplissage de la cuve, on utilise un bouton poussoir. Cela permet également d'allumer le voyant signalant le fonctionnement de la pompe.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer si la pompe est en fonctionnement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Réaliser le programme permettant d'allumer la led pour indiquer le fonctionnement de la pompe lorsqu'on appuie sur le bouton. Dans un premier temps, quand on relâche le bouton la pompe s'arrête.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifiez votre programme pour effectuer une mesure de la hauteur du liquide (cuve vide... 10 m) toutes les {{Rouge|250 ms}} lorsque la pompe est en {{Rouge|marche manuelle}}.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
La cuve, lorsqu'elle est vide, a une hauteur de 10 mètres. Afin de tester votre programme plus facilement, nous utiliserons une échelle réduite de 1/10, soit 1 mètre pour 10 mètres.&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
&lt;br /&gt;
Vous allez utiliser les leds de couleurs que vous avez utilisées pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
&lt;br /&gt;
On affichera une information de hauteur de la façon suivante sur les LEDs :&lt;br /&gt;
*si la cuve est pleine à plus de 50%, on allume les 8 LEDs en vert.&lt;br /&gt;
*si la cuve est pleine à plus de 20% à 50% on allumera les LEDs en orange de façon proportionnelle.&lt;br /&gt;
:: 50% 8 LEDs en vert&lt;br /&gt;
:: 35% 4 LEDs en vert et 4 LEDs en orange&lt;br /&gt;
:: 20% 8 LEDx en orange&lt;br /&gt;
*si la cuve est pleine à moins de 20%&lt;br /&gt;
:: la cuve est vide 8 LEDs en rouge&lt;br /&gt;
:: 10% 4 LEDs en rouge et 4 LEDs en orange&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
L'appui sur le BP du haut démarre la pompe en mode automatique, l'appui sur le BP du bas (broche 2) arrête la pompe et le mode automatique. Quand la distance d &amp;lt; 1 m la pompe s'arrête automatiquement et ne peut pas redémarrer avec le BP du Haut tant que la distance d &amp;lt; 2.5 m. Si d &amp;gt; 6 m alors la pompe de remplissage démarre.&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement (watchdog), on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour le mode automatique et faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&amp;lt;br&amp;gt;&lt;br /&gt;
Vous pourrez utiliser l'instruction '''Timer1.detachInterrupt()''' quand le mode automatique est à l'arrêt.&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20704</id>
		<title>Cours:InfoS1EvalTP2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20704"/>
				<updated>2026-01-16T13:25:54Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|capteur de niveau}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un capteur de niveau en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur une série de leds l'information de hauteur du liquide contenu dans la cuve.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série. Cette partie est indépendante du capteur de niveau.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;start arduino&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**affiche &amp;quot;boucle n°:&amp;quot;&lt;br /&gt;
**incrémente une variable à chaque boucle et affiche sa valeur&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage au bout de 1,5s :''' &lt;br /&gt;
&lt;br /&gt;
 start arduino&lt;br /&gt;
 boucle n°:1&lt;br /&gt;
 boucle n°:2&lt;br /&gt;
 boucle n°:3&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
&lt;br /&gt;
Pour démarrer la pompe de remplissage de la cuve, on utilise un bouton poussoir. Cela permet également d'allumer le voyant signalant le fonctionnement de la pompe.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer si la pompe est en fonctionnement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Réaliser le programme permettant d'allumer la led pour indiquer le fonctionnement de la pompe lorsqu'on appuie sur le bouton. Dans un premier temps, quand on relâche le bouton la pompe s'arrête.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifiez votre programme pour effectuer une mesure de la hauteur du liquide (cuve vide... 10 m) toutes les {{Rouge|250 ms}} lorsque la pompe est en {{Rouge|marche manuelle}}.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
La cuve, lorsqu'elle est vide, a une hauteur de 10 mètres. Afin de tester votre programme plus facilement, nous utiliserons une échelle réduite de 1/10, soit 1 mètre pour 10 mètres.&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
&lt;br /&gt;
Vous allez utiliser les leds de couleurs que vous avez utilisées pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
&lt;br /&gt;
On affichera une information de hauteur de la façon suivante sur les LEDs :&lt;br /&gt;
*si la cuve est pleine à plus de 50%, on allume les 8 LEDs en vert.&lt;br /&gt;
*si la cuve est pleine à plus de 20% à 50% on allumera les LEDs en orange de façon proportionnelle.&lt;br /&gt;
:: 50% 8 LEDs en vert&lt;br /&gt;
:: 35% 4 LEDs en vert et 4 LEDs en orange&lt;br /&gt;
:: 20% 8 LEDx en orange&lt;br /&gt;
*si la cuve est pleine à moins de 20%&lt;br /&gt;
:: la cuve est vide 8 LEDs en rouge&lt;br /&gt;
:: 10% 4 LEDs en rouge et 4 LEDs en orange&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Ecrire un programme réalisant ce fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
L'appui sur le BP du haut démarre la pompe en mode automatique, l'appui sur le BP du bas (broche 2) arrête la pompe et le mode automatique. Quand la distance d &amp;lt; 1 m la pompe s'arrête automatiquement et ne peut pas redémarrer avec le BP du Haut tant que la distance d &amp;lt; 2.5 m. Si d &amp;gt; 6 m alors la pompe de remplissage démarre.&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement (watchdog), on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour le mode automatique et faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&amp;lt;br&amp;gt;&lt;br /&gt;
Vous pourrez utiliser l'instruction '''Timer1.detachInterrupt()''' quand le mode automatique est à l'arrêt.&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20703</id>
		<title>Cours:InfoS1EvalTP2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20703"/>
				<updated>2026-01-16T13:21:05Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|capteur de niveau}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un capteur de niveau en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur une série de leds l'information de hauteur du liquide contenu dans la cuve.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série. Cette partie est indépendante du capteur de niveau.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;start arduino&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**affiche &amp;quot;boucle n°:&amp;quot;&lt;br /&gt;
**incrémente une variable à chaque boucle et affiche sa valeur&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage au bout de 1,5s :''' &lt;br /&gt;
&lt;br /&gt;
 start arduino&lt;br /&gt;
 boucle n°:1&lt;br /&gt;
 boucle n°:2&lt;br /&gt;
 boucle n°:3&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
&lt;br /&gt;
Pour démarrer la pompe de remplissage de la cuve, on utilise un bouton poussoir. Cela permet également d'allumer le voyant signalant le fonctionnement de la pompe.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer si la pompe est en fonctionnement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Réaliser le programme permettant d'allumer la led pour indiquer le fonctionnement de la pompe lorsqu'on appuie sur le bouton. Dans un premier temps, quand on relâche le bouton la pompe s'arrête.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifiez votre programme pour effectuer une mesure de la hauteur du liquide (cuve vide... 10 m) toutes les {{Rouge|250 ms}} lorsque la pompe est en {{Rouge|marche manuelle}}.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
La cuve, lorsqu'elle est vide, a une hauteur de 10 mètres. Afin de tester votre programme plus facilement, nous utiliserons une échelle réduite de 1/10, soit 1 mètre pour 10 mètres.&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
&lt;br /&gt;
Vous allez utiliser les leds de couleurs que vous avez utilisées pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
&lt;br /&gt;
On affichera une information de hauteur de la façon suivante sur les LEDs :&lt;br /&gt;
*si la cuve est pleine à plus de 50%, on allume les 8 LEDs en vert.&lt;br /&gt;
*si la cuve est pleine de 20% à 50% on allumera les LEDs en orange de façon proportionnelle.&lt;br /&gt;
:: 50% 8 LEDs en vert&lt;br /&gt;
:: 35% 4 LEDs en vert et 4 LEDs en orange&lt;br /&gt;
:: 20% 8 LEDx en orange&lt;br /&gt;
*si la hauteur est faible ( d &amp;lt; 6m ) on allumera des leds de la façon suivante :&lt;br /&gt;
**entre 5.5 et 6.0  : 7 en orange, 1 en vert&lt;br /&gt;
**entre 5.0 et 5.5  : 6 en orange, 2 en vert&lt;br /&gt;
**entre 4.5 et 5.0  : 5 en orange, 3 en vert&lt;br /&gt;
**entre 4.0 et 4.5  : 4 en orange, 4 en vert&lt;br /&gt;
**entre 3.5 et 4.0  : 3 en orange, 5 en vert&lt;br /&gt;
**entre 3.0 et 3.5  : 2 en orange, 6 en vert&lt;br /&gt;
**entre 2.5 et 3.0  : 1 en orange, 7 en vert&lt;br /&gt;
**moins de 2.5      : 0 en orange, 8 en vert&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Ecrire un programme réalisant ce fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
L'appui sur le BP du haut démarre la pompe en mode automatique, l'appui sur le BP du bas (broche 2) arrête la pompe et le mode automatique. Quand la distance d &amp;lt; 1 m la pompe s'arrête automatiquement et ne peut pas redémarrer avec le BP du Haut tant que la distance d &amp;lt; 2.5 m. Si d &amp;gt; 6 m alors la pompe de remplissage démarre.&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement (watchdog), on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour le mode automatique et faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&amp;lt;br&amp;gt;&lt;br /&gt;
Vous pourrez utiliser l'instruction '''Timer1.detachInterrupt()''' quand le mode automatique est à l'arrêt.&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20702</id>
		<title>Cours:InfoS1EvalTP2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20702"/>
				<updated>2026-01-16T13:20:31Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|capteur de niveau}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un capteur de niveau en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur une série de leds l'information de hauteur du liquide contenu dans la cuve.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série. Cette partie est indépendante du capteur de niveau.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;start arduino&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**affiche &amp;quot;boucle n°:&amp;quot;&lt;br /&gt;
**incrémente une variable à chaque boucle et affiche sa valeur&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage au bout de 1,5s :''' &lt;br /&gt;
&lt;br /&gt;
 start arduino&lt;br /&gt;
 boucle n°:1&lt;br /&gt;
 boucle n°:2&lt;br /&gt;
 boucle n°:3&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
&lt;br /&gt;
Pour démarrer la pompe de remplissage de la cuve, on utilise un bouton poussoir. Cela permet également d'allumer le voyant signalant le fonctionnement de la pompe.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer si la pompe est en fonctionnement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Réaliser le programme permettant d'allumer la led pour indiquer le fonctionnement de la pompe lorsqu'on appuie sur le bouton. Dans un premier temps, quand on relâche le bouton la pompe s'arrête.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifiez votre programme pour effectuer une mesure de la hauteur du liquide (cuve vide... 10 m) toutes les {{Rouge|250 ms}} lorsque la pompe est en {{Rouge|marche manuelle}}.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
La cuve, lorsqu'elle est vide, a une hauteur de 10 mètres. Afin de tester votre programme plus facilement, nous utiliserons une échelle réduite de 1/10, soit 1 mètre pour 10 mètres.&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
&lt;br /&gt;
Vous allez utiliser les leds de couleurs que vous avez utilisées pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
&lt;br /&gt;
On affichera une information de hauteur de la façon suivante sur les LEDs :&lt;br /&gt;
*si la cuve est pleine à plus de 50%, on allume les 8 LEDs en vert.&lt;br /&gt;
*si la cuve est pleine de 20% à 50% on allumera les LEDs en orange de façon proportionnelle.&lt;br /&gt;
:: 50% 8 LEDs en vert&lt;br /&gt;
:: 35% 4 LESs en vert et 4 LEDs en orange&lt;br /&gt;
:: 20% 8 LESx en orange&lt;br /&gt;
*si la hauteur est faible ( d &amp;lt; 6m ) on allumera des leds de la façon suivante :&lt;br /&gt;
**entre 5.5 et 6.0  : 7 en orange, 1 en vert&lt;br /&gt;
**entre 5.0 et 5.5  : 6 en orange, 2 en vert&lt;br /&gt;
**entre 4.5 et 5.0  : 5 en orange, 3 en vert&lt;br /&gt;
**entre 4.0 et 4.5  : 4 en orange, 4 en vert&lt;br /&gt;
**entre 3.5 et 4.0  : 3 en orange, 5 en vert&lt;br /&gt;
**entre 3.0 et 3.5  : 2 en orange, 6 en vert&lt;br /&gt;
**entre 2.5 et 3.0  : 1 en orange, 7 en vert&lt;br /&gt;
**moins de 2.5      : 0 en orange, 8 en vert&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Ecrire un programme réalisant ce fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
L'appui sur le BP du haut démarre la pompe en mode automatique, l'appui sur le BP du bas (broche 2) arrête la pompe et le mode automatique. Quand la distance d &amp;lt; 1 m la pompe s'arrête automatiquement et ne peut pas redémarrer avec le BP du Haut tant que la distance d &amp;lt; 2.5 m. Si d &amp;gt; 6 m alors la pompe de remplissage démarre.&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement (watchdog), on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour le mode automatique et faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&amp;lt;br&amp;gt;&lt;br /&gt;
Vous pourrez utiliser l'instruction '''Timer1.detachInterrupt()''' quand le mode automatique est à l'arrêt.&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20701</id>
		<title>Cours:InfoS1EvalTP2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20701"/>
				<updated>2026-01-16T13:20:08Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|capteur de niveau}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un capteur de niveau en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur une série de leds l'information de hauteur du liquide contenu dans la cuve.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série. Cette partie est indépendante du capteur de niveau.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;start arduino&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**affiche &amp;quot;boucle n°:&amp;quot;&lt;br /&gt;
**incrémente une variable à chaque boucle et affiche sa valeur&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage au bout de 1,5s :''' &lt;br /&gt;
&lt;br /&gt;
 start arduino&lt;br /&gt;
 boucle n°:1&lt;br /&gt;
 boucle n°:2&lt;br /&gt;
 boucle n°:3&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
&lt;br /&gt;
Pour démarrer la pompe de remplissage de la cuve, on utilise un bouton poussoir. Cela permet également d'allumer le voyant signalant le fonctionnement de la pompe.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer si la pompe est en fonctionnement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Réaliser le programme permettant d'allumer la led pour indiquer le fonctionnement de la pompe lorsqu'on appuie sur le bouton. Dans un premier temps, quand on relâche le bouton la pompe s'arrête.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifiez votre programme pour effectuer une mesure de la hauteur du liquide (cuve vide... 10 m) toutes les {{Rouge|250 ms}} lorsque la pompe est en {{Rouge|marche manuelle}}.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
La cuve, lorsqu'elle est vide, a une hauteur de 10 mètres. Afin de tester votre programme plus facilement, nous utiliserons une échelle réduite de 1/10, soit 1 mètre pour 10 mètres.&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
&lt;br /&gt;
Vous allez utiliser les leds de couleurs que vous avez utilisées pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
&lt;br /&gt;
On affichera une information de hauteur de la façon suivante sur les leds :&lt;br /&gt;
*si la cuve est pleine à plus de 50%, on allume les 8 LEDs en vert.&lt;br /&gt;
*si la cuve est pleine de 20% à 50% on allumera les LEDs en orange de façon proportionnelle.&lt;br /&gt;
:: 50% 8 LEDs en vert&lt;br /&gt;
:: 35% 4 LESs en vert et 4 LEDs en orange&lt;br /&gt;
:: 20% 8 LESx en orange&lt;br /&gt;
*si la hauteur est faible ( d &amp;lt; 6m ) on allumera des leds de la façon suivante :&lt;br /&gt;
**entre 5.5 et 6.0  : 7 en orange, 1 en vert&lt;br /&gt;
**entre 5.0 et 5.5  : 6 en orange, 2 en vert&lt;br /&gt;
**entre 4.5 et 5.0  : 5 en orange, 3 en vert&lt;br /&gt;
**entre 4.0 et 4.5  : 4 en orange, 4 en vert&lt;br /&gt;
**entre 3.5 et 4.0  : 3 en orange, 5 en vert&lt;br /&gt;
**entre 3.0 et 3.5  : 2 en orange, 6 en vert&lt;br /&gt;
**entre 2.5 et 3.0  : 1 en orange, 7 en vert&lt;br /&gt;
**moins de 2.5      : 0 en orange, 8 en vert&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Ecrire un programme réalisant ce fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
L'appui sur le BP du haut démarre la pompe en mode automatique, l'appui sur le BP du bas (broche 2) arrête la pompe et le mode automatique. Quand la distance d &amp;lt; 1 m la pompe s'arrête automatiquement et ne peut pas redémarrer avec le BP du Haut tant que la distance d &amp;lt; 2.5 m. Si d &amp;gt; 6 m alors la pompe de remplissage démarre.&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement (watchdog), on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour le mode automatique et faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&amp;lt;br&amp;gt;&lt;br /&gt;
Vous pourrez utiliser l'instruction '''Timer1.detachInterrupt()''' quand le mode automatique est à l'arrêt.&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20700</id>
		<title>Cours:InfoS1EvalTP2</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP2&amp;diff=20700"/>
				<updated>2026-01-16T13:19:08Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Leds couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|capteur de niveau}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un capteur de niveau en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur une série de leds l'information de hauteur du liquide contenu dans la cuve.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série. Cette partie est indépendante du capteur de niveau.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;start arduino&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**affiche &amp;quot;boucle n°:&amp;quot;&lt;br /&gt;
**incrémente une variable à chaque boucle et affiche sa valeur&lt;br /&gt;
**attendre 500ms&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage au bout de 1,5s :''' &lt;br /&gt;
&lt;br /&gt;
 start arduino&lt;br /&gt;
 boucle n°:1&lt;br /&gt;
 boucle n°:2&lt;br /&gt;
 boucle n°:3&lt;br /&gt;
&lt;br /&gt;
=Marche manuelle=&lt;br /&gt;
&lt;br /&gt;
Pour démarrer la pompe de remplissage de la cuve, on utilise un bouton poussoir. Cela permet également d'allumer le voyant signalant le fonctionnement de la pompe.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer si la pompe est en fonctionnement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Réaliser le programme permettant d'allumer la led pour indiquer le fonctionnement de la pompe lorsqu'on appuie sur le bouton. Dans un premier temps, quand on relâche le bouton la pompe s'arrête.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifiez votre programme pour effectuer une mesure de la hauteur du liquide (cuve vide... 10 m) toutes les {{Rouge|250 ms}} lorsque la pompe est en {{Rouge|marche manuelle}}.}}&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
La cuve, lorsqu'elle est vide, a une hauteur de 10 mètres. Afin de tester votre programme plus facilement, nous utiliserons une échelle réduite de 1/10, soit 1 mètre pour 10 mètres.&lt;br /&gt;
&lt;br /&gt;
=Leds couleur=&lt;br /&gt;
&lt;br /&gt;
Vous allez utiliser les leds de couleurs que vous avez utilisées pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
&lt;br /&gt;
On affichera une information de hauteur de la façon suivante sur les leds :&lt;br /&gt;
*si la cuve est pleine à plus de 50%, on allume les 8 LEDs en vert.&lt;br /&gt;
*si la cuve est pleine de 20% à 50% on allumera les LEDs en orange de façon proportionnelle.&lt;br /&gt;
-- 50% 8 LEDs en vert&lt;br /&gt;
-- 35% 4 LESs en vert et 4 LEDs en orange&lt;br /&gt;
-- 20% 8 LESx en orange&lt;br /&gt;
*si la hauteur est faible ( d &amp;lt; 6m ) on allumera des leds de la façon suivante :&lt;br /&gt;
**entre 5.5 et 6.0  : 7 en orange, 1 en vert&lt;br /&gt;
**entre 5.0 et 5.5  : 6 en orange, 2 en vert&lt;br /&gt;
**entre 4.5 et 5.0  : 5 en orange, 3 en vert&lt;br /&gt;
**entre 4.0 et 4.5  : 4 en orange, 4 en vert&lt;br /&gt;
**entre 3.5 et 4.0  : 3 en orange, 5 en vert&lt;br /&gt;
**entre 3.0 et 3.5  : 2 en orange, 6 en vert&lt;br /&gt;
**entre 2.5 et 3.0  : 1 en orange, 7 en vert&lt;br /&gt;
**moins de 2.5      : 0 en orange, 8 en vert&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Ecrire un programme réalisant ce fonctionnement}}&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des leds=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
L'appui sur le BP du haut démarre la pompe en mode automatique, l'appui sur le BP du bas (broche 2) arrête la pompe et le mode automatique. Quand la distance d &amp;lt; 1 m la pompe s'arrête automatiquement et ne peut pas redémarrer avec le BP du Haut tant que la distance d &amp;lt; 2.5 m. Si d &amp;gt; 6 m alors la pompe de remplissage démarre.&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement (watchdog), on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour le mode automatique et faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&amp;lt;br&amp;gt;&lt;br /&gt;
Vous pourrez utiliser l'instruction '''Timer1.detachInterrupt()''' quand le mode automatique est à l'arrêt.&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20699</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20699"/>
				<updated>2026-01-16T13:10:14Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* LEDs couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|4|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|4|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20698</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20698"/>
				<updated>2026-01-16T13:09:58Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Marche arrière */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|4|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20697</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20697"/>
				<updated>2026-01-16T13:09:22Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20696</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20696"/>
				<updated>2026-01-16T13:09:10Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;br /&gt;
==&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20695</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20695"/>
				<updated>2026-01-16T13:08:42Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!==&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;br /&gt;
==&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20694</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20694"/>
				<updated>2026-01-16T13:07:41Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Système alive */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!== =Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;br /&gt;
==&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20693</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20693"/>
				<updated>2026-01-16T13:06:57Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
L'utilisation d'une structure pour les couleurs simplifie le réglage de la luminoisité. L'utilisation d'une structure n'est pas demandée.&amp;lt;br&amp;gt;&lt;br /&gt;
Il ne faut pas oublier de mettre les nombres en flotant (luminosite * 255.0/1023.0).&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : La luminosité change avec le potentiomètre.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0*luminosite/1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0*luminosite/1023.0, 160.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
{{Rouge|'''50%'''}} : Le calcul de la température de la thermistance.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : Affichage des distances avec et sans tenir compte de la température.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
#define R1 12000&lt;br /&gt;
#define Vcc 5.0&lt;br /&gt;
#define beta 3480.0&lt;br /&gt;
#define r25 8200.0&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float Vtheta = analogRead(A0) * (5.0 / 1023.0);&lt;br /&gt;
  float Rtheta = R1 * Vtheta / (Vcc - Vtheta);&lt;br /&gt;
  float temperature = 1 / (1 / (273.15 + 25) + 1 / beta * log(Rtheta / r25)) - 273.15;&lt;br /&gt;
  temperature = -200; // pour tester&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm(temperature);&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
 // distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.print(distance_cm);&lt;br /&gt;
  Serial.print(&amp;quot; &amp;quot;);&lt;br /&gt;
  Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0 * luminosite / 1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0 * luminosite / 1023.0, 160.0 * luminosite / 1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0 * luminosite / 1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20692</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20692"/>
				<updated>2026-01-16T13:04:13Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
L'utilisation d'une structure pour les couleurs simplifie le réglage de la luminoisité. L'utilisation d'une structure n'est pas demandée.&amp;lt;br&amp;gt;&lt;br /&gt;
Il ne faut pas oublier de mettre les nombres en flotant (luminosite * 255.0/1023.0).&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : La luminosité change avec le potentiomètre.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0*luminosite/1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0*luminosite/1023.0, 160.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
L'utilisation d'une structure pour les couleurs simplifie le réglage de la luminoisité. L'utilisation d'une structure n'est pas demandée.&amp;lt;br&amp;gt;&lt;br /&gt;
Il ne faut pas oublier de mettre les nombres en flotant (luminosite * 255.0/1023.0).&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : La luminosité change avec le potentiomètre.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
#define R1 12000&lt;br /&gt;
#define Vcc 5.0&lt;br /&gt;
#define beta 3480.0&lt;br /&gt;
#define r25 8200.0&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float Vtheta = analogRead(A0) * (5.0 / 1023.0);&lt;br /&gt;
  float Rtheta = R1 * Vtheta / (Vcc - Vtheta);&lt;br /&gt;
  float temperature = 1 / (1 / (273.15 + 25) + 1 / beta * log(Rtheta / r25)) - 273.15;&lt;br /&gt;
  temperature = -200; // pour tester&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm(temperature);&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
 // distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.print(distance_cm);&lt;br /&gt;
  Serial.print(&amp;quot; &amp;quot;);&lt;br /&gt;
  Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0 * luminosite / 1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0 * luminosite / 1023.0, 160.0 * luminosite / 1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0 * luminosite / 1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(115200);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20691</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20691"/>
				<updated>2026-01-16T13:02:09Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Amélioration de la précision de mesure : mesure de température */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
* vous afficherez dans le moniteur les distances en centimètre en tenant compte de la température et sans.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20690</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20690"/>
				<updated>2026-01-16T10:26:38Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Contrôle de la luminosité des LEDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
L'utilisation d'une structure pour les couleurs simplifie le réglage de la luminoisité. L'utilisation d'une structure n'est pas demandée.&amp;lt;br&amp;gt;&lt;br /&gt;
Il ne faut pas oublier de mettre les nombres en flotant (luminosite * 255.0/1023.0).&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : La luminosité change avec le potentiomètre.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0*luminosite/1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0*luminosite/1023.0, 160.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20689</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20689"/>
				<updated>2026-01-16T10:25:00Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Contrôle de la luminosité des LEDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
L'utilisation d'une structure pour les couleurs simplifie le réglage de la luminoisité.&amp;lt;br&amp;gt;&lt;br /&gt;
Il ne faut pas oublier de mettre les nombres en flotant (luminosite * 255.0/1023.0).&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''100%'''}} : La luminosité change avec le potentiomètre.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0*luminosite/1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0*luminosite/1023.0, 160.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20688</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20688"/>
				<updated>2026-01-16T10:19:39Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0*luminosite/1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0*luminosite/1023.0, 160.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20687</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20687"/>
				<updated>2026-01-16T10:15:58Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Contrôle de la luminosité des LEDs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
void setAll(Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = .5;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  int luminosite = analogRead(A6);&lt;br /&gt;
  Color ROUGE = { 255.0*luminosite/1023.0, 0, 0 };&lt;br /&gt;
  Color ORANGE = { 255.0*luminosite/1023.0, 160.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color VERT = { 0, 255.0*luminosite/1023.0, 0 };&lt;br /&gt;
  Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    Color BLANK = { 0, 0, 0 };&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);  // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20686</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20686"/>
				<updated>2026-01-16T10:06:29Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20685</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20685"/>
				<updated>2026-01-16T10:04:12Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* LEDs couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
Il faut aider les étudiants sur la dernière ligne (delay(1)) pour que cela fonctionne si besoin.&amp;lt;br&amp;gt;&lt;br /&gt;
Ici, le code a été réalisé en partie avec ChatGPT : il est performant, mais ce niveau de performance n’est pas demandé aux étudiants.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Lorsque l'on n'appuie pas sur le BP de marche arrière les LEDs s'éteignent.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Quand la distance est supérieure à 3 m toutes les leds sont vertes.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : Les LEDs oranges et les LEDs rouges fonctionnent de façon proportionnelle.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : La distance minimale pour que toutes les LEDs rouges soient allumées est donnée.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20684</id>
		<title>Cours:Sujet1Correction</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:Sujet1Correction&amp;diff=20684"/>
				<updated>2026-01-16T09:49:50Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* LEDs couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut &amp;quot;Alphabet&amp;quot; qu'une fois &amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des majuscules&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut une boucle pour l'alphabet des minuscules dans le sens inverse&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''25%'''}} : il faut des sauts de ligne et des sauts à la moitier de l'alphabet&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
void setup() {&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Serial.println(&amp;quot;Alphabet&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {  &lt;br /&gt;
  for (char i='A'; i&amp;lt;='Z'; i++) {&lt;br /&gt;
  if(i=='N') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  for (char i='z'; i&amp;gt;='a'; i--) {&lt;br /&gt;
  if(i=='m') Serial.print(&amp;quot;\n&amp;quot;);  &lt;br /&gt;
  Serial.print(i);&lt;br /&gt;
  }&lt;br /&gt;
  Serial.println(&amp;quot;\n&amp;quot;);&lt;br /&gt;
  delay(2000);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP, cela fonctionne ; quand on relâche, cela s’arrête. Il faut que la LED clignotante s’éteigne, surtout si on relâche le BP alors qu’elle était allumée..&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : le feu de recul s'allume et s'éteint avec le BP&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 8&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);  // Initialize sensor that uses digital pins 7 and 6.&lt;br /&gt;
&lt;br /&gt;
void setup(void) {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Timer1.initialize(500000);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED(void) {&lt;br /&gt;
  digitalWrite(ledBlink, ledState = !ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop(void) {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    Serial.println(distanceSensor.measureDistanceCm());&lt;br /&gt;
    delay(250);&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
{{Rouge|'''50%'''}} : Quand on appuie sur le BP de marche arrière la distance s'affiche dans le moniteur.&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|'''50%'''}} : La difficulté ici est de respecter les 250ms ce qui est impossible sans avoir utilisé la TimerOne&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=c&amp;gt;&lt;br /&gt;
#include &amp;lt;TimerOne.h&amp;gt;&lt;br /&gt;
#include &amp;lt;HCSR04.h&amp;gt;&lt;br /&gt;
#include &amp;lt;PololuLedStrip.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ON 1&lt;br /&gt;
#define OFF 0&lt;br /&gt;
&lt;br /&gt;
#define ledBlink 5&lt;br /&gt;
#define backupLights 13&lt;br /&gt;
#define reverseGear 3&lt;br /&gt;
&lt;br /&gt;
// Ruban WS2812 sur la pin 4&lt;br /&gt;
PololuLedStrip&amp;lt;4&amp;gt; rubanLed;&lt;br /&gt;
&lt;br /&gt;
#define nbLeds 8&lt;br /&gt;
rgb_color leds[nbLeds];&lt;br /&gt;
&lt;br /&gt;
UltraSonicDistanceSensor distanceSensor(7, 6);&lt;br /&gt;
&lt;br /&gt;
struct Color {&lt;br /&gt;
  uint8_t r, g, b;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
const Color ROUGE = { 10, 0, 0 };&lt;br /&gt;
const Color ORANGE = { 25, 16, 0 };&lt;br /&gt;
const Color VERT = { 0, 10, 0 };&lt;br /&gt;
const Color BLANK = { 0, 0, 0 };&lt;br /&gt;
&lt;br /&gt;
void setAll(const Color &amp;amp;c) {&lt;br /&gt;
  for (uint8_t i = 0; i &amp;lt; nbLeds; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// end = non inclus (comme tu l'utilises déjà)&lt;br /&gt;
void setRange(int start, int end, const Color &amp;amp;c) {&lt;br /&gt;
  if (start &amp;lt; 0) start = 0;&lt;br /&gt;
  if (end &amp;gt; nbLeds) end = nbLeds;&lt;br /&gt;
  for (int i = start; i &amp;lt; end; i++) {&lt;br /&gt;
    leds[i] = rgb_color(c.r, c.g, c.b);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void affichageLed() {&lt;br /&gt;
  float distance_cm = distanceSensor.measureDistanceCm();&lt;br /&gt;
  float distance_m = distance_cm / 100.0;&lt;br /&gt;
  distance_m = 0.25;  // pour tester&lt;br /&gt;
  Serial.println(distance_m);&lt;br /&gt;
  delay(250);&lt;br /&gt;
&lt;br /&gt;
  if (distance_m &amp;gt; 3.0 or distance_cm == -1) {  // &amp;gt; 3 m&lt;br /&gt;
    setAll(VERT);&lt;br /&gt;
  } else if (distance_m &amp;gt; 1.0) {  // 1..3 m&lt;br /&gt;
    int nbVert = (int)((distance_m - 1.0) * nbLeds / (3.0 - 1.0));&lt;br /&gt;
    if (nbVert &amp;lt; 0) nbVert = 0;&lt;br /&gt;
    if (nbVert &amp;gt; nbLeds) nbVert = nbLeds;&lt;br /&gt;
    setRange(0, nbVert, VERT);&lt;br /&gt;
    setRange(nbVert, nbLeds, ORANGE);&lt;br /&gt;
  } else {                                      // 0..1 m&lt;br /&gt;
    int nbOrange = (int)(distance_m * nbLeds);  // 0..8&lt;br /&gt;
    if (nbOrange &amp;lt; 0) nbOrange = 0;&lt;br /&gt;
    if (nbOrange &amp;gt; nbLeds) nbOrange = nbLeds;&lt;br /&gt;
    setRange(0, nbOrange, ORANGE);&lt;br /&gt;
    setRange(nbOrange, nbLeds, ROUGE);&lt;br /&gt;
  }&lt;br /&gt;
  rubanLed.write(leds, nbLeds);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int ledState = LOW;&lt;br /&gt;
void blinkLED() {&lt;br /&gt;
  ledState = !ledState;&lt;br /&gt;
  digitalWrite(ledBlink, ledState);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void setup() {&lt;br /&gt;
  pinMode(ledBlink, OUTPUT);&lt;br /&gt;
  pinMode(backupLights, OUTPUT);&lt;br /&gt;
  pinMode(reverseGear, INPUT);&lt;br /&gt;
  Serial.begin(9600);&lt;br /&gt;
  Timer1.initialize(500000);  // 0.5 s&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void loop() {&lt;br /&gt;
  if (!digitalRead(reverseGear)) {&lt;br /&gt;
    Timer1.attachInterrupt(blinkLED);&lt;br /&gt;
    digitalWrite(backupLights, ON);&lt;br /&gt;
    affichageLed();&lt;br /&gt;
  } else {&lt;br /&gt;
    Timer1.detachInterrupt();&lt;br /&gt;
    digitalWrite(ledBlink, OFF);&lt;br /&gt;
    digitalWrite(backupLights, OFF);&lt;br /&gt;
    setAll(BLANK);&lt;br /&gt;
    rubanLed.write(leds, nbLeds);&lt;br /&gt;
    _delay_ms(1);   // nécessaire pour le fct&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20682</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20682"/>
				<updated>2026-01-16T06:59:42Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* Télémètre à ultrasons */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|&amp;lt;u&amp;gt;250ms&amp;lt;/u&amp;gt;}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20680</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20680"/>
				<updated>2026-01-14T06:56:56Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* LEDs couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|250ms}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m, si on la dépasse la distance est égale à -1. Pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20679</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20679"/>
				<updated>2026-01-14T06:55:53Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* LEDs couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|250ms}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]].&amp;lt;br&amp;gt;&lt;br /&gt;
Le télémètre a une portée d'environ 4 m pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
Si on dépasse la portée, la distance est égale à -1.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20678</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20678"/>
				<updated>2026-01-14T06:55:09Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* LEDs couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|250ms}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
Le télémètre a une portée d'environ 4 m pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
Si on dépasse la portée, la distance est égale à -1.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	<entry>
		<id>http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20677</id>
		<title>Cours:InfoS1EvalTP1</title>
		<link rel="alternate" type="text/html" href="http://wikigeii.iut-troyes.univ-reims.fr//index.php?title=Cours:InfoS1EvalTP1&amp;diff=20677"/>
				<updated>2026-01-14T06:53:52Z</updated>
		
		<summary type="html">&lt;p&gt;Penant : /* LEDs couleur */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
&amp;lt;accesscontrol&amp;gt;Acces:Prof&amp;lt;/accesscontrol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;'''Programmation d'un {{Rouge|radar de recul}}'''&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
L'objectif est de programmer un radar de recul en utilisant un télémètre ultrason (HC-SR04) et d'afficher sur la série de leds l'information de proximité d'un obstacle.&lt;br /&gt;
&lt;br /&gt;
=Vérification de la liaison série=&lt;br /&gt;
&lt;br /&gt;
Vous allez montrer que vous savez utiliser la liaison série.&amp;lt;br&amp;gt;&lt;br /&gt;
On rappelle qu'une variable doit être déclarée en type '''char''' pour être affichée sous forme de caractère, le type '''int''' permet d'afficher son code ASCII.&amp;lt;br&amp;gt;&lt;br /&gt;
Le code ASCII de 'A' = 65 et celui de 'z' = 65+25+32 pour information&amp;lt;br&amp;gt;&lt;br /&gt;
{{Rouge|&amp;lt;u&amp;gt;L'affichage doit se faire en utilisant des boucles pas uniquement le texte &amp;quot;ABCDEFGHIJKLM&amp;quot;.&amp;lt;/u&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|écrire un programme qui :}}&lt;br /&gt;
*affiche au démarrage du programme : &amp;quot;Alphabet&amp;quot;&lt;br /&gt;
*répète en permanence :&lt;br /&gt;
**Afficher les lettres en majuscule de l'alphabet sur deux lignes&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**Afficher les lettres en minuscule de l'alphabet sur deux lignes dans le sens inverse&lt;br /&gt;
**sauter une ligne&lt;br /&gt;
**attendre 2s et recommencer&lt;br /&gt;
&lt;br /&gt;
'''exemple d'affichage :''' &lt;br /&gt;
&lt;br /&gt;
 Alphabet&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&amp;lt;br&amp;gt;&lt;br /&gt;
 zyxwvutsrqpon&lt;br /&gt;
 mlkjihgfedcba&amp;lt;br&amp;gt;&lt;br /&gt;
 ABCDEFGHIJKLM&lt;br /&gt;
 NOPQRSTUVWXYZ&lt;br /&gt;
&lt;br /&gt;
=Marche arrière=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Pour détecter le passage de la marche arrière sur un véhicule, un bouton poussoir est installé sur la boite de vitesse des véhicules mécaniques. Quand on enclenche la marche arrière avec le levier de vitesse, la fourchette qui enclenche le pignon de marche arrière vient appuyer sur le bouton poussoir. Cela permet d'allumer les feux de recul et de faire '''clignoter''' une led sur le tableau de bord.&amp;lt;br&amp;gt;&lt;br /&gt;
Quand on retire la marche arrière les feux de recul s'éteignent ainsi que la diode du tableau de bord.&lt;br /&gt;
&lt;br /&gt;
Nous utiliserons ici le bouton du haut qui est relié sur la broche 3 arduino, ainsi que la led L1 (broche 5) pour indiquer que l'on est en marche arrière et la led L2 (broche 8) qui symbolise les feux de recul.&amp;lt;br&amp;gt;&lt;br /&gt;
Si vous utilisez la librairie TimerOne, vous pourrez utiliser la méthode '''Timer1.detachInterrupt()''' pour arrêter le clignotement.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Eval|3|Réaliser le programme qui allume les LEDs pour indiquer la marche arrière lorsqu'on appuie sur le bouton.}}&lt;br /&gt;
&lt;br /&gt;
=Télémètre à ultrasons=&lt;br /&gt;
&lt;br /&gt;
Le module HC-SR04 est connecté de la façon suivante : &amp;lt;span style=&amp;quot;color:red; font-weight:bold;&amp;quot;&amp;gt;Toute erreur de connexion détruira irrémédiablement le module HC-SR04&amp;lt;/span&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Fonction !! Broche arduino &lt;br /&gt;
|-&lt;br /&gt;
| Echo || 6&lt;br /&gt;
|-&lt;br /&gt;
| Trig|| 7&lt;br /&gt;
|}&lt;br /&gt;
[[Fichier:telemetreUS.jpg|300px|droite]]&lt;br /&gt;
On utilisera la librairie {{Rouge|hcsr04}} créée par {{Rouge|Martin Sosic}}.&lt;br /&gt;
&lt;br /&gt;
Vous trouverez un exemple d'utilisation sur la page suivante : https://github.com/Martinsos/arduino-lib-hc-sr04&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire une mesure de distance toutes les {{Rouge|250ms}} si on est en {{Rouge|marche arrière}} }}&lt;br /&gt;
&lt;br /&gt;
=LEDs couleur=&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
Vous allez utiliser les leds couleurs que vous avez utilisé pour le [[Cours:ChenillardShieldNano|TP chenillard]]&lt;br /&gt;
Le télémètre a une portée d'environ 4 m pour faire les tests de votre code on choisira une échelle 1/10.&amp;lt;br&amp;gt;&lt;br /&gt;
Si la distance est trop grande la distance est égale à -1.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
On affichera une information de distance de la façon suivante sur les LEDs :&lt;br /&gt;
*si la distance est grande ( d &amp;gt; 3m ), on allume les 8 leds en vert&lt;br /&gt;
*si la distance est entre ( 1m ≤ d ≤ 3m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance 3m : 8 en vert&lt;br /&gt;
**...&lt;br /&gt;
**distance 2m : 4 en vert, 4 en orange&lt;br /&gt;
**...&lt;br /&gt;
**distance 1m : 8 en orange&lt;br /&gt;
*si la distance est courte ( d &amp;lt; 1m ) on allumera les LEDs de façon proportionnelle à la distance :&lt;br /&gt;
**distance ?m : 8 en rouge&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align: justify;&amp;quot;&amp;gt;&lt;br /&gt;
{{Eval|3|Modifier votre programme réalisant ce fonctionnement en marche arrière uniquement sinon les LEDs sont éteintent. À quelle distance du mur les LEDs sont-elles toutes rouges, sachant que le télémètre ne peut pas mesurer une distance nulle et qu’il faut garder une marge suffisante pour s’arrêter ?}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Contrôle de la luminosité des LEDs=&lt;br /&gt;
&lt;br /&gt;
On utilisera dans cette partie le potentiomètre P1 sur votre carte. Il correspond à la broche arduino A6.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour que le potentiomètre P1 permette de changer la luminosité des leds couleurs.}}&lt;br /&gt;
&lt;br /&gt;
=Amélioration de la précision de mesure : mesure de température=&lt;br /&gt;
&lt;br /&gt;
La vitesse de propagation du son dans l'air dépend de la température. L'équation suivante modélise cette relation :&lt;br /&gt;
&lt;br /&gt;
 c = 20,05 * sqrt(T) avec T en K, et c la vitesse du son.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour tenir compte de la température dans la mesure de distance :}}&lt;br /&gt;
*[[Cours:ArduinoTemperature|reprenez le TP sur la mesure de température pour mesurer la température en °C]]&lt;br /&gt;
*utiliser la fonction '''measureDistanceCm(temperature_en_degre_c)''' à la place de la fonction '''measureDistanceCm()''' pour tenir compte de la température dans la mesure de distance.&lt;br /&gt;
&lt;br /&gt;
=Système alive=&lt;br /&gt;
&lt;br /&gt;
Pour vérifier que le système est bien en fonctionnement, on souhaite que la led L2 (broche arduino 13) clignote.&lt;br /&gt;
&lt;br /&gt;
Vous choisirez la vitesse de clignotement.&lt;br /&gt;
&lt;br /&gt;
{{Eval|3|Modifier votre programme pour faire clignoter cette led en permanence.}}&lt;br /&gt;
&lt;br /&gt;
'''Remarque''' : Vous devez impérativement utiliser la librairie TimerOne utilisée notamment pour le [[Cours:ArduinoHorloge|TP horloge]]&lt;/div&gt;</summary>
		<author><name>Penant</name></author>	</entry>

	</feed>