une 30aine passés sans pb entre les trames
Dependencies: ADS1015 ARNSRS_SENSORS DmTftLibrary MS5803_14BA SDFileSystem mbed
Fork of ARNSRS_SERVOS_USB_TFT by
main.cpp@4:d84250f67dec, 2017-05-01 (annotated)
- Committer:
- POTLESS_2
- Date:
- Mon May 01 13:33:54 2017 +0000
- Revision:
- 4:d84250f67dec
- Parent:
- 3:bc6d4222db12
- Child:
- 5:e1d0dc7940a6
Ajout de la PPO2 avec AD1015...je sais pas si ?a marche, car mes cellules ne marchent pas je pense...r?sultat toujours 208, idem depuis le d?but sur arduino, uniquement r?sultat du calcul du d?but. A tester avec des capteurs (O2 et P/T) OK.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
potless | 1:bef7856b5c0a | 1 | /* procédure lecture capteur COZIR ou MINIR - CO2 seul |
potless | 1:bef7856b5c0a | 2 | sur broches F401RE SERIAL PA_11 et PA_12 |
potless | 1:bef7856b5c0a | 3 | renvoie sur moniteur (IDE arduino par exemple) de la valeur lue |
potless | 2:4a8bf1d53439 | 4 | |
potless | 2:4a8bf1d53439 | 5 | procédures possibles sont : |
potless | 2:4a8bf1d53439 | 6 | request (char commande) - renvoie la valeur lue si la commande ne représente qu'un seul caractère (entre '') |
potless | 2:4a8bf1d53439 | 7 | cozirSend (string commande) - permet d'envoyer des commandes multicaractères (entre "") - exemple A 32 - donne la réponse obtenue |
potless | 2:4a8bf1d53439 | 8 | |
potless | 2:4a8bf1d53439 | 9 | |
potless | 2:4a8bf1d53439 | 10 | la fonction cozirSend est davantage "sécurisée" |
POTLESS_2 | 4:d84250f67dec | 11 | */ |
potless | 0:69d4b21d58e0 | 12 | |
potless | 0:69d4b21d58e0 | 13 | |
potless | 1:bef7856b5c0a | 14 | #include "mbed.h" |
potless | 2:4a8bf1d53439 | 15 | #include <string> |
POTLESS_2 | 3:bc6d4222db12 | 16 | #include "MS5803_14BA.h" |
POTLESS_2 | 4:d84250f67dec | 17 | #include "Adafruit_ADS1015.h" |
POTLESS_2 | 4:d84250f67dec | 18 | |
POTLESS_2 | 3:bc6d4222db12 | 19 | #ifdef TARGET_K64F |
POTLESS_2 | 4:d84250f67dec | 20 | #define SPI_SCK PTD1 |
POTLESS_2 | 4:d84250f67dec | 21 | #define SPI_MOSI PTD2 |
POTLESS_2 | 4:d84250f67dec | 22 | #define SPI_MISO PTD3 |
POTLESS_2 | 4:d84250f67dec | 23 | #define SPI_CS PTD0 |
POTLESS_2 | 4:d84250f67dec | 24 | #define I2C_SDA PTE25 |
POTLESS_2 | 4:d84250f67dec | 25 | #define I2C_SCL PTE24 |
POTLESS_2 | 3:bc6d4222db12 | 26 | #elif defined(TARGET_KL25Z) |
POTLESS_2 | 4:d84250f67dec | 27 | #define SPI_SCK PTD1 |
POTLESS_2 | 4:d84250f67dec | 28 | #define SPI_MOSI PTD2 |
POTLESS_2 | 4:d84250f67dec | 29 | #define SPI_MISO PTD3 |
POTLESS_2 | 4:d84250f67dec | 30 | #define SPI_CS PTD0 |
POTLESS_2 | 4:d84250f67dec | 31 | #define I2C_SDA PTE0 |
POTLESS_2 | 4:d84250f67dec | 32 | #define I2C_SCL PTE1 |
POTLESS_2 | 3:bc6d4222db12 | 33 | #endif |
potless | 1:bef7856b5c0a | 34 | |
POTLESS_2 | 4:d84250f67dec | 35 | //COM Série |
potless | 1:bef7856b5c0a | 36 | Serial serialCozir (PA_11,PA_12,9600); |
potless | 1:bef7856b5c0a | 37 | Serial serialMonit (USBTX,USBRX,9600); |
POTLESS_2 | 4:d84250f67dec | 38 | |
POTLESS_2 | 4:d84250f67dec | 39 | //Buffer pour Cozir |
POTLESS_2 | 4:d84250f67dec | 40 | char reponse[20]; |
POTLESS_2 | 4:d84250f67dec | 41 | //Init ADS1015 |
POTLESS_2 | 4:d84250f67dec | 42 | I2C i2c(D14, D15); |
POTLESS_2 | 4:d84250f67dec | 43 | Adafruit_ADS1015 ads(&i2c, 0x48); |
POTLESS_2 | 4:d84250f67dec | 44 | //Variables pour PPO2 |
POTLESS_2 | 4:d84250f67dec | 45 | int16_t valeurO2_01 = 0; |
POTLESS_2 | 4:d84250f67dec | 46 | int16_t valeurO2_02 = 0; |
POTLESS_2 | 4:d84250f67dec | 47 | // pin d2 pour Adc_AlerRdy (fil bleu) : démarre et arrete l'ADC pour sauver l'energie |
POTLESS_2 | 4:d84250f67dec | 48 | int Adc_AlerRdy = 2; |
POTLESS_2 | 4:d84250f67dec | 49 | float calibO2 = 0; |
POTLESS_2 | 4:d84250f67dec | 50 | float gainAmpli = 128.0F; // ADS1115 @ +0,256V gain (16-bit results) gain de l'ampli de l'ADS |
POTLESS_2 | 4:d84250f67dec | 51 | //Init MS5803 |
POTLESS_2 | 3:bc6d4222db12 | 52 | MS5803_14BA ps(D14, D15, MS5803_ADDRC_L, D1_OSR_4096, D2_OSR_4096); // SDA, SCL, I2C_address (0x76 or 0x77 look at MS5803.h) |
potless | 2:4a8bf1d53439 | 53 | |
potless | 1:bef7856b5c0a | 54 | /////////////////////////////////// |
potless | 1:bef7856b5c0a | 55 | // fonction de lecture capteur///// |
potless | 1:bef7856b5c0a | 56 | /////////////////////////////////// |
POTLESS_2 | 4:d84250f67dec | 57 | int request(char commande) |
POTLESS_2 | 4:d84250f67dec | 58 | { |
POTLESS_2 | 4:d84250f67dec | 59 | int index=0; |
POTLESS_2 | 4:d84250f67dec | 60 | char ch = ' ';; |
POTLESS_2 | 4:d84250f67dec | 61 | int valeurCommande; |
POTLESS_2 | 4:d84250f67dec | 62 | |
potless | 1:bef7856b5c0a | 63 | // interrogation capteur |
POTLESS_2 | 4:d84250f67dec | 64 | do { |
POTLESS_2 | 4:d84250f67dec | 65 | if (serialCozir.writeable()) { |
POTLESS_2 | 4:d84250f67dec | 66 | serialCozir.putc(commande); |
POTLESS_2 | 4:d84250f67dec | 67 | serialCozir.putc('\r'); |
POTLESS_2 | 4:d84250f67dec | 68 | serialCozir.putc('\n'); |
potless | 2:4a8bf1d53439 | 69 | } |
potless | 2:4a8bf1d53439 | 70 | |
POTLESS_2 | 4:d84250f67dec | 71 | while (!serialCozir.readable()) {} |
POTLESS_2 | 4:d84250f67dec | 72 | ch = serialCozir.getc(); |
POTLESS_2 | 4:d84250f67dec | 73 | } |
POTLESS_2 | 4:d84250f67dec | 74 | |
POTLESS_2 | 4:d84250f67dec | 75 | while ( ch != commande); |
potless | 1:bef7856b5c0a | 76 | |
potless | 1:bef7856b5c0a | 77 | // attente réponse capteur |
potless | 1:bef7856b5c0a | 78 | // le format de la reponse est : Z xxxxx z yyyyy\r\n |
potless | 1:bef7856b5c0a | 79 | // c'est uniquement xxxxx qui nous interesse |
potless | 1:bef7856b5c0a | 80 | |
POTLESS_2 | 4:d84250f67dec | 81 | do { |
POTLESS_2 | 4:d84250f67dec | 82 | if (serialCozir.readable()) { |
POTLESS_2 | 4:d84250f67dec | 83 | ch = serialCozir.getc(); // on a reçu Z, on continue de lire la valeur qui suit en stockant caractère par caractère dans une chaine |
POTLESS_2 | 4:d84250f67dec | 84 | if (index<20) // index <n b de digits max attendus ? (test pour ne pas depasser la capacité du buffer) |
POTLESS_2 | 4:d84250f67dec | 85 | reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant |
POTLESS_2 | 4:d84250f67dec | 86 | } |
POTLESS_2 | 4:d84250f67dec | 87 | } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse |
POTLESS_2 | 4:d84250f67dec | 88 | |
potless | 1:bef7856b5c0a | 89 | //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse |
POTLESS_2 | 4:d84250f67dec | 90 | sscanf (reponse,"%5d\r\n",&valeurCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCO2 |
POTLESS_2 | 4:d84250f67dec | 91 | return valeurCommande; |
potless | 2:4a8bf1d53439 | 92 | } |
potless | 2:4a8bf1d53439 | 93 | |
potless | 2:4a8bf1d53439 | 94 | |
potless | 2:4a8bf1d53439 | 95 | ////////////////////////////////////// |
potless | 2:4a8bf1d53439 | 96 | // fonction communication capteur///// |
potless | 2:4a8bf1d53439 | 97 | // on peut envoyer des ordres avec /// |
potless | 2:4a8bf1d53439 | 98 | // plusieurs digits comme A 32 /// |
potless | 2:4a8bf1d53439 | 99 | ////////////////////////////////////// |
POTLESS_2 | 4:d84250f67dec | 100 | int cozirSend(string commande) |
POTLESS_2 | 4:d84250f67dec | 101 | { |
potless | 2:4a8bf1d53439 | 102 | |
potless | 2:4a8bf1d53439 | 103 | |
POTLESS_2 | 4:d84250f67dec | 104 | int index=0; |
POTLESS_2 | 4:d84250f67dec | 105 | char ch = ' ';; |
POTLESS_2 | 4:d84250f67dec | 106 | int reponseCommande; |
POTLESS_2 | 4:d84250f67dec | 107 | int nbDigits = commande.size(); |
potless | 2:4a8bf1d53439 | 108 | |
POTLESS_2 | 4:d84250f67dec | 109 | commande[nbDigits]='\x0'; // on matérialise la fin de la chaine avc '\x0' |
POTLESS_2 | 4:d84250f67dec | 110 | |
potless | 2:4a8bf1d53439 | 111 | // interrogation capteur |
POTLESS_2 | 4:d84250f67dec | 112 | do { |
POTLESS_2 | 4:d84250f67dec | 113 | if (serialCozir.writeable()) { |
POTLESS_2 | 4:d84250f67dec | 114 | for (int j=0; j<nbDigits; j++) { |
POTLESS_2 | 4:d84250f67dec | 115 | serialCozir.putc(commande[j]); |
POTLESS_2 | 4:d84250f67dec | 116 | //serialMonit.printf(" commande digit %i sur %i => %c\r\n",j,nbDigits-1,commande[j]); // pour le debug |
POTLESS_2 | 4:d84250f67dec | 117 | } |
POTLESS_2 | 4:d84250f67dec | 118 | serialCozir.putc('\r'); |
POTLESS_2 | 4:d84250f67dec | 119 | serialCozir.putc('\n'); |
potless | 2:4a8bf1d53439 | 120 | } |
potless | 2:4a8bf1d53439 | 121 | |
POTLESS_2 | 4:d84250f67dec | 122 | while (!serialCozir.readable()) {}; |
POTLESS_2 | 4:d84250f67dec | 123 | ch = serialCozir.getc(); |
POTLESS_2 | 4:d84250f67dec | 124 | } |
POTLESS_2 | 4:d84250f67dec | 125 | |
POTLESS_2 | 4:d84250f67dec | 126 | while ( ch != commande[0]); // le format de la réponse reprend la première lettre de l'ordre |
potless | 2:4a8bf1d53439 | 127 | |
potless | 2:4a8bf1d53439 | 128 | // attente réponse capteur |
potless | 2:4a8bf1d53439 | 129 | // exemple pour co2 : le format de la reponse est Z xxxxx z yyyyy\r\n |
potless | 2:4a8bf1d53439 | 130 | // c'est uniquement xxxxx qui nous interesse |
potless | 2:4a8bf1d53439 | 131 | |
POTLESS_2 | 4:d84250f67dec | 132 | do { |
POTLESS_2 | 4:d84250f67dec | 133 | if (serialCozir.readable()) { |
POTLESS_2 | 4:d84250f67dec | 134 | ch = serialCozir.getc(); // on a reçu Z, on continue de lire la valeur qui suit en stockant caractère par caractère dans une chaine |
POTLESS_2 | 4:d84250f67dec | 135 | if (index<8) // index <n b de digits max attendus (les autres ne nous interessent pas) |
POTLESS_2 | 4:d84250f67dec | 136 | reponse[index++]=ch; // on stocke le caractere reçu et on passe au suivant |
POTLESS_2 | 4:d84250f67dec | 137 | } |
POTLESS_2 | 4:d84250f67dec | 138 | } while (ch!='\n'); // on s'arrete de lire quand on a recu le retour à la ligne \n de la réponse |
POTLESS_2 | 4:d84250f67dec | 139 | |
potless | 2:4a8bf1d53439 | 140 | //reponse[index++]='\x0'; // mettre un zero à la fin de la reponse |
POTLESS_2 | 4:d84250f67dec | 141 | sscanf (reponse,"%5d\r\n",&reponseCommande); // on extrait le int de la chaine et on le stocke à l'adresse où pointe valeurCommande |
potless | 2:4a8bf1d53439 | 142 | //serialMonit.printf(" reponse recue => %5d\r\n",reponseCommande); // pour le debug |
potless | 2:4a8bf1d53439 | 143 | |
POTLESS_2 | 4:d84250f67dec | 144 | return reponseCommande; |
potless | 2:4a8bf1d53439 | 145 | } |
POTLESS_2 | 4:d84250f67dec | 146 | |
POTLESS_2 | 4:d84250f67dec | 147 | //////////////////////// |
POTLESS_2 | 4:d84250f67dec | 148 | // Lecture PPO2 ///// |
POTLESS_2 | 4:d84250f67dec | 149 | //////////////////////// |
POTLESS_2 | 4:d84250f67dec | 150 | int requestPpO2() |
POTLESS_2 | 4:d84250f67dec | 151 | { |
POTLESS_2 | 4:d84250f67dec | 152 | |
POTLESS_2 | 4:d84250f67dec | 153 | int result3; |
POTLESS_2 | 4:d84250f67dec | 154 | //lecture des deux cellules O2 et P de la carte AQL |
POTLESS_2 | 4:d84250f67dec | 155 | |
POTLESS_2 | 4:d84250f67dec | 156 | //digitalWrite (Adc_AlerRdy, HIGH); // si le fil a été connecté à la carte (permet d'économiser l'énergie) - sur la carte 2014, il est à la masse donc pas utilisé |
POTLESS_2 | 4:d84250f67dec | 157 | wait_ms(100); // mettre la pin AlertRdy à 1 pour lancer conversion ADC |
POTLESS_2 | 4:d84250f67dec | 158 | valeurO2_01 = ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 |
POTLESS_2 | 4:d84250f67dec | 159 | wait_ms(50); |
POTLESS_2 | 4:d84250f67dec | 160 | valeurO2_02 = ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 |
POTLESS_2 | 4:d84250f67dec | 161 | wait_ms(50); |
POTLESS_2 | 4:d84250f67dec | 162 | //digitalWrite (Adc_AlerRdy, LOW); // remettre la pin AlertRdy à 0 pour économiser energie |
POTLESS_2 | 4:d84250f67dec | 163 | // pour le DEBUG |
POTLESS_2 | 4:d84250f67dec | 164 | //serialMonit.printf("Diff brute entre cell O2: "); serialMonit.printf((valeurO2_01-valeurO2_02)); serialMonit.printf("("); serialMonit.printf((valeurO2_01-valeurO2_02) / gainAmpli); serialMonit.printf("mV)"); // ramené en mV |
POTLESS_2 | 4:d84250f67dec | 165 | //serialMonit.printf("O2.1: "); serialMonit.printf(valeurO2_01); serialMonit.printf(" ("); serialMonit.printf((valeurO2_01) / gainAmpli); serialMonit.printf("mV) - ");serialMonit.printf((valeurO2_01) / gainAmpli/6354*calibO2*100000,0); serialMonit.printf("mbar de ppO2)"); // coef usine cellule + ramené en mV |
POTLESS_2 | 4:d84250f67dec | 166 | //serialMonit.printf("O2.2: "); serialMonit.printf(valeurO2_02); serialMonit.printf(" ("); serialMonit.printf((valeurO2_02) / gainAmpli); serialMonit.printf("mV) - ");serialMonit.printf((valeurO2_02) / gainAmpli/6528*calibO2*100000,0); serialMonit.printf("mbar de ppO2)"); // ramené en mV |
POTLESS_2 | 4:d84250f67dec | 167 | |
POTLESS_2 | 4:d84250f67dec | 168 | result3 = 0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli * calibO2; // valeur en mbar |
POTLESS_2 | 4:d84250f67dec | 169 | return result3; |
POTLESS_2 | 4:d84250f67dec | 170 | } |
POTLESS_2 | 4:d84250f67dec | 171 | |
potless | 2:4a8bf1d53439 | 172 | /////////////////////////////////// |
potless | 2:4a8bf1d53439 | 173 | // fonction initialisation ///// |
potless | 2:4a8bf1d53439 | 174 | /////////////////////////////////// |
POTLESS_2 | 4:d84250f67dec | 175 | void setup() |
POTLESS_2 | 4:d84250f67dec | 176 | { |
POTLESS_2 | 4:d84250f67dec | 177 | //Préparation PPO2 avec ADS1015 |
POTLESS_2 | 4:d84250f67dec | 178 | ads.setGain(GAIN_SIXTEEN); // set range to +/-0.256V |
POTLESS_2 | 4:d84250f67dec | 179 | // calibration cellules O2 |
POTLESS_2 | 4:d84250f67dec | 180 | // partie i2c : lecture des deux cellules O2 et P de la carte AQL |
POTLESS_2 | 4:d84250f67dec | 181 | //digitalWrite (Adc_AlerRdy, HIGH); // si le fil a été connecté à la carte (permet d'économiser l'énergie) - sur la carte 2014, il est à la masse donc pas utilisé |
POTLESS_2 | 4:d84250f67dec | 182 | wait_ms(100); |
potless | 2:4a8bf1d53439 | 183 | |
POTLESS_2 | 4:d84250f67dec | 184 | for (int i = 0; i < 5; i++) { |
POTLESS_2 | 4:d84250f67dec | 185 | // proposition : mettre la pin AlertRdy à 1 pour lancer conversion ADC |
POTLESS_2 | 4:d84250f67dec | 186 | valeurO2_01 = valeurO2_01 + ads.readADC_Differential_0_1(); // lecture tension entre bornes cell O2 nmr1 |
POTLESS_2 | 4:d84250f67dec | 187 | wait_ms(50); |
POTLESS_2 | 4:d84250f67dec | 188 | valeurO2_02 = valeurO2_02 + ads.readADC_Differential_2_3(); // lecture tension entre bornes cell O2 nmr2 |
POTLESS_2 | 4:d84250f67dec | 189 | wait_ms(50); |
POTLESS_2 | 4:d84250f67dec | 190 | } |
POTLESS_2 | 4:d84250f67dec | 191 | |
POTLESS_2 | 4:d84250f67dec | 192 | valeurO2_01 = valeurO2_01 / 5; |
POTLESS_2 | 4:d84250f67dec | 193 | valeurO2_02 = valeurO2_02 / 5; |
POTLESS_2 | 4:d84250f67dec | 194 | calibO2 = 208 / (0.5 * (valeurO2_01 + valeurO2_02) / gainAmpli); //(air frais : 208 mbar supposés au moment de la calib) |
POTLESS_2 | 4:d84250f67dec | 195 | |
POTLESS_2 | 4:d84250f67dec | 196 | //Préparation mode fonctionnement CO2 COZIR |
POTLESS_2 | 4:d84250f67dec | 197 | serialMonit.printf("reponse demande pooling => K %5i\r\n", cozirSend("K 2")); |
POTLESS_2 | 4:d84250f67dec | 198 | serialMonit.printf("reponse demande filtrage => A %5i\r\n", cozirSend("A 32")); |
POTLESS_2 | 4:d84250f67dec | 199 | serialMonit.printf("reponse calibration => G %5d\r\n", cozirSend("G")); |
POTLESS_2 | 4:d84250f67dec | 200 | |
potless | 0:69d4b21d58e0 | 201 | } |
potless | 0:69d4b21d58e0 | 202 | |
potless | 1:bef7856b5c0a | 203 | ///////////////////////////////////// |
potless | 1:bef7856b5c0a | 204 | /// procédure principale ///////// |
potless | 1:bef7856b5c0a | 205 | ///////////////////////////////////// |
potless | 0:69d4b21d58e0 | 206 | |
POTLESS_2 | 4:d84250f67dec | 207 | int main() |
POTLESS_2 | 4:d84250f67dec | 208 | { |
POTLESS_2 | 4:d84250f67dec | 209 | setup(); //initialisation capteurs |
potless | 2:4a8bf1d53439 | 210 | |
POTLESS_2 | 4:d84250f67dec | 211 | while (1) { |
POTLESS_2 | 4:d84250f67dec | 212 | //CO2 / H / T sur Cozir |
POTLESS_2 | 3:bc6d4222db12 | 213 | serialMonit.printf(" co2 COZIR par methode cozirSend = %5d\r\n" ,cozirSend("Z")*10); // on multiplie par 10 pour etre en ppm |
POTLESS_2 | 3:bc6d4222db12 | 214 | serialMonit.printf(" co2 COZIR par methode request = %5d\r\n" ,request('Z')*10); // on multiplie par 10 pour etre en ppm (méthode précédente) |
potless | 2:4a8bf1d53439 | 215 | serialMonit.printf(" H COZIR par methode cozirSend = %5d\r\n" ,cozirSend ("H")); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% |
potless | 2:4a8bf1d53439 | 216 | serialMonit.printf(" H COZIR par methode request = %5d\r\n" ,request('H')); // à laisser comme ça pour transmettre en BLE mais à diviser par 10 à réception dans l'app android pour être en xx,x% |
potless | 2:4a8bf1d53439 | 217 | serialMonit.printf(" T COZIR par methode cozirSend = %5d\r\n" ,cozirSend ("T")-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C |
potless | 2:4a8bf1d53439 | 218 | serialMonit.printf(" T COZIR par methode request = %5d\r\n" ,request('T')-1000); // à laisser comme ça pour envoi BLE et à diviser par 10 à réception dans l'app android pour etre en yy,y°C |
POTLESS_2 | 4:d84250f67dec | 219 | //P / T sur MS5803 |
POTLESS_2 | 3:bc6d4222db12 | 220 | ps.convert(); |
POTLESS_2 | 4:d84250f67dec | 221 | serialMonit.printf(" Pression MS5803 = %f\r\n", ps.pressure); |
POTLESS_2 | 4:d84250f67dec | 222 | serialMonit.printf(" Temperature MS5803 = %f\r\n", ps.temperature); |
POTLESS_2 | 4:d84250f67dec | 223 | //PPO2 sur ADS1015 |
POTLESS_2 | 4:d84250f67dec | 224 | //reading = ads.readADC_Differential_2_3(); |
POTLESS_2 | 4:d84250f67dec | 225 | serialMonit.printf(" PPO2 sur ADS1015 : %d\r\n", requestPpO2()); // print diff |
POTLESS_2 | 4:d84250f67dec | 226 | wait_ms(2000); |
POTLESS_2 | 4:d84250f67dec | 227 | } |
POTLESS_2 | 4:d84250f67dec | 228 | } |