Jump to content
43oh

geodave

Members
  • Content Count

    27
  • Joined

  • Last visited

Reputation Activity

  1. Like
    geodave reacted to spirilis in nrf24L01+ wake-up after powerdown   
    Ah so I suspect you read & implemented my blurb a bit too literally  I should revise that at some point for exactness.
     
    Problems:
    if(delay == 2){ msprf24_standby(); _delay_cycles(5000); P1OUT |= BIT0; // Red LED on flush_tx(); buf[0] = '1'; w_tx_payload(32, buf); msprf24_activate_tx(); delay=0; //msprf24_powerdown(); LPM3; Yes, you certainly wouldn't want to power down the transceiver the moment it *started transmitting*.  The msprf24_powerdown() would be at the very end of your TX IRQ handler, unless you want to continuously transmit and transmit and transmit toggling the pin each time.  That LPM3 would last in practice only until the transceiver was done transmitting and had either successfully transmitted (msprf24_get_irq_reason() setting rf_irq to RF24_IRQ_TX) or unsuccessfully (RF24_IRQ_TXFAILED).  The latter could indeed happen, because you are using 1Mbps (1Mbps and 2Mbps are eligible for AutoACK) and have autoack enabled in msprf24_open_pipe().  Need to make sure you catch that IRQ.
     
     
    Here's a typical while() loop that has worked for me, now that I have a bit of experience under my belt with these transceivers:
    while(1) { // Handle RF acknowledgements if (rf_irq & RF24_IRQ_FLAGGED) { msprf24_get_irq_reason(); // Handle TX acknowledgements if (rf_irq & RF24_IRQ_TX) { // Acknowledge msprf24_irq_clear(RF24_IRQ_TX); msprf24_powerdown(); P2OUT &= ~LED_POT; } if (rf_irq & RF24_IRQ_TXFAILED) { msprf24_irq_clear(RF24_IRQ_TXFAILED); flush_tx(); msprf24_powerdown(); P2OUT &= ~LED_POT; } if (rf_irq & RF24_IRQ_RX) { // Really no reason we should be receiving anything. flush_rx(); msprf24_irq_clear(RF24_IRQ_RX); } /* rf_irq & RF24_IRQ_RX */ } /* rf_irq & RF24_IRQ_FLAGGED */ if (rotbtn) { // Process rotary encoder button press if (saturation == 1.0) saturation = 0.2; else saturation = 1.0; // Do update if (msprf24_queue_state() & RF24_QUEUE_TXEMPTY) { HSV_to_RGB(dmx512_buffer, (float)rotenc, saturation, (float) (pot / POT_UPPER_VALUE) ); dmx512_output_channels(P2IN & 0x03, 1, dmx512_buffer, 3); } rotbtn = 0; } if (!sleep_counter) { // ADC conversion timer ADC10CTL0 = SREF_1 | ADC10SHT_3 | REFBURST | REFON | REFOUT | ADC10ON; ADC10CTL1 = INCH_3 | ADC10DIV_1; ADC10AE0 |= BIT3; ADC10CTL0 |= ENC | ADC10SC; while (ADC10CTL1 & ADC10BUSY) ; pot = ADC10MEM >> 3; ADC10CTL1 &= ~ENC; ADC10CTL0 &= ~(ADC10ON | ADC10IFG); if (pot != pot_old) { // Do update if (msprf24_queue_state() & RF24_QUEUE_TXEMPTY) { HSV_to_RGB(dmx512_buffer, (float)rotenc, saturation, (float) (pot / POT_UPPER_VALUE) ); dmx512_output_channels(P2IN & 0x03, 1, dmx512_buffer, 3); pot_old = pot; } } sleep_counter = ADC_SLEEP_INTERVAL; } if (rotenc != rotenc_old) { // Do update if (msprf24_queue_state() & RF24_QUEUE_TXEMPTY) { HSV_to_RGB(dmx512_buffer, (float)rotenc, saturation, (float) (pot / POT_UPPER_VALUE) ); dmx512_output_channels(P2IN & 0x03, 1, dmx512_buffer, 3); rotenc_old = rotenc; } } if (packet_task_next() != NULL) { packet_process_txqueue(); P2OUT |= LED_POT; } LPM3; } /* while(1) */ Note the program flow; Handle RF IRQs at the top of the loop, then process other events, deciding whether to wake it up & transmit again.  FYI, the packet_process_txqueue() function does some stuff that ultimately results in doing a w_tx_addr(), followed by w_tx_payload() and msprf24_activate_tx() before returning.  (There's a simplistic logical link layer-type of protocol I developed for my own purposes that sits on top of the nRF24L01+'s packets, using the dynamic payload size feature too)
     
    Then it goes into LPM3, waking up eventually by the transceiver firing the RF24_IRQ_TX or RF24_IRQ_TXFAILED IRQs.  Only when the handler code sees & acknowledges those IRQs, will it issue msprf24_powerdown().  Between the issuing of msprf24_activate_tx() and the TX or TXFAILED IRQs being "handled", the transceiver should be powered up and it will be going through its process of sending the packet.
     
    The chip may also wake up from LPM3 due to the WDT ISR timing out (sleep_counter reaching 0), either way, the whole loop runs and events are addressed as they come.  It's a good idea to have the RF IRQ handlers up top so they're the first thing that runs after LPM3 exits.
  2. Like
    geodave got a reaction from spirilis in nRF24L01+, Raspberry Pi, and MSP430G2553   
    I am embarrassed to admit the my CE and CSN lines were switched. I checked it at least 10 times over the course of two weeks. I guess in life sometime it takes 11 tries. Code works as is! Hopefully this post will be useful to someone. No packet loss. Haven't tested the distance yet. Wiring for the Pi is as follows:
     
    radio 7 (miso) to gpio9/bcm21
    radio 6 (mosi) to gpio10/bcm19
    radio 5 (sck) to gpio11/bcm23
    radio 4 (csn) to gpio8/bcm24
    radio 3 (ce) to gpio25/bcm22
    radio 2 (3.3v) to 3.3v
    radio 1 (gnd) to gnd
     
    Get it right or pay the price!
     
     
  3. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    That's what I'm hoping.  Along the same line as the inductor, the idea is if you can't get switching current high enough you won't boost... that could be due to an inductor with too high of impedance (too low of saturating current) or a power source of too high of impedance too.  Input capacitance should bolster that I think.
  4. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Hmmm!  Very interesting.  An oscilloscope would probably give some hints.  What is the boost converter using as its source again?  A rechargeable battery of some type inside the device?
    I wonder what might happen if you put the 68uF electrolytic AND a 22uF ceramic on the Vin side of the boost converter.
  5. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    I'm willing to bet it's the inductor.  Probably can't handle the switching current.
     
    Give it a high enough input voltage and it doesn't need to do much, but make it actually "boost"... no go.
  6. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    I think 10uH is fine.  Also on another thought--the input stage of the DC-DC converter, you have a 10uF cap there, what type is it?  i.e. aluminum electrolytic (can) or ceramic?  Might be useful to have a ceramic-type (usually has low ESR) of as large a value as you can find on there to help source the switching current better... Mostly I'm just looking for any quick fixes you may have at your disposal to bolster it
  7. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Gotcha.  I seem to recall 10uF was the minimum I needed for the nRF24 to behave, but more should hopefully be better.  It would only need to be on the DC-DC converter's VOUT or somewhere else on the Vcc net, doesn't really matter where.
  8. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Just remembered something else--what part did you use for the Inductor?  Rereading your first post I think you used the one that came with the lamp.  The schematic states that it's 10uH, but can it handle the peak current required by the boost regulator (~200mA per the TPS61097-33 datasheet, page 14)?
     
    FWIW, if you need to try something different I could mail you a couple 4.7uH's that's rated 650mA I think.  I've used it in my boost regulator projects (TPS61221 ~150mA output, needs up to 400mA switching current at the outlying max).  They are surface-mount (I think 1210-size).
  9. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    That is strange.  Only thing that jumps out at me is that on the RX side, when you read a new packet and get the size (s = r_rx_peek_payload_size() ... Check first to make sure 's' isn't 0 or >32, if it is, issue flush_rx() and continue without reading the payload or acting on it. I don't think this happens with AutoACK at 1Mbps and 2Mbps but it happens frequently at 250Kbps. Might not be your issue. But do check for this and set some flag--maybe an LED or an unused I/O pin you can probe with your multimeter--to experiment and see if one of those is happening.
     
    I take it that when you put a big comment block (e.g. /* ... */) around the START OFFENDING CODE ... END OFFENDING CODE block the problem goes away?
     
    Lastly, for the sake of being pedantic or whatever, the following is no longer necessary:
     
    if (rf_irq & RF24_IRQ_FLAGGED) { rf_irq &= ~RF24_IRQ_FLAGGED; msprf24_get_irq_reason(); }  
    Because msprf24_get_irq_reason() now clears the RF24_IRQ_FLAGGED bit in rf_irq.
  10. Like
    geodave reacted to roadrunner84 in Solar Driveway Light to MSP430 Wireless Sensor Node   
    I personally try to avoid embedded floating point calculations, as you're doing in the soil_temp() function. I see why you're doing it, but still...
    Also, I don't know for sure, but you're doing a calculation in Kelvin like:
    T = 1.0f / ((9.63666e-8 * R * R + 2.32134e-4) * R + 1.14061e-3);
    In which you multiply 9.63666*10-8 with R3, shouldn't you multiply by R2? (i.e: replace * R * R by * R)
  11. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Also for another project of mine where I am building nRF24L01+ based "temperature bugs", here's the code I used to get degrees:
    int adc_temp_read() { int adcval; long tempC, tempval; // Select temp sensor with ADC10CLK/4 ADC10CTL1 = INCH_10 | ADC10DIV_3; ADC10CTL0 = SREF_1 | ADC10SHT_3 | REFON | ADC10ON | ADC10IE; // 1.5V Vref sleep_counter = 1; WDTCTL = WDT_ADLY_16; // Wait 46ms for REF voltage to settle while (sleep_counter) LPM3; WDTCTL = WDT_ADLY_250; // Resume original setting adc_done = 0; ADC10CTL0 |= ENC | ADC10SC; // Start conversion while (!adc_done) LPM0; ADC10CTL0 &= ~ADC10IFG; adcval = ADC10MEM + ADC_CALIBRATION_OFFSET; // Calibration offset defined in "typebug.h" ADC10CTL0 &= ~ADC10ON; tempval = (long) adcval + ADCVAL_STATIC_OFFSET; tempC = (tempval * 27069 - 18169625) >> 16; // oPossum's formula: // http://forum.43oh.com/topic/1954-using-the-internal-temperature-sensor/ return (int)tempC; }  
    The ADCVAL_STATIC_OFFSET is a #define at the top of the file I intend to tweak to dial out some of the error (this was showing 20C aka 68F on the basement floor when my infrared thermometer was showing ~60F, and I think the IR thermometer was more correct based on how my feet felt on that floor... lol)
    But just to keep things simple I declare a long integer to temporarily hold the ADC value and then work with that
  12. Like
    geodave reacted to spirilis in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Nice project & code!  One word of caution with the nRF24 handler code (your main while(1) loop)--
     
    w_tx_payload(32, buf); msprf24_activate_tx(); LPM4; // Put the RF transceiver back to sleep msprf24_powerdown();  
    After that LPM4, when the chip wakes back up, you really want to be sure to check the nRF24's IRQ and clear (acknowledge) it... something like-
    msprf24_irq_clear( msprf24_get_irq_reason() );  
    Otherwise the nRF24 module may remain with its IRQ pin active perpetually so the next time you transmit, the MSP430 won't detect the IRQ since it's watching for a transition (that might not occur).  I haven't tried this particular case so I'm not 100% sure that's true, but it follows what I understand about the nRF24L01+'s general flow.
     
    Furthermore, with Enhanced ShockBurst (autoack) enabled, if the transmission does fail after the 15 retries, it will not let you send any new packets at all until the IRQ has been acknowledged.
     
    Lastly, for nrf_userconfig.h, comment out the "Settings for 16MHz MCLK" section and uncomment the "Settings for 1MHz MCLK" part since you're using 1MHz DCO... It's not strictly necessary (at 1MHz MCLK it'll just pause for 16 times as long as it should, if you're using the Settings for 16MHz MCLK defines) but can help button up the power consumption a tad
  13. Like
    geodave got a reaction from Rickta59 in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Baby boy was born and I have been sick for a week and a half so that has slowed my progress.  I did play with the bypass switch on the DC booster and came to the conclusion that I need to reduce the total resistance over R2 and R3 to 340kohms down from 400kohms.  This seems to work well, though, I haven't been able to determine the exact switching voltage because the datasheet is confusing in that regard.  I think it is turning on the voltage bypass switch at between 1.1 and 1.2v.        
     
    I have been reading about character arrays and sprintf and trying to come up with a good way to pass the sensor data to the nRF24L01+.  I have been able to successfully pass data using the tx code I wrote below.  I am using another MSP430 and  nRF24L01+ pair and Ike's basic rx example to display the buf char array in the Expression tab in CCS Debug mode.  I can see the correct data with the ; delimiter so I know it is working.  I am currently trying to figure out the most efficient way to simply echo the buffer data over the UART in comma delimited form.  I have been looking at spirilis code which sends temperature data over UART (http://forum.43oh.com/topic/2050-nrf24l01-registerscommands-and-functionswork-in-progress/).  It has been helpful but I still don't have a good idea of how I will accomplish this task.  
     
    This is the tx code I came up with which works okay except I haven't been able to get my thermister code to work:
    #include "msp430g2553.h" #include "msprf24.h" #include "nrf_userconfig.h" #include "stdio.h" //for sprintf const char txaddr[] = {0xDE, 0xAD, 0xBE, 0xEF, 0x00}; void main(void) { //Setup Clocks DCOCTL = CALDCO_1MHZ; //Internal oscillators frequency BCSCTL1 |= DIVA_1; // ACLK/8 - wake up about every 26 seconds (WHEN DIVA_3 - about 6 seconds for DIV 1) BCSCTL2 = DIVS_0; // SMCLK = DCOCLK/0 - SPI (USCI) uses SMCLK, prefer SMCLK < 10MHz (SPI speed limit for nRF24 = 10MHz) BCSCTL3 |= LFXT1S_2; // ACLK = VLO //Initiate Watchdog Timer WDTCTL = WDT_ADLY_1000; // Interval timer - 1000ms IE1 |= WDTIE; // Enable WDT interrupt //Set inputs/outputs P2DIR = BIT0 + BIT1; //2.0 and 2.1 Output //Initiate Wireless Module - Initial values for nRF24L01+ library config variables rf_crc = RF24_EN_CRC | RF24_CRCO; // CRC enabled, 16-bit rf_addr_width = 5; rf_speed_power = RF24_SPEED_1MBPS | RF24_POWER_0DBM; rf_channel = 120; msprf24_init(); // All RX pipes closed by default msprf24_set_pipe_packetsize(0, 32); msprf24_open_pipe(0, 1); // Open pipe#0 with Enhanced ShockBurst enabled for receiving Auto-ACKs //Main Loop while(1) { //Delay sensor read and transmission static int delay = 0; delay++; if (delay == 1){ // 26 seconds for each 1 delay - when BCSCTL1 |= DIVA_3 char buf[32]; // Online the nRF24L01+ transceiver msprf24_standby(); flush_tx(); //Compose RF Message int MCU = chip_temp(); //int Temp = soil_temp(); //(ISSUE!) int Soil = soil_moist(); int Sun = light_sensor(); sprintf(buf, "%d;%d;%d;%d", Sun, Soil, Temp, MCU); //Setup radio and transmit message w_tx_addr( (char*)txaddr ); w_rx_addr(0, (char*)txaddr ); // Pipe 0 receives auto-ack's, autoacks are sent back to the TX addr so the PTX node // needs to listen to the TX addr on pipe#0 to receive them. w_tx_payload(32, buf); msprf24_activate_tx(); LPM4; // Put the RF transceiver back to sleep msprf24_powerdown(); delay = 0; } _BIS_SR(LPM3_bits + GIE); // Enter LPM3 } } #pragma vector=WDT_VECTOR __interrupt void watchdog_timer (void) { _BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR) }  
    Here is my nRF24L01+ configuration code:
    /* nrf_userconfig.h * User configuration of nRF24L01+ connectivity parameters, e.g. * IRQ, CSN, CE pin assignments, Serial SPI driver type * * * Copyright (c) 2012, Eric Brundick <spirilis@linux.com> * * Permission to use, copy, modify, and/or distribute this software for any purpose * with or without fee is hereby granted, provided that the above copyright notice * and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef _NRF_USERCONFIG_H #define _NRF_USERCONFIG_H /* CPU clock cycles for the specified amounts of time--accurate minimum delays * required for reliable operation of the nRF24L01+'s state machine. */ /* Settings for 1MHz MCLK. #define DELAY_CYCLES_5MS 5000 #define DELAY_CYCLES_130US 130 #define DELAY_CYCLES_15US 15 */ /* Settings for 8MHz MCLK. #define DELAY_CYCLES_5MS 40000 #define DELAY_CYCLES_130US 1040 #define DELAY_CYCLES_15US 120 */ /* Settings for 16MHz MCLK */ #define DELAY_CYCLES_5MS 80000 #define DELAY_CYCLES_130US 2080 #define DELAY_CYCLES_15US 240 /* Settings for 24MHz MCLK. #define DELAY_CYCLES_5MS 120000 #define DELAY_CYCLES_130US 3120 #define DELAY_CYCLES_15US 360 */ /* SPI port--Select which USCI port we're using. * Applies only to USCI devices. USI users can keep these * commented out. */ //#define RF24_SPI_DRIVER_USCI_A 1 #define RF24_SPI_DRIVER_USCI_B 1 /* Define whether this library should use LPM0+IRQs during SPI I/O and whether this library should provide the ISR. */ #define RF24_SPI_DRIVER_USCI_USE_IRQ 1 #define RF24_SPI_DRIVER_USCI_PROVIDE_ISR 1 /* Operational pins -- IRQ, CE, CSN (SPI chip-select) */ /* IRQ */ #define nrfIRQport 2 #define nrfIRQpin BIT4 /* CSN SPI chip-select */ #define nrfCSNport 2 #define nrfCSNportout P2OUT #define nrfCSNpin BIT3 /* CE Chip-Enable (used to put RF transceiver on-air for RX or TX) */ #define nrfCEport 2 #define nrfCEportout P2OUT #define nrfCEpin BIT5 #endif  
    I put my ADC code into a separate c file to keep things clean on my main.c:
     
    #include "msp430g2553.h" #include "math.h" void disable_adc(void) { ADC10CTL0 &= ~ENC; ADC10CTL0 &= ~ADC10IFG; ADC10CTL0 &= ~REFON + ADC10ON; } void config_adc(void) { // Use Vcc/Vss for Up/Low Refs, 16 x ADC10CLKs, turn on ADC ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON; } int light_sensor() { unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 1, single channel mode ADC10CTL1 = INCH_0 + ADC10DIV_3; ADC10AE0 = BIT0; // Enable ADC input on P1.0 ADC10CTL0 |= ENC + ADC10SC; // Enable conversions.start a new conversion while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; while (ADC10CTL1 & ADC10BUSY); // wait for conversion to end disable_adc(); return adc; } int soil_temp() { unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 1, single channel mode ADC10CTL1 = INCH_4 + ADC10DIV_3; ADC10AE0 = BIT4; // Enable ADC input on P1.4 ADC10CTL0 |= ENC + ADC10SC; // Enable conversions.start a new conversion while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; //while (ADC10CTL1 & ADC10BUSY); // wait for conversion to end disable_adc(); double R, T; // These were calculated from the thermister data sheet // A = 2.3067434E-4; Vishay A: 1.14061e-3 // B = 2.3696596E-4; Vishay B: 2.32134e-4 // C = 1.2636414E-7; Vishay C: 9.63666e-8 // // This is the value of the other half of the voltage divider int Rknown = 10000; // Do the log once so as not to do it 4 times in the equation // R = log(((1024/(double)aval)-1)*(double)22200); //R = log((1 / ((1024 / (double) raw) - 1)) * (double) 10000); R = log(Rknown / ((1023.0f / (float)adc) - 1.0f)); // Compute degrees K T = 1.0f / ((9.63666e-8 * R * R + 2.32134e-4) * R + 1.14061e-3); // return degrees F int Temp = ((T - 273.15f) * (9.0f / 5.0f)) + 32.0f; return Temp; } int chip_temp() { unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 1, single channel mode ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON; ADC10CTL1 = INCH_10 + ADC10DIV_3; ADC10CTL0 |= ENC + ADC10SC; while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; disable_adc(); // return degrees F return (int)((adc * 48724L - 30634388L) >> 16); } void setSensorPolarity(int flip){ if(flip == 0){ P2OUT |= BIT0; P2OUT &= ~BIT1; }else{ P2OUT |= BIT1; P2OUT &= ~BIT0; } } int soil_moist(){ unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 3 ADC10CTL1 = INCH_3 + ADC10DIV_3; ADC10AE0 = BIT3; // Enable ADC input on P1.3 ADC10CTL0 |= ENC + ADC10SC; // Enable conversions.start a new conversion while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; while (ADC10CTL1 & ADC10BUSY); // wait for conversion to end disable_adc(); setSensorPolarity(0); __delay_cycles(2500); setSensorPolarity(1); __delay_cycles(2500); return adc; }  
     
    Any questions, concerns, comments would be greatly appreciated.  Be kind as I am a lowly geographer and I just started to teach myself programming.   
  14. Like
    geodave got a reaction from bluehash in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Baby boy was born and I have been sick for a week and a half so that has slowed my progress.  I did play with the bypass switch on the DC booster and came to the conclusion that I need to reduce the total resistance over R2 and R3 to 340kohms down from 400kohms.  This seems to work well, though, I haven't been able to determine the exact switching voltage because the datasheet is confusing in that regard.  I think it is turning on the voltage bypass switch at between 1.1 and 1.2v.        
     
    I have been reading about character arrays and sprintf and trying to come up with a good way to pass the sensor data to the nRF24L01+.  I have been able to successfully pass data using the tx code I wrote below.  I am using another MSP430 and  nRF24L01+ pair and Ike's basic rx example to display the buf char array in the Expression tab in CCS Debug mode.  I can see the correct data with the ; delimiter so I know it is working.  I am currently trying to figure out the most efficient way to simply echo the buffer data over the UART in comma delimited form.  I have been looking at spirilis code which sends temperature data over UART (http://forum.43oh.com/topic/2050-nrf24l01-registerscommands-and-functionswork-in-progress/).  It has been helpful but I still don't have a good idea of how I will accomplish this task.  
     
    This is the tx code I came up with which works okay except I haven't been able to get my thermister code to work:
    #include "msp430g2553.h" #include "msprf24.h" #include "nrf_userconfig.h" #include "stdio.h" //for sprintf const char txaddr[] = {0xDE, 0xAD, 0xBE, 0xEF, 0x00}; void main(void) { //Setup Clocks DCOCTL = CALDCO_1MHZ; //Internal oscillators frequency BCSCTL1 |= DIVA_1; // ACLK/8 - wake up about every 26 seconds (WHEN DIVA_3 - about 6 seconds for DIV 1) BCSCTL2 = DIVS_0; // SMCLK = DCOCLK/0 - SPI (USCI) uses SMCLK, prefer SMCLK < 10MHz (SPI speed limit for nRF24 = 10MHz) BCSCTL3 |= LFXT1S_2; // ACLK = VLO //Initiate Watchdog Timer WDTCTL = WDT_ADLY_1000; // Interval timer - 1000ms IE1 |= WDTIE; // Enable WDT interrupt //Set inputs/outputs P2DIR = BIT0 + BIT1; //2.0 and 2.1 Output //Initiate Wireless Module - Initial values for nRF24L01+ library config variables rf_crc = RF24_EN_CRC | RF24_CRCO; // CRC enabled, 16-bit rf_addr_width = 5; rf_speed_power = RF24_SPEED_1MBPS | RF24_POWER_0DBM; rf_channel = 120; msprf24_init(); // All RX pipes closed by default msprf24_set_pipe_packetsize(0, 32); msprf24_open_pipe(0, 1); // Open pipe#0 with Enhanced ShockBurst enabled for receiving Auto-ACKs //Main Loop while(1) { //Delay sensor read and transmission static int delay = 0; delay++; if (delay == 1){ // 26 seconds for each 1 delay - when BCSCTL1 |= DIVA_3 char buf[32]; // Online the nRF24L01+ transceiver msprf24_standby(); flush_tx(); //Compose RF Message int MCU = chip_temp(); //int Temp = soil_temp(); //(ISSUE!) int Soil = soil_moist(); int Sun = light_sensor(); sprintf(buf, "%d;%d;%d;%d", Sun, Soil, Temp, MCU); //Setup radio and transmit message w_tx_addr( (char*)txaddr ); w_rx_addr(0, (char*)txaddr ); // Pipe 0 receives auto-ack's, autoacks are sent back to the TX addr so the PTX node // needs to listen to the TX addr on pipe#0 to receive them. w_tx_payload(32, buf); msprf24_activate_tx(); LPM4; // Put the RF transceiver back to sleep msprf24_powerdown(); delay = 0; } _BIS_SR(LPM3_bits + GIE); // Enter LPM3 } } #pragma vector=WDT_VECTOR __interrupt void watchdog_timer (void) { _BIC_SR_IRQ(LPM3_bits); // Clear LPM3 bits from 0(SR) }  
    Here is my nRF24L01+ configuration code:
    /* nrf_userconfig.h * User configuration of nRF24L01+ connectivity parameters, e.g. * IRQ, CSN, CE pin assignments, Serial SPI driver type * * * Copyright (c) 2012, Eric Brundick <spirilis@linux.com> * * Permission to use, copy, modify, and/or distribute this software for any purpose * with or without fee is hereby granted, provided that the above copyright notice * and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifndef _NRF_USERCONFIG_H #define _NRF_USERCONFIG_H /* CPU clock cycles for the specified amounts of time--accurate minimum delays * required for reliable operation of the nRF24L01+'s state machine. */ /* Settings for 1MHz MCLK. #define DELAY_CYCLES_5MS 5000 #define DELAY_CYCLES_130US 130 #define DELAY_CYCLES_15US 15 */ /* Settings for 8MHz MCLK. #define DELAY_CYCLES_5MS 40000 #define DELAY_CYCLES_130US 1040 #define DELAY_CYCLES_15US 120 */ /* Settings for 16MHz MCLK */ #define DELAY_CYCLES_5MS 80000 #define DELAY_CYCLES_130US 2080 #define DELAY_CYCLES_15US 240 /* Settings for 24MHz MCLK. #define DELAY_CYCLES_5MS 120000 #define DELAY_CYCLES_130US 3120 #define DELAY_CYCLES_15US 360 */ /* SPI port--Select which USCI port we're using. * Applies only to USCI devices. USI users can keep these * commented out. */ //#define RF24_SPI_DRIVER_USCI_A 1 #define RF24_SPI_DRIVER_USCI_B 1 /* Define whether this library should use LPM0+IRQs during SPI I/O and whether this library should provide the ISR. */ #define RF24_SPI_DRIVER_USCI_USE_IRQ 1 #define RF24_SPI_DRIVER_USCI_PROVIDE_ISR 1 /* Operational pins -- IRQ, CE, CSN (SPI chip-select) */ /* IRQ */ #define nrfIRQport 2 #define nrfIRQpin BIT4 /* CSN SPI chip-select */ #define nrfCSNport 2 #define nrfCSNportout P2OUT #define nrfCSNpin BIT3 /* CE Chip-Enable (used to put RF transceiver on-air for RX or TX) */ #define nrfCEport 2 #define nrfCEportout P2OUT #define nrfCEpin BIT5 #endif  
    I put my ADC code into a separate c file to keep things clean on my main.c:
     
    #include "msp430g2553.h" #include "math.h" void disable_adc(void) { ADC10CTL0 &= ~ENC; ADC10CTL0 &= ~ADC10IFG; ADC10CTL0 &= ~REFON + ADC10ON; } void config_adc(void) { // Use Vcc/Vss for Up/Low Refs, 16 x ADC10CLKs, turn on ADC ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON; } int light_sensor() { unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 1, single channel mode ADC10CTL1 = INCH_0 + ADC10DIV_3; ADC10AE0 = BIT0; // Enable ADC input on P1.0 ADC10CTL0 |= ENC + ADC10SC; // Enable conversions.start a new conversion while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; while (ADC10CTL1 & ADC10BUSY); // wait for conversion to end disable_adc(); return adc; } int soil_temp() { unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 1, single channel mode ADC10CTL1 = INCH_4 + ADC10DIV_3; ADC10AE0 = BIT4; // Enable ADC input on P1.4 ADC10CTL0 |= ENC + ADC10SC; // Enable conversions.start a new conversion while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; //while (ADC10CTL1 & ADC10BUSY); // wait for conversion to end disable_adc(); double R, T; // These were calculated from the thermister data sheet // A = 2.3067434E-4; Vishay A: 1.14061e-3 // B = 2.3696596E-4; Vishay B: 2.32134e-4 // C = 1.2636414E-7; Vishay C: 9.63666e-8 // // This is the value of the other half of the voltage divider int Rknown = 10000; // Do the log once so as not to do it 4 times in the equation // R = log(((1024/(double)aval)-1)*(double)22200); //R = log((1 / ((1024 / (double) raw) - 1)) * (double) 10000); R = log(Rknown / ((1023.0f / (float)adc) - 1.0f)); // Compute degrees K T = 1.0f / ((9.63666e-8 * R * R + 2.32134e-4) * R + 1.14061e-3); // return degrees F int Temp = ((T - 273.15f) * (9.0f / 5.0f)) + 32.0f; return Temp; } int chip_temp() { unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 1, single channel mode ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON; ADC10CTL1 = INCH_10 + ADC10DIV_3; ADC10CTL0 |= ENC + ADC10SC; while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; disable_adc(); // return degrees F return (int)((adc * 48724L - 30634388L) >> 16); } void setSensorPolarity(int flip){ if(flip == 0){ P2OUT |= BIT0; P2OUT &= ~BIT1; }else{ P2OUT |= BIT1; P2OUT &= ~BIT0; } } int soil_moist(){ unsigned adc; disable_adc(); config_adc(); // A1 input, use ADC10CLK div 3 ADC10CTL1 = INCH_3 + ADC10DIV_3; ADC10AE0 = BIT3; // Enable ADC input on P1.3 ADC10CTL0 |= ENC + ADC10SC; // Enable conversions.start a new conversion while (!(ADC10CTL0 & ADC10IFG)) /* wait until conversion is completed */ ; adc = ADC10MEM; while (ADC10CTL1 & ADC10BUSY); // wait for conversion to end disable_adc(); setSensorPolarity(0); __delay_cycles(2500); setSensorPolarity(1); __delay_cycles(2500); return adc; }  
     
    Any questions, concerns, comments would be greatly appreciated.  Be kind as I am a lowly geographer and I just started to teach myself programming.   
  15. Like
    geodave got a reaction from tingo in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Greetings!  I am new to the forum and this is my first solo microcontroller project.  Please be kind to me as I am a Geographer and by no means a programmer or electrical engineer.  Stupid questions should be expected.    
     
    The basic idea of this project is to convert a $3-4 solar light found at Lowes and Home Depot hardware store (here in the US) into a wireless remote sensor node.  The node will utilize an MSP430G2553 MCU and a nRF24L01+(w/ spirilis library) wireless module to send light intensity (photoresitor that came with solar driveway light), soil moisture (design from http://gardenbot.org), and soil temperature data (10k thermistor coated in silicon) wirelessly from my garden to another MSP430G2553 and nRF24L01+ sitting on top of a Raspberry Pi.  This data will then be sent over the Raspberry Pi UART to a python script running on the Raspberry Pi which logs the data into a CSV and JSON file (code inspired by Uberfridge).  An Apache server will also run on the Rapsberry Pi and the JSON data will be displayed via the Javascript Flot chart library.  The node on the Raspberry Pi will also have a transistor that switches a water Solenoid attached to my garden hose based upon the soil moisture.        
     
    Photo 1.  The $4 light from Lowes Hardware.  Portfolio Landscape brand Model #0379420 (http://tinyurl.com/cn4e684)

     
    Photo 2.  I like that it has a nice battery compartment and comes with a 800Mah AA Battery.  

     
     
    Photo 3.  The inside of the light.  Contains a chip which boosts the 1.2v battery to 5.0v to power the LED.  Comes with an inductor and diode that can be reused.

     
    I taught myself Eagle Autocad and created a schematic/board to replace the stock board inside the solar light.  My board utilizes a Texas Instrument TPS61097 (free sample) which converts the 1.2v from the batter to 3.3v to power the MSP430.  Version 1 of the board is shown below with just the power circuitry populated (Photo 6).   I put a jumper wire on the TPS61097 between the EN and VIN because I wasn't able to get the bypass switch (Page 16 of the schematic http://www.ti.com/lit/ds/symlink/tps61097-33.pdf ) to work correctly.  I had 200k resistors on R1 and R2 (actually 2x100k 1% in series each...didn't have any 200k on hand) which didn't work (bypass switch stays on) so I jumpered EN and VIN and now get the full 3.3v.  I would like to get this bypass feature enabled.  Any ideas where I am going wrong here?  I assume the resistor values are incorrect for the 1.2v battery.    
     
    Photos 4 and 5.  Board Mockups from OSHPark
              
     
    Photo 6.  V1.0 of the board received 3/20/2013. Partially populated (no time!!!).  Two green wires are from stock photoresistor (not yet connected).

     
    Photo 7.  Schematic for v1.0

     
    Current Project Status:  Basic code for Raspberry Pi done (python and Flot charting), code written that reads sensors and sends comma delimited sensor data over Raspberry Pi UART,  v1.0 solar light board done and receive today from OSHPark (3/20/2013).
     
    Current Activities:  Waiting for my second child to be born and testing the charging and booster circuit. 
     
    Still to do:  Get nRF24L01+code working with my existing code and design Raspberry Pi Node (current version on rough protoboard board).   I did start playing with my nRF24L01+ modules and was able to send my name through the character buffer array.  I need to find the best way to send this data through the nRF24L01+ module and print it to the UART attached to the Raspberry Pi.     
     
    I hope you guys enjoy my project idea and with your help I will hopefully finish.  I will post schematics/boards, code, etc when it is more complete.  My wife is due next week so things will likely progress slowly.   
     
    The code I do post will likely be messy.  If you like my project feel free to help me clean it up but please do explain whatever you do in layman terms.  I am not as lay as I use to be with electronics/programming but much more lay than most of you folks!  Cheers!
  16. Like
    geodave got a reaction from roadrunner84 in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Greetings!  I am new to the forum and this is my first solo microcontroller project.  Please be kind to me as I am a Geographer and by no means a programmer or electrical engineer.  Stupid questions should be expected.    
     
    The basic idea of this project is to convert a $3-4 solar light found at Lowes and Home Depot hardware store (here in the US) into a wireless remote sensor node.  The node will utilize an MSP430G2553 MCU and a nRF24L01+(w/ spirilis library) wireless module to send light intensity (photoresitor that came with solar driveway light), soil moisture (design from http://gardenbot.org), and soil temperature data (10k thermistor coated in silicon) wirelessly from my garden to another MSP430G2553 and nRF24L01+ sitting on top of a Raspberry Pi.  This data will then be sent over the Raspberry Pi UART to a python script running on the Raspberry Pi which logs the data into a CSV and JSON file (code inspired by Uberfridge).  An Apache server will also run on the Rapsberry Pi and the JSON data will be displayed via the Javascript Flot chart library.  The node on the Raspberry Pi will also have a transistor that switches a water Solenoid attached to my garden hose based upon the soil moisture.        
     
    Photo 1.  The $4 light from Lowes Hardware.  Portfolio Landscape brand Model #0379420 (http://tinyurl.com/cn4e684)

     
    Photo 2.  I like that it has a nice battery compartment and comes with a 800Mah AA Battery.  

     
     
    Photo 3.  The inside of the light.  Contains a chip which boosts the 1.2v battery to 5.0v to power the LED.  Comes with an inductor and diode that can be reused.

     
    I taught myself Eagle Autocad and created a schematic/board to replace the stock board inside the solar light.  My board utilizes a Texas Instrument TPS61097 (free sample) which converts the 1.2v from the batter to 3.3v to power the MSP430.  Version 1 of the board is shown below with just the power circuitry populated (Photo 6).   I put a jumper wire on the TPS61097 between the EN and VIN because I wasn't able to get the bypass switch (Page 16 of the schematic http://www.ti.com/lit/ds/symlink/tps61097-33.pdf ) to work correctly.  I had 200k resistors on R1 and R2 (actually 2x100k 1% in series each...didn't have any 200k on hand) which didn't work (bypass switch stays on) so I jumpered EN and VIN and now get the full 3.3v.  I would like to get this bypass feature enabled.  Any ideas where I am going wrong here?  I assume the resistor values are incorrect for the 1.2v battery.    
     
    Photos 4 and 5.  Board Mockups from OSHPark
              
     
    Photo 6.  V1.0 of the board received 3/20/2013. Partially populated (no time!!!).  Two green wires are from stock photoresistor (not yet connected).

     
    Photo 7.  Schematic for v1.0

     
    Current Project Status:  Basic code for Raspberry Pi done (python and Flot charting), code written that reads sensors and sends comma delimited sensor data over Raspberry Pi UART,  v1.0 solar light board done and receive today from OSHPark (3/20/2013).
     
    Current Activities:  Waiting for my second child to be born and testing the charging and booster circuit. 
     
    Still to do:  Get nRF24L01+code working with my existing code and design Raspberry Pi Node (current version on rough protoboard board).   I did start playing with my nRF24L01+ modules and was able to send my name through the character buffer array.  I need to find the best way to send this data through the nRF24L01+ module and print it to the UART attached to the Raspberry Pi.     
     
    I hope you guys enjoy my project idea and with your help I will hopefully finish.  I will post schematics/boards, code, etc when it is more complete.  My wife is due next week so things will likely progress slowly.   
     
    The code I do post will likely be messy.  If you like my project feel free to help me clean it up but please do explain whatever you do in layman terms.  I am not as lay as I use to be with electronics/programming but much more lay than most of you folks!  Cheers!
  17. Like
    geodave got a reaction from SirPatrick in Solar Driveway Light to MSP430 Wireless Sensor Node   
    Greetings!  I am new to the forum and this is my first solo microcontroller project.  Please be kind to me as I am a Geographer and by no means a programmer or electrical engineer.  Stupid questions should be expected.    
     
    The basic idea of this project is to convert a $3-4 solar light found at Lowes and Home Depot hardware store (here in the US) into a wireless remote sensor node.  The node will utilize an MSP430G2553 MCU and a nRF24L01+(w/ spirilis library) wireless module to send light intensity (photoresitor that came with solar driveway light), soil moisture (design from http://gardenbot.org), and soil temperature data (10k thermistor coated in silicon) wirelessly from my garden to another MSP430G2553 and nRF24L01+ sitting on top of a Raspberry Pi.  This data will then be sent over the Raspberry Pi UART to a python script running on the Raspberry Pi which logs the data into a CSV and JSON file (code inspired by Uberfridge).  An Apache server will also run on the Rapsberry Pi and the JSON data will be displayed via the Javascript Flot chart library.  The node on the Raspberry Pi will also have a transistor that switches a water Solenoid attached to my garden hose based upon the soil moisture.        
     
    Photo 1.  The $4 light from Lowes Hardware.  Portfolio Landscape brand Model #0379420 (http://tinyurl.com/cn4e684)

     
    Photo 2.  I like that it has a nice battery compartment and comes with a 800Mah AA Battery.  

     
     
    Photo 3.  The inside of the light.  Contains a chip which boosts the 1.2v battery to 5.0v to power the LED.  Comes with an inductor and diode that can be reused.

     
    I taught myself Eagle Autocad and created a schematic/board to replace the stock board inside the solar light.  My board utilizes a Texas Instrument TPS61097 (free sample) which converts the 1.2v from the batter to 3.3v to power the MSP430.  Version 1 of the board is shown below with just the power circuitry populated (Photo 6).   I put a jumper wire on the TPS61097 between the EN and VIN because I wasn't able to get the bypass switch (Page 16 of the schematic http://www.ti.com/lit/ds/symlink/tps61097-33.pdf ) to work correctly.  I had 200k resistors on R1 and R2 (actually 2x100k 1% in series each...didn't have any 200k on hand) which didn't work (bypass switch stays on) so I jumpered EN and VIN and now get the full 3.3v.  I would like to get this bypass feature enabled.  Any ideas where I am going wrong here?  I assume the resistor values are incorrect for the 1.2v battery.    
     
    Photos 4 and 5.  Board Mockups from OSHPark
              
     
    Photo 6.  V1.0 of the board received 3/20/2013. Partially populated (no time!!!).  Two green wires are from stock photoresistor (not yet connected).

     
    Photo 7.  Schematic for v1.0

     
    Current Project Status:  Basic code for Raspberry Pi done (python and Flot charting), code written that reads sensors and sends comma delimited sensor data over Raspberry Pi UART,  v1.0 solar light board done and receive today from OSHPark (3/20/2013).
     
    Current Activities:  Waiting for my second child to be born and testing the charging and booster circuit. 
     
    Still to do:  Get nRF24L01+code working with my existing code and design Raspberry Pi Node (current version on rough protoboard board).   I did start playing with my nRF24L01+ modules and was able to send my name through the character buffer array.  I need to find the best way to send this data through the nRF24L01+ module and print it to the UART attached to the Raspberry Pi.     
     
    I hope you guys enjoy my project idea and with your help I will hopefully finish.  I will post schematics/boards, code, etc when it is more complete.  My wife is due next week so things will likely progress slowly.   
     
    The code I do post will likely be messy.  If you like my project feel free to help me clean it up but please do explain whatever you do in layman terms.  I am not as lay as I use to be with electronics/programming but much more lay than most of you folks!  Cheers!
  18. Like
    geodave got a reaction from SirPatrick in Hello from Raleigh, North Carolina   
    Greeting!  I am a Geographer by trade with a background in remote sensing. I originally discovered electronics and microcontrollers when trying to find an economical way to automatically control the temperature of my BBQ smoker.  I stumbled upon the Arduino based "Linkmeter" PID Smoker controller project (Google it), built a couple of those, and fell in love with the idea of designing and building my own electronics.  It has been a long and slow learning process but forums like this have really made all the difference.  I am hoping I can combine all of the knowledge I have collected over the past couple years to build a solar powered wireless garden monitoring and watering control system based on the MSP430G2553 and Raspberry Pi.  Perhaps another post of that soon...    
     
    I stumbled upon the MSP430 line of microcontrollers about three months ago and I am in love.  I stalled out on the Arduino platform because I kept running into coding issues that I had difficulty troubleshooting.  I like the Launchpad platform much better than the Arduino because of the debugging capabilities of CCS.  I am learning about 10 times faster with the debugger.  Thanks for all the help in advance!   
  19. Like
    geodave got a reaction from Rickta59 in Hello from Raleigh, North Carolina   
    Greeting!  I am a Geographer by trade with a background in remote sensing. I originally discovered electronics and microcontrollers when trying to find an economical way to automatically control the temperature of my BBQ smoker.  I stumbled upon the Arduino based "Linkmeter" PID Smoker controller project (Google it), built a couple of those, and fell in love with the idea of designing and building my own electronics.  It has been a long and slow learning process but forums like this have really made all the difference.  I am hoping I can combine all of the knowledge I have collected over the past couple years to build a solar powered wireless garden monitoring and watering control system based on the MSP430G2553 and Raspberry Pi.  Perhaps another post of that soon...    
     
    I stumbled upon the MSP430 line of microcontrollers about three months ago and I am in love.  I stalled out on the Arduino platform because I kept running into coding issues that I had difficulty troubleshooting.  I like the Launchpad platform much better than the Arduino because of the debugging capabilities of CCS.  I am learning about 10 times faster with the debugger.  Thanks for all the help in advance!   
  20. Like
    geodave got a reaction from spirilis in Charcoal Grill / Smoker Monitor   
    Beautiful work spirilis!  I love seeing these smoker projects!  I am sure you have seen the Arduino based "Linkmeter" PID BBQ controller project.  I have a v3.0 of that controller which uses a Linksys router.  The newer version (v4.0) sits on top of a Raspberry Pi.  Here is the link:  http://tvwbb.com/forumdisplay.php?85-LinkMeter-v2-Homebrew-BBQ-Controller
     
    I just started playing with the Launchpad and MSP430G2553 about three months ago and I like it much more than the Arduino platform.  Mainly because the Arduino is hard to debug for a non-programmer.  The debugging capabilities in CSS are great for figuring out what you are doing wrong!  I have managed to get my MSP430 to send comma delimited over the UART to my PI which logs the data in a JSON and CSV file.  I am running an Apache server on the Pi which I use to display the JSON data using the javascript Flot charting library. I just got a couple of these nrf24L0+ for $1.43 a piece shipped from ebay.  I got Ike's example going pretty quickly.  I am hoping I can figure out how I can use your library to extend my UART so I can have a remote sensor node for my garden.  We will see how that goes.  It would be nice to see a non-Energia UART example...when/if you ever get some time.  I have learned a lot from guys like you who take time to write libraries and blogs about how to do cool things with microcontrollers.  It really is a public service and I really appreciate your effort!      
×
×
  • Create New...