One Wire Example striped to find sensors only builds using MBED 2 Library

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }