Why does'nt my ProMicro respond

Hello guys,

Still on the path of the ProMicro...

I have this sketch of code from the internet to measure altitude (among other things) by a BMP180.
After successfully (according to the compiler) loading the code, I expected some results on my serial monitor.
But nothing happens.

Now, I've tried a couple of things.
There is one issue concerning the board running on 3,3V but with 16Mhz. That is likely NOT the problem.
I've discussed that one in another forum topic and I have successfully loaded other codes on this board.
So please, no fingerpointing to that one. It is covered... It has nothing to do with my issue. :wink:

Why does my serial monitor not give me feedback?
There are a lot of reasons to print to the SM, but it does not happen.
I disconnected the BMP180 to rule that one out. If I'm correct, I had to get some error message on the SM, but again... nothing.

I think it is something simple I'm missing.
Can you help me out somewhat?

#include <SFE_BMP180.h>
#include <Wire.h>
// You will need to create an SFE_BMP180 object, here called "pressure":
SFE_BMP180 pressure;
#define ALTITUDE 66.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters
void setup()
{
  Serial.begin(9600);
  Serial.println("REBOOT");
  // Initialize the sensor (it is important to get calibration values stored on the device).
  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    // Oops, something went wrong, this is usually a connection problem,
    // see the comments at the top of this sketch for the proper connections.
    Serial.println("BMP180 init fail\n\n");
    while(1); // Pause forever.
  }
}
void loop()
{
  char status;
  double T,P,p0,a;
  // Loop here getting pressure readings every 10 seconds.
  // If you want sea-level-compensated pressure, as used in weather reports,
  // you will need to know the altitude at which your measurements are taken.
  // We're using a constant called ALTITUDE in this sketch:
  
  Serial.println();
  Serial.print("provided altitude: ");
  Serial.print(ALTITUDE,0);
  Serial.print(" meters, ");
  Serial.print(ALTITUDE*3.28084,0);
  Serial.println(" feet");
  
  // If you want to measure altitude, and not pressure, you will instead need
  // to provide a known baseline pressure. This is shown at the end of the sketch.
  // You must first get a temperature measurement to perform a pressure reading.
  
  // Start a temperature measurement:
  // If request is successful, the number of ms to wait is returned.
  // If request is unsuccessful, 0 is returned.
  status = pressure.startTemperature();
  if (status != 0)
  {
    // Wait for the measurement to complete:
    delay(status);
    // Retrieve the completed temperature measurement:
    // Note that the measurement is stored in the variable T.
    // Function returns 1 if successful, 0 if failure.
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // Print out the measurement:
      Serial.print("temperature: ");
      Serial.print(T,2);
      Serial.print(" deg C, ");
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" deg F");
      
      // Start a pressure measurement:
      // The parameter is the oversampling setting, from 0 to 3 (highest res, longest wait).
      // If request is successful, the number of ms to wait is returned.
      // If request is unsuccessful, 0 is returned.
      status = pressure.startPressure(3);
      if (status != 0)
      {
        // Wait for the measurement to complete:
        delay(status);
        // Retrieve the completed pressure measurement:
        // Note that the measurement is stored in the variable P.
        // Note also that the function requires the previous temperature measurement (T).
        // (If temperature is stable, you can do one temperature measurement for a number of 
        // pressure measurements.)
        // Function returns 1 if successful, 0 if failure.
        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // Print out the measurement:
          Serial.print("absolute pressure: ");
          Serial.print(P,2);
          Serial.print(" mb, ");
          Serial.print(P*0.0295333727,2);
          Serial.println(" inHg");
          // The pressure sensor returns abolute pressure, which varies with altitude.
          // To remove the effects of altitude, use the sealevel function and your current 
          // altitude.
          // This number is commonly used in weather reports.
          // Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.
          // Result: p0 = sea-level compensated pressure in mb
          p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
          Serial.print("relative (sea-level) pressure: ");
          Serial.print(p0,2);
          Serial.print(" mb, ");
          Serial.print(p0*0.0295333727,2);
          Serial.println(" inHg");
          // On the other hand, if you want to determine your altitude from the pressure reading,
          // use the altitude function along with a baseline pressure (sea-level or other).
          // Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.
          // Result: a = altitude in m.
          a = pressure.altitude(P,p0);
          Serial.print("computed altitude: ");
          Serial.print(a,0);
          Serial.print(" meters, ");
          Serial.print(a*3.28084,0);
          Serial.println(" feet");
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");
  delay(5000);  // Pause for 5 seconds.
}

Usually, you will put

while(!Serial);

in your setup() function before you start printing.

Your code will hang there till a connection with the PC is established.

Note: you can bring your ProMicro to a near grinding halt if you disconnect the ProMicro (externally powered) from the PC while printing (in e.g. loop()). Use availableForWrite() to check if there is space to print.

So, if I get this correct, this will solve the issue of getting no response on the serial monitor?
But that piece of code is only in the setup.
Does that work for the entire code?
Or is it only necessary to establish the right communications?

And why is this solution never implemented by the writer of the code, I ask myself...
Or is this establishing of comms something that is more needed with the ProMicro?
The code was essentially written for the Uno.

I have the ProMicro hooked up by USB for power. So, loss of comms also means loss of power.
It is just for testing. Eventually, I will use it standalone with no connection to the PC/Serial monitor.

You can easily test if it solves the problem :wink:

As I tried to explain, it waits there till communication with the PC is established. You will have to remove it for the final stand-alone version.

Once communication is established, it will stay established inside the Arduino, even if you disconnect (as described).

Alternatively, you can put each print inside an if

// if connection with PC established
if(Serial)
{
  Serial.println(yourData);
}

I do not know where your code came from. The writer of the code might have used an other board (e.g. Uno) where the while(!Serial) is not needed; it's only needed for serial communication with boards that have native USB.

Thanks so much, Sterretje!
Je weet me goed vooruit te helpen. :wink:

Nicely explained and very educational!