One Wire Example striped to find sensors only builds using MBED 2 Library
Dependencies: mbed
main.cpp@0:486c7ab9114b, 2017-06-05 (annotated)
- Committer:
- Roietronics
- Date:
- Mon Jun 05 21:11:32 2017 +0000
- Revision:
- 0:486c7ab9114b
Initial commit of one wire example for MBED 2
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Roietronics | 0:486c7ab9114b | 1 | /***************************************************************************** |
Roietronics | 0:486c7ab9114b | 2 | * * |
Roietronics | 0:486c7ab9114b | 3 | * BOSCH RainGauge LoraWan Interface * |
Roietronics | 0:486c7ab9114b | 4 | * * |
Roietronics | 0:486c7ab9114b | 5 | * (c) 2016 Global Quality Corp * |
Roietronics | 0:486c7ab9114b | 6 | * mailto:sudhir@gqc.com * |
Roietronics | 0:486c7ab9114b | 7 | * Global Quality Corp * |
Roietronics | 0:486c7ab9114b | 8 | * * |
Roietronics | 0:486c7ab9114b | 9 | * Pal Alto, CA. 94040 USA * |
Roietronics | 0:486c7ab9114b | 10 | * * |
Roietronics | 0:486c7ab9114b | 11 | * PERMISSION GRANTED TO USE IN NON-COMMERCIAL AND EDUCATIONAL PROJECTS * |
Roietronics | 0:486c7ab9114b | 12 | * NO RESPONSIBILITY ASSUMED FOR DAMAGE OR LOSS OF ANY HARDWARE OR SOFTWARE * |
Roietronics | 0:486c7ab9114b | 13 | * * |
Roietronics | 0:486c7ab9114b | 14 | * version 0.2 * |
Roietronics | 0:486c7ab9114b | 15 | * last change 7, Dec 2016 * |
Roietronics | 0:486c7ab9114b | 16 | * * |
Roietronics | 0:486c7ab9114b | 17 | ****************************************************************************/ |
Roietronics | 0:486c7ab9114b | 18 | #include "mbed.h" |
Roietronics | 0:486c7ab9114b | 19 | #include "onewire.h" |
Roietronics | 0:486c7ab9114b | 20 | #include "DS18X20.h" |
Roietronics | 0:486c7ab9114b | 21 | #include "DS2450.h" |
Roietronics | 0:486c7ab9114b | 22 | |
Roietronics | 0:486c7ab9114b | 23 | uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; |
Roietronics | 0:486c7ab9114b | 24 | uint8_t nSensors; |
Roietronics | 0:486c7ab9114b | 25 | uint32_t nErreur; |
Roietronics | 0:486c7ab9114b | 26 | uint32_t nErreur_DS18X20; |
Roietronics | 0:486c7ab9114b | 27 | uint32_t nErreur_DS2450; |
Roietronics | 0:486c7ab9114b | 28 | uint32_t nErreur_CRC; |
Roietronics | 0:486c7ab9114b | 29 | uint32_t nErreur_BUS; |
Roietronics | 0:486c7ab9114b | 30 | uint32_t nErreur_DS2450_START; |
Roietronics | 0:486c7ab9114b | 31 | uint32_t nErreur_BUSY; |
Roietronics | 0:486c7ab9114b | 32 | uint32_t nErreur_RESET; |
Roietronics | 0:486c7ab9114b | 33 | uint32_t nMesure; |
Roietronics | 0:486c7ab9114b | 34 | uint32_t micro_seconds; |
Roietronics | 0:486c7ab9114b | 35 | Serial pc(USBTX, USBRX); // tx, rx |
Roietronics | 0:486c7ab9114b | 36 | BusOut bugleds(LED1, LED2, LED3, LED4); |
Roietronics | 0:486c7ab9114b | 37 | |
Roietronics | 0:486c7ab9114b | 38 | /** |
Roietronics | 0:486c7ab9114b | 39 | * @brief DS18X20_show_temp |
Roietronics | 0:486c7ab9114b | 40 | * @param [in] id[] = rom_code |
Roietronics | 0:486c7ab9114b | 41 | * @param [in] n number of id[n] |
Roietronics | 0:486c7ab9114b | 42 | * @param [out] text temp in degre celsius |
Roietronics | 0:486c7ab9114b | 43 | |
Roietronics | 0:486c7ab9114b | 44 | * @date 20/06/2011 |
Roietronics | 0:486c7ab9114b | 45 | */ |
Roietronics | 0:486c7ab9114b | 46 | /* |
Roietronics | 0:486c7ab9114b | 47 | void DS18X20_show_temp(uint8_t subzero, uint8_t cel, uint8_t cel_frac_bits,char *text) { |
Roietronics | 0:486c7ab9114b | 48 | uint16_t decicelsius; |
Roietronics | 0:486c7ab9114b | 49 | char s[10]; |
Roietronics | 0:486c7ab9114b | 50 | float temperature; |
Roietronics | 0:486c7ab9114b | 51 | sprintf(text,""); |
Roietronics | 0:486c7ab9114b | 52 | sprintf(s,"%s", (subzero)?"-":"+"); |
Roietronics | 0:486c7ab9114b | 53 | strcat(text,s); |
Roietronics | 0:486c7ab9114b | 54 | decicelsius = DS18X20_temp_to_decicel(subzero, cel, cel_frac_bits); |
Roietronics | 0:486c7ab9114b | 55 | temperature = decicelsius; |
Roietronics | 0:486c7ab9114b | 56 | temperature = temperature/10; |
Roietronics | 0:486c7ab9114b | 57 | sprintf(s,"%4.1f", temperature); |
Roietronics | 0:486c7ab9114b | 58 | strcat(text,s); |
Roietronics | 0:486c7ab9114b | 59 | |
Roietronics | 0:486c7ab9114b | 60 | } |
Roietronics | 0:486c7ab9114b | 61 | */ |
Roietronics | 0:486c7ab9114b | 62 | |
Roietronics | 0:486c7ab9114b | 63 | int main(void) { |
Roietronics | 0:486c7ab9114b | 64 | uint8_t sp[25]; |
Roietronics | 0:486c7ab9114b | 65 | uint8_t num_sensor; |
Roietronics | 0:486c7ab9114b | 66 | uint8_t subzero, cel, cel_frac_bits; |
Roietronics | 0:486c7ab9114b | 67 | Timer timer; |
Roietronics | 0:486c7ab9114b | 68 | |
Roietronics | 0:486c7ab9114b | 69 | pc.printf("version 2017-06-2\n"); |
Roietronics | 0:486c7ab9114b | 70 | pc.printf("Qantum 1 wire interface test!\n"); |
Roietronics | 0:486c7ab9114b | 71 | |
Roietronics | 0:486c7ab9114b | 72 | |
Roietronics | 0:486c7ab9114b | 73 | |
Roietronics | 0:486c7ab9114b | 74 | ow_PullUp(); |
Roietronics | 0:486c7ab9114b | 75 | if (search_sensors(&nSensors,&gSensorIDs[0][0])) { |
Roietronics | 0:486c7ab9114b | 76 | pc.printf("no Sensors found\n"); |
Roietronics | 0:486c7ab9114b | 77 | return -1; |
Roietronics | 0:486c7ab9114b | 78 | } else { |
Roietronics | 0:486c7ab9114b | 79 | pc.printf("Sensors found : %d\n", nSensors); |
Roietronics | 0:486c7ab9114b | 80 | |
Roietronics | 0:486c7ab9114b | 81 | for (num_sensor=0; num_sensor<nSensors; ++num_sensor) { |
Roietronics | 0:486c7ab9114b | 82 | char text_id[25]; |
Roietronics | 0:486c7ab9114b | 83 | ow_show_id( &gSensorIDs[num_sensor][0], OW_ROMCODE_SIZE,text_id ); |
Roietronics | 0:486c7ab9114b | 84 | pc.printf("%s Sensor # %d is a ",text_id, num_sensor+1); |
Roietronics | 0:486c7ab9114b | 85 | //DS18X20 |
Roietronics | 0:486c7ab9114b | 86 | if (( gSensorIDs[num_sensor][0] == DS18S20_ID) || ( gSensorIDs[num_sensor][0] == DS18B20_ID)) { |
Roietronics | 0:486c7ab9114b | 87 | if ( gSensorIDs[num_sensor][0] == DS18S20_ID) |
Roietronics | 0:486c7ab9114b | 88 | pc.printf("DS18S20/DS1820 "); |
Roietronics | 0:486c7ab9114b | 89 | if ( gSensorIDs[num_sensor][0] == DS18B20_ID) |
Roietronics | 0:486c7ab9114b | 90 | pc.printf("DS18B20 "); |
Roietronics | 0:486c7ab9114b | 91 | /* |
Roietronics | 0:486c7ab9114b | 92 | if ( DS18X20_get_power_status( &gSensorIDs[num_sensor][0] ) == |
Roietronics | 0:486c7ab9114b | 93 | DS18X20_POWER_PARASITE ) |
Roietronics | 0:486c7ab9114b | 94 | pc.printf( "parasite" ); |
Roietronics | 0:486c7ab9114b | 95 | else pc.printf( "externally" ); |
Roietronics | 0:486c7ab9114b | 96 | pc.printf( " powered\n" ); |
Roietronics | 0:486c7ab9114b | 97 | 8/ |
Roietronics | 0:486c7ab9114b | 98 | } |
Roietronics | 0:486c7ab9114b | 99 | //DS2450 |
Roietronics | 0:486c7ab9114b | 100 | /* |
Roietronics | 0:486c7ab9114b | 101 | if ( gSensorIDs[num_sensor][0] == DS2450_ID) { |
Roietronics | 0:486c7ab9114b | 102 | pc.printf("DS2450 "); |
Roietronics | 0:486c7ab9114b | 103 | for (uint8_t i=0 ; i< DS2450_SP_SIZE; i++ ) // DS2450 POWER extern |
Roietronics | 0:486c7ab9114b | 104 | sp[i]=0; |
Roietronics | 0:486c7ab9114b | 105 | sp[4]=0x40; |
Roietronics | 0:486c7ab9114b | 106 | if (DS2450_configure_page(&gSensorIDs[num_sensor][0], DS2450_PAGE3,&sp[0])) |
Roietronics | 0:486c7ab9114b | 107 | pc.printf("CRC Error conf page \n"); |
Roietronics | 0:486c7ab9114b | 108 | if (DS2450_read_page(&gSensorIDs[num_sensor][0], DS2450_PAGE3,&sp[0])) |
Roietronics | 0:486c7ab9114b | 109 | ; |
Roietronics | 0:486c7ab9114b | 110 | else |
Roietronics | 0:486c7ab9114b | 111 | printf( "\n" ); |
Roietronics | 0:486c7ab9114b | 112 | for ( char i=0 ; i< DS2450_SP_SIZE; i++ ) |
Roietronics | 0:486c7ab9114b | 113 | printf(":%2.2X",sp[i]); |
Roietronics | 0:486c7ab9114b | 114 | printf( "\n" ); |
Roietronics | 0:486c7ab9114b | 115 | if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCA,DS2450_12_BIT ,DS2450_IR_5V1)) |
Roietronics | 0:486c7ab9114b | 116 | pc.printf("CRC Error conf ADC\n"); |
Roietronics | 0:486c7ab9114b | 117 | if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCB,DS2450_1_BIT ,DS2450_IR_5V1)) |
Roietronics | 0:486c7ab9114b | 118 | pc.printf("CRC Error conf ADC\n"); |
Roietronics | 0:486c7ab9114b | 119 | if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCC,DS2450_1_BIT,DS2450_IR_5V1)) |
Roietronics | 0:486c7ab9114b | 120 | pc.printf("CRC Error conf ADC\n"); |
Roietronics | 0:486c7ab9114b | 121 | if (DS2450_configure_channel_ADC(&gSensorIDs[num_sensor][0],DS2450_ADCD,DS2450_1_BIT,DS2450_IR_5V1)) |
Roietronics | 0:486c7ab9114b | 122 | pc.printf("CRC Error conf ADC\n"); |
Roietronics | 0:486c7ab9114b | 123 | uint16_t adc[4]; |
Roietronics | 0:486c7ab9114b | 124 | if (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0])) |
Roietronics | 0:486c7ab9114b | 125 | pc.printf("CRC Error read ADC\n"); |
Roietronics | 0:486c7ab9114b | 126 | for (uint8_t i=0; i<4; ++i ) |
Roietronics | 0:486c7ab9114b | 127 | pc.printf(" adc%d:%X %f |",i,adc[i],adc[i]*5.1/65535); |
Roietronics | 0:486c7ab9114b | 128 | pc.printf("\n"); |
Roietronics | 0:486c7ab9114b | 129 | } |
Roietronics | 0:486c7ab9114b | 130 | */ |
Roietronics | 0:486c7ab9114b | 131 | } |
Roietronics | 0:486c7ab9114b | 132 | nErreur=0; |
Roietronics | 0:486c7ab9114b | 133 | nErreur_CRC=0; |
Roietronics | 0:486c7ab9114b | 134 | nErreur_BUS=0; |
Roietronics | 0:486c7ab9114b | 135 | nErreur_DS18X20=0; |
Roietronics | 0:486c7ab9114b | 136 | nErreur_DS2450=0; |
Roietronics | 0:486c7ab9114b | 137 | nErreur_DS2450_START=0; |
Roietronics | 0:486c7ab9114b | 138 | nErreur_BUSY=0; |
Roietronics | 0:486c7ab9114b | 139 | nErreur_RESET=0; |
Roietronics | 0:486c7ab9114b | 140 | nMesure=0; |
Roietronics | 0:486c7ab9114b | 141 | timer.start(); |
Roietronics | 0:486c7ab9114b | 142 | /* |
Roietronics | 0:486c7ab9114b | 143 | while (1) { |
Roietronics | 0:486c7ab9114b | 144 | wait(1); // temps attente |
Roietronics | 0:486c7ab9114b | 145 | nMesure++; |
Roietronics | 0:486c7ab9114b | 146 | pc.printf("Mesure:%d erreur%d\n",nMesure,nErreur); |
Roietronics | 0:486c7ab9114b | 147 | bugleds=nErreur; |
Roietronics | 0:486c7ab9114b | 148 | switch (DS18X20_start_meas(DS18X20_POWER_EXTERN, 0 )) { // start measure ALL DS18X20 |
Roietronics | 0:486c7ab9114b | 149 | case DS18X20_OK : |
Roietronics | 0:486c7ab9114b | 150 | wait_ms(DS18B20_TCONV_12BIT); |
Roietronics | 0:486c7ab9114b | 151 | break; |
Roietronics | 0:486c7ab9114b | 152 | case DS18X20_START_FAIL: |
Roietronics | 0:486c7ab9114b | 153 | nErreur++; |
Roietronics | 0:486c7ab9114b | 154 | nErreur_DS18X20++; |
Roietronics | 0:486c7ab9114b | 155 | pc.printf("sensor DS18X20 : Start meas. failed \n"); |
Roietronics | 0:486c7ab9114b | 156 | break; |
Roietronics | 0:486c7ab9114b | 157 | } |
Roietronics | 0:486c7ab9114b | 158 | |
Roietronics | 0:486c7ab9114b | 159 | for (num_sensor=0; num_sensor<nSensors; ++num_sensor) { |
Roietronics | 0:486c7ab9114b | 160 | //DS2450 |
Roietronics | 0:486c7ab9114b | 161 | if (gSensorIDs[num_sensor][0] == DS2450_ID) { |
Roietronics | 0:486c7ab9114b | 162 | micro_seconds=timer.read_us(); |
Roietronics | 0:486c7ab9114b | 163 | uint16_t adc[4]; |
Roietronics | 0:486c7ab9114b | 164 | if (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0])) // 3 essais avant erreur |
Roietronics | 0:486c7ab9114b | 165 | if (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0])) |
Roietronics | 0:486c7ab9114b | 166 | switch (DS2450_start_and_read_ADC(&gSensorIDs[num_sensor][0], &adc[0])) { |
Roietronics | 0:486c7ab9114b | 167 | case OW_OK: |
Roietronics | 0:486c7ab9114b | 168 | |
Roietronics | 0:486c7ab9114b | 169 | break; |
Roietronics | 0:486c7ab9114b | 170 | case OW_BUSY: |
Roietronics | 0:486c7ab9114b | 171 | nErreur++; |
Roietronics | 0:486c7ab9114b | 172 | nErreur_DS2450++; |
Roietronics | 0:486c7ab9114b | 173 | nErreur_BUSY++; |
Roietronics | 0:486c7ab9114b | 174 | |
Roietronics | 0:486c7ab9114b | 175 | break; |
Roietronics | 0:486c7ab9114b | 176 | case OW_ERROR: |
Roietronics | 0:486c7ab9114b | 177 | nErreur++; |
Roietronics | 0:486c7ab9114b | 178 | nErreur_DS2450++; |
Roietronics | 0:486c7ab9114b | 179 | nErreur_BUS++; |
Roietronics | 0:486c7ab9114b | 180 | |
Roietronics | 0:486c7ab9114b | 181 | break; |
Roietronics | 0:486c7ab9114b | 182 | case OW_ERROR_CRC: |
Roietronics | 0:486c7ab9114b | 183 | nErreur++; |
Roietronics | 0:486c7ab9114b | 184 | nErreur_DS2450++; |
Roietronics | 0:486c7ab9114b | 185 | nErreur_CRC++; |
Roietronics | 0:486c7ab9114b | 186 | pc.printf("Error:%d\n",nErreur); |
Roietronics | 0:486c7ab9114b | 187 | pc.printf("ErrorDS2450_busy:%d\n",nErreur_BUSY); |
Roietronics | 0:486c7ab9114b | 188 | pc.printf("ErrorDS2450_start:%d\n",nErreur_DS2450_START); |
Roietronics | 0:486c7ab9114b | 189 | pc.printf("ErrorDS2450:%d\n",nErreur_DS2450); |
Roietronics | 0:486c7ab9114b | 190 | pc.printf("ErrorDS18X20:%d\n",nErreur_DS18X20); |
Roietronics | 0:486c7ab9114b | 191 | pc.printf("ErrorCRC:%d\n",nErreur_CRC); |
Roietronics | 0:486c7ab9114b | 192 | pc.printf("ErrorBUS:%d\n",nErreur_BUS); |
Roietronics | 0:486c7ab9114b | 193 | pc.printf("ErrorRESET:%d\n",nErreur_RESET); |
Roietronics | 0:486c7ab9114b | 194 | pc.printf("Mesure:%d\n",nMesure); |
Roietronics | 0:486c7ab9114b | 195 | break; |
Roietronics | 0:486c7ab9114b | 196 | case OW_SHORT_CIRCUIT: |
Roietronics | 0:486c7ab9114b | 197 | nErreur++; |
Roietronics | 0:486c7ab9114b | 198 | nErreur_DS2450++; |
Roietronics | 0:486c7ab9114b | 199 | nErreur_RESET++; |
Roietronics | 0:486c7ab9114b | 200 | break; |
Roietronics | 0:486c7ab9114b | 201 | case OW_ERROR_BAD_ID: |
Roietronics | 0:486c7ab9114b | 202 | |
Roietronics | 0:486c7ab9114b | 203 | break; |
Roietronics | 0:486c7ab9114b | 204 | } |
Roietronics | 0:486c7ab9114b | 205 | micro_seconds = timer.read_us()- micro_seconds; // duree lecture DS2450 |
Roietronics | 0:486c7ab9114b | 206 | pc.printf("sensor %d : time:%umicros\n",num_sensor+1,micro_seconds); |
Roietronics | 0:486c7ab9114b | 207 | for (uint8_t i=0; i<4; ++i ) |
Roietronics | 0:486c7ab9114b | 208 | pc.printf(" adc%d:%X %f |",i,adc[i],adc[i]*5.1/65535); |
Roietronics | 0:486c7ab9114b | 209 | pc.printf("\n"); |
Roietronics | 0:486c7ab9114b | 210 | } |
Roietronics | 0:486c7ab9114b | 211 | |
Roietronics | 0:486c7ab9114b | 212 | //TEMP DS1820 |
Roietronics | 0:486c7ab9114b | 213 | if ( (gSensorIDs[num_sensor][0] == DS18S20_ID) ||( gSensorIDs[num_sensor][0] == DS18B20_ID)) |
Roietronics | 0:486c7ab9114b | 214 | switch (DS18X20_read_meas( &gSensorIDs[num_sensor][0], &subzero, &cel, &cel_frac_bits)) { |
Roietronics | 0:486c7ab9114b | 215 | case DS18X20_OK : |
Roietronics | 0:486c7ab9114b | 216 | char text[25]; |
Roietronics | 0:486c7ab9114b | 217 | DS18X20_show_temp(subzero, cel, cel_frac_bits,text); |
Roietronics | 0:486c7ab9114b | 218 | pc.printf("sensor %d : %s\n",num_sensor+1,text); |
Roietronics | 0:486c7ab9114b | 219 | break; |
Roietronics | 0:486c7ab9114b | 220 | case OW_ERROR: |
Roietronics | 0:486c7ab9114b | 221 | nErreur++; |
Roietronics | 0:486c7ab9114b | 222 | nErreur_BUS++; |
Roietronics | 0:486c7ab9114b | 223 | nErreur_DS18X20++; |
Roietronics | 0:486c7ab9114b | 224 | pc.printf("sensor %d : BUS Error\n",num_sensor+1); |
Roietronics | 0:486c7ab9114b | 225 | break; |
Roietronics | 0:486c7ab9114b | 226 | case DS18X20_ERROR_CRC: |
Roietronics | 0:486c7ab9114b | 227 | nErreur++; |
Roietronics | 0:486c7ab9114b | 228 | nErreur_DS18X20++; |
Roietronics | 0:486c7ab9114b | 229 | nErreur_CRC++; |
Roietronics | 0:486c7ab9114b | 230 | pc.printf("sensor %d : CRC Error\n",num_sensor+1); |
Roietronics | 0:486c7ab9114b | 231 | break; |
Roietronics | 0:486c7ab9114b | 232 | } |
Roietronics | 0:486c7ab9114b | 233 | } |
Roietronics | 0:486c7ab9114b | 234 | */ |
Roietronics | 0:486c7ab9114b | 235 | } |
Roietronics | 0:486c7ab9114b | 236 | } |
Roietronics | 0:486c7ab9114b | 237 | } |