Strange problem: RFM95 + LMIC-Arduino, long JOIN delays and missing frames

Have you relaxed LMIC timing? The ATmega32 Pro Mini 3.3V is relatively slow (for LMIC) and needs this adjustment. See below:

If you don’t relax timing the OTAA join will fail on the lowest spreading factors (starts the first join at SB7). In which case it will do several retries and gradually increase the spreading factor until it reaches one where it receives the JOIN ACCEPT without timing issues.
But this does not explain why you do not see the framecounter starting at 0.

Some remarks:

  • “A $10 Arduino Pro Mini and a $5 bare RFM95 module from China”
    That’s a relatively expensive Pro Mini. When ordering the RFM95 in China a Pro Mini can be ordered there for less than $1.50.

  • A more correct topic title would be “Evaluating RFM95 + Arduino LMIC versus RN2903 for DIY nodes”.
    (Even more correct is to use “LMIC-Arduino” because that is the real name of the library".)

  • “and I don’t understand why anyone would design an Arduino board around one”.
    Because it generates simpler and more compact boards that require less components with built-in USB support. You can even make the board a true USB device (not just use it for serial over USB).
    Yes it is t is easier and more comfortable if you only have to select ‘upload’ from your IDE, but pressing a reset button before every upload is not a huge task. The ATmega32u4 is not the only microcontroller with such behavior. Using STM32 microcontrollers can have similar behavior when used with the Arduino framework (depending on the controller and used upload method).
    If you use a few boards for generic prototyping then you will probably upload to them often. If you have multiple boards in use for dedicated purposes then you will normally do very little uploads once the board is running. Having to press a reset button is not such an issue then.
    (I don’t have a Things Node so I have no experience with possible picky behavior of its reset button.)

  • When you need the serial port over USB in your sketch it may not be ready yet when your Arduino setup() function runs. In that case you can wait for the serial port to become ready and even use a timeout and continue in case there is no serial port connected via USB (i.e. when the board runs unconnected).
    You do not have to wait for the Serial monitor in setup but with ATmega32u4 if you don’t you will very probably miss your first output.