Demo of OneWire Library for mbed using the DS18B20 as an example slave device. Connect Tera Term t 9600bps 8N1 with terminal 'Receive' to auto and 'Transmit' to CR+LF
Dependencies: OneWire Terminal mbed
main.cpp
- Committer:
- j3
- Date:
- 2017-03-24
- Revision:
- 2:343505f6da8d
- Parent:
- 1:819782bce064
File content as of revision 2:343505f6da8d:
/********************************************************************** * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of Maxim Integrated * Products, Inc. shall not be used except as stated in the Maxim Integrated * Products, Inc. Branding Policy. * * The mere transfer of this software does not imply any licenses * of trade secrets, proprietary technology, copyrights, patents, * trademarks, maskwork rights, or any other form of intellectual * property whatsoever. Maxim Integrated Products, Inc. retains all * ownership rights. **********************************************************************/ #include "mbed.h" #include "OneWire.h" #include "Terminal.h" using namespace OneWire; using namespace RomCommands; //Uncomment the master for your setup //#define I2C_TO_OW_MASTER //#define SERIAL_TO_OW_MASTER #define BIT_BANG_MASTER void print_rom_id(Terminal & term, const RomId & romId); void DS18B20Menu(Terminal & term, const RomId & romId, MultidropRomIterator & selector); int main(void) { Terminal term(USBTX, USBRX); char user_entry = 'y'; #if defined(I2C_TO_OW_MASTER) //Instantiates a 1-wire master using the given I2C bus SDA/SCL pins //Requires a DS248X series of masters on I2C bus //https://para.maximintegrated.com/en/results.mvp?fam=1wire&tree=master I2C i2cBus(D14, D15); DS2484 owm(i2cBus); term.printf("\nStarting I2C to 1-wire Demo\n"); #elif defined(SERIAL_TO_OW_MASTER) //Instantiates a 1-wire master using the given UART tx/rx pins //Requires a DS2480B serial to 1-wire master //https://www.maximintegrated.com/en/products/interface/controllers-expanders/DS2480B.html Serial ow_uart(D1, D0); Ds2480b owm(ow_uart); term.printf("\nStarting Serial to 1-wire Demo\n"); #elif defined(BIT_BANG_MASTER) //Instantiates a 1-wire master on the given GPIO pin //Requires MAX32600MBED platform //https://www.maximintegrated.com/en/products/digital/microcontrollers/MAX32600MBED.html OwGpio owm(D2); term.printf("\nStarting Bit-Bang 1-wire Demo\n"); #else #error One Wire Master Not Defined #endif OneWireMaster::CmdResult result = owm.OWInitMaster(); if(result == OneWireMaster::Success) { MultidropRomIterator selector(owm); //Search state var for main loop SearchState searchState; while(user_entry != 'n') { result = owm.OWReset(); if(result == OneWireMaster::Success) { term.printf("\nOWReset success, starting search\n"); result = OWFirst(owm, searchState); if(result == OneWireMaster::Success) { do { //print current devices rom id print_rom_id(term, searchState.romId); //This could be a switch statement based on familyCodes //if your app has more than one device on the bus if(searchState.romId.familyCode() == 0x28) { DS18B20Menu(term, searchState.romId, selector); } //find the next device if any result = OWNext(owm, searchState); } while(result == OneWireMaster::Success); } else { term.printf("\nSearch failed\n"); term.printf("\nError code = %d\n", result); } } else { term.printf("\nFailed to find any 1-wire devices on bus\n"); term.printf("\nError code = %d\n", result); } user_entry = term.get_char("\nEnter 'y' to continue, or 'n' to quit: ", 'n', 'y'); term.cls(); term.home(); } } else { term.printf("\nFailed to initialize the 1-wire Master\n"); term.printf("\nError code = %d\n", result); } term.printf("\nEnding Program\n"); return 0; } //***** end main ****************************************************** //********************************************************************* void print_rom_id(Terminal & term, const RomId & romId) { //print the rom number term.printf("\n"); int8_t idx = 8; do { term.printf("0x%02x ", romId.buffer[idx--]); } while(idx >= 0); term.printf("\n"); } //********************************************************************* void DS18B20Menu(Terminal & term, const RomId & romId, MultidropRomIterator & selector) { char userEntry = '0'; uint8_t th, tl, idx, intResolution; DS18B20::Resolution resolution = DS18B20::TwelveBit; bool localPower = false; uint8_t scratchPadBuff[9]; float temperature; DS18B20 tempSensor(selector); OneWireSlave::CmdResult result = OneWireSlave::OperationFailure; tempSensor.setRomId(romId); while(userEntry != '8') { term.printf("\nDS18B20 Menu Options\n"); term.printf("\n%t1. Write ScratchPad"); term.printf("\n%t2. Read Scratchpad"); term.printf("\n%t3. Copy Scratchpad"); term.printf("\n%t4. Convert Temperature"); term.printf("\n%t5. Recall EEPROM"); term.printf("\n%t6. Read Power Supply"); term.printf("\n%t7. Clear Screen"); term.printf("\n%t8. Continuously Convert Temperature"); term.printf("\n%t9. Quit"); userEntry = term.get_char("\nPlease select an option above: ", '1', '9'); switch(userEntry) { case '1': th = term.get_int32("\nPlease enter upper temperature threshold, integer values only: ", 0, 100); tl = term.get_int32("\nPlease enter lower temperature threshold, integer values only: ", -55, 0); intResolution = term.get_int32("\nPlease enter desired reolution (9 to 12): ", 9, 12); switch(intResolution) { case 9: resolution = DS18B20::NineBit; case 10: resolution = DS18B20::TenBit; case 11: resolution = DS18B20::ElevenBit; case 12: default: resolution = DS18B20::TwelveBit; break; } result = tempSensor.writeScratchPad(th, tl, resolution); if(result == OneWireSlave::Success) { term.printf("\nWrite Scratchpad Success\n"); } else { term.printf("\nWrite Scratchpad Fail\n"); } break; case '2': result = tempSensor.readScratchPad(scratchPadBuff); if(result == OneWireSlave::Success) { term.printf("\nRead Scratchpad Success\n"); term.printf("\nScratchpad = "); for(idx = 0; idx < 8; idx++) { if(scratchPadBuff[idx] < 16) { term.printf("0x0%x ", scratchPadBuff[idx]); } else { term.printf("0x%2x ", scratchPadBuff[idx]); } } term.printf("\n"); } else { term.printf("\nRead Scratchpad Fail\n"); } break; case '3': result = tempSensor.copyScratchPad(); if(result == OneWireSlave::Success) { term.printf("\nCopy Scratchpad Success\n"); } else { term.printf("\nCopy Scratchpad Fail\n"); } break; case '4': result = tempSensor.convertTemperature(temperature); if(result == OneWireSlave::Success) { term.printf("\nConvert Temperature Success\n"); term.printf("\nTemperature = %.4f", temperature); } else { term.printf("\nConvert Temperature Fail\n"); } break; case '5': result = tempSensor.recallEEPROM(); if(result == OneWireSlave::Success) { term.printf("\nRecall EEPROM Success\n"); } else { term.printf("\nRecall EEPROM Fail\n"); } break; case '6': result = tempSensor.readPowerSupply(localPower); if(result == OneWireSlave::Success) { term.printf("Read Power Supply Success\n"); term.printf("DS18B20 %s\n", localPower ? "Has Local Power" : "Is Parasite Powered"); } else { term.printf("Read Power Supply Failed\n"); } break; case '7': term.cls(); term.home(); break; case '8': do { result = tempSensor.convertTemperature(temperature); if(result == OneWireSlave::Success) { term.printf("\nTemperature = %.4f", temperature); } else { term.printf("\nConvert Temperature Fail\n"); } } while(result == OneWireSlave::Success); break; case '9': term.printf("\nLeaving DS18B20 Menu Options\n"); break; default: mbed_die(); break; } } }