[Dprglist] Arduino Code Troubles

John Gauthier zizumara at sbcglobal.net
Fri Dec 17 13:28:51 PST 2021


As a side note, I believe there is great value in defensive programming 
as a habit.  In my code, I always use macros to define constants, 
especially when using them as indicies of an array representing a 
message.  In this case, you could use

#define US_LEFT   0
#define US_MID    1
#define US_RIGHT  2
#define IR_LEFT   3
#define IR_RIGHT  4
#define TIME_DIFF 5
#define BUFF_SIZE 8

#define SONAR_NUM 3
#define IR_NUM    2
#define MAX_DISTANCE 200
#define DIST_UNKNOWN 999

assert(SONAR_NUM + IR_NUM <= BUFF_SIZE);

uint32_t cm[BUFF_SIZE];
for (i = 0; i < BUFF_SIZE; ++i) {
    cm[i] = 0;
}

irSensorL.read();
cm[IR_LEFT] = irSensorL.ranging_data.range_mm / 10;
if (cm[IR_LEFT] > MAX_DISTANCE) {
    cm[IR_LEFT] = DIST_UNKNOWN;
}

Coding constants with macros makes it hard to make mistakes, especially 
when making modifications to the code.  It also makes reading
the code much easier.  This was a C coding standard at two companies 
where I have worked.


John G.

 >      uint16_t maxDistance = 200; // Also used with NewPing.h library
 >      .
 >      . // Other code here
 >      .
 >      irSensorL.read(); // Read IR sensor... This is working!
 >      cm[3] = irSensorL.ranging_data.range_mm/10; // This returns 268
 >      if (cm[3] > maxDistance) {
 >        cm[3] = 999;                 /
 >      }
 >      Serial.println(cm[3]);  / cm[3] value is always = 999
 >      sendData();
On 12/17/2021 10:13 AM, Pat Caron via DPRGlist wrote:
>
> What I meant to say last night is the array size is cm[8].  The values 
> for SONAR_NUM == 3 and IR_NUM == 2
> This should not be overrunning the array as it only loops through 5 times.
> I have tried setting maxDistance as uint32_t without any difference.
> I have commented out the sendData() function and added some 
> Serial.print statements prior to reassigning the values. (shown in output)
>
> #define SONAR_NUM 3
> #define IR_NUM 2
> uint32_t cm[8] = {0,0,0,0,0,0,0,0}; // Create array
> uint16_t maxDistance = 200; // Also used with NewPing.h libraray
> char *position[] = {"us_Left", "us_Mid", "us_Right", "ir_Left", 
> "ir_Right", "cm[5]", "cm[6]", "cm[7]"};
> .
> . // Other code here
> .
>
> void oneSensorCycle() { // Sensor ping cycle complete, do something 
> with the results.
>   for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {
>     Serial.print("cm[");
>     Serial.print(x);
>     Serial.print("] = ");
>     Serial.println(cm[x]);
>     if ((cm[x] == 0) or (cm[x] > maxDistance)) {
>       cm[x] = 999;
>     }
>   }
>   if (troubleshoot) {
>     for (uint8_t i = 0; i < (SONAR_NUM + IR_NUM); i++) {
>       Serial.print("| ");
>       Serial.print(position[i]);
>       Serial.print(" = ");
>       Serial.print(cm[i]);
>       Serial.print("cm ");
>     }
>     Serial.print("| ");
>     Serial.print("Time = ");
>     Serial.print(elapsedMillis);
>     Serial.print("mS");
>     Serial.println();
>   }
>   //else {
>   //  sendData();
>   //}
> }
>
>
> Loop() {
>   .// other code
> oneSensorCycle()
>   . // more code
> }
>
> Serial output:
>
> -- Miniterm on /dev/ttyUSB-sensors  115200,8,N,1 ---
> --- Quit: Ctrl+C | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
> cm[0] = 0
> cm[1] = 95
> cm[2] = 91
> cm[3] = 85
> cm[4] = 246
> | us_Left = 999cm | us_Mid = 999cm | us_Right = 999cm | ir_Left = 
> 999cm | ir_Right = 999cm | Time = 44mS
>
> ...Pat C
>
>
> On Fri, Dec 17, 2021 at 10:07 AM Chris Netter <netterchris at gmail.com> 
> wrote:
>
>     The for loop stops at x < 8, so it won’t overrun.
>
>     What if you remove the sendData() call?  Does that help?
>
>     Also,  make sure you have declared any global variables which are
>     modified by interrupts or other tasks as “volatile”, otherwise the
>     compile may decide to optimize away parts of your code.
>
>     Chris
>
>     *From: *Doug Paradis <mailto:paradug at gmail.com>
>     *Sent: *Thursday, December 16, 2021 11:46 PM
>     *To: *Chris Netter <mailto:netterchris at gmail.com>
>     *Cc: *Pat Caron <mailto:patcaron at mail.com>; dprglist at lists.dprg.org
>     *Subject: *Re: [Dprglist] Arduino Code Troubles
>
>     Pat,
>
>         for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {
>
>         If  SONAR_NUM _ IR_NUM = 8 then you are overrunning the array
>     which goes 0 to 7.
>
>     Regards,
>
>     Doug P.
>
>     On Thu, Dec 16, 2021 at 8:53 PM Chris Netter via DPRGlist
>     <dprglist at lists.dprg.org> wrote:
>
>         So Markus and Karim already pointed out that the original code
>         snipped works as designed.
>
>         It’s also been pointed out already that you are mixing data
>         types. I don’t think that’s the issue, but worth trying to
>         make both the array and maxDistance uint16_t
>
>         As for this new code snippet:
>
>         I don’t see any obvious issue with the for loop.  Are you
>         positive that SONAR_NUM + IR_NUM == 8 ?   if not, you are
>         overshooting the array and that can cause all kinds of
>         non-obvious issues.
>
>         Also, what does sendData() do?  Could it have some
>         side-effects?   Maybe its causing a stack overflow, array
>         bounds overflow, or similar, which in turn causes non-obvious
>         issues?
>
>         *From: *Pat Caron via DPRGlist <mailto:dprglist at lists.dprg.org>
>         *Sent: *Thursday, December 16, 2021 9:04 PM
>         *To: *dprglist at lists.dprg.org
>         *Subject: *Re: [Dprglist] Arduino Code Troubles
>
>         Hi guys, here is a better example to show what is happening
>         taken from actual code:
>
>         .... other code
>           for (uint8_t x = 0; x < (SONAR_NUM + IR_NUM); x++) {  //
>         SONAR_NUM + IR_NUM = 8
>             if ((cm[x] == 0) || (cm[x] > maxDistance)) {
>               cm[x] = 999;
>             }
>
>           sendData();
>
>           }
>
>         Printed values cm[0] to cm[5] (us_Left to ir_Right) without
>         the above if statement
>         | us_Left = 0cm | us_Mid = 95cm | us_Right = 51cm | ir_Left =
>         84cm | ir_Right = 252cm | Time = 45mS
>
>         Printed values cm[0] to cm[5] with the above if statement
>         \| us_Left = 999cm | us_Mid = 999cm | us_Right = 999cm |
>         ir_Left = 999cm | ir_Right = 999cm | Time = 44mS
>
>         ...Pat C
>
>         On Thu, Dec 16, 2021 at 8:45 PM Karim Virani
>         <pondersome64 at gmail.com> wrote:
>
>             It's doing what it's coded to do
>
>             On Thu, Dec 16, 2021 at 7:42 PM Pat Caron via DPRGlist
>             <dprglist at lists.dprg.org> wrote:
>
>                 Hi Murray, I did try that with the same results. 
>                 NewPing.h library is looking for a uint16_t although
>                 it didn't complain when I tried that.
>
>                 ...Pat C
>
>                 On Thu, Dec 16, 2021 at 8:35 PM Murray Altheim via
>                 DPRGlist <dprglist at lists.dprg.org> wrote:
>
>                     Hi Pat,
>
>                     What if you define maxDistance as uint32_t?
>
>                     Cheers,
>
>                     Murray
>
>                     On 17/12/21 2:27 pm, Pat Caron via DPRGlist wrote:
>                     > Hi guys, I'm looking for help with the following
>                     Arduino code.
>                     >
>                     >      uint32_t cm[8] = {0,0,0,0,0,0,0,0}; //
>                     Create array
>                     >      uint16_t maxDistance = 200; // Also used
>                     with NewPing.h library
>                     >      .
>                     >      . // Other code here
>                     >      .
>                     >      irSensorL.read(); // Read IR sensor... This
>                     is working!
>                     >      cm[3] = irSensorL.ranging_data.range_mm/10;
>                     // This returns 268
>                     >      if (cm[3] > maxDistance) {
>                     >        cm[3] = 999;     /
>                     >      }
>                     >      Serial.println(cm[3]);  / cm[3] value is
>                     always = 999
>                     >      sendData();
>                     >
>                     > The cm[3] value is always 999 when I run this.
>                     > If I comment out the if cm[3]... statement cm[3]
>                     value is then 268.
>                     >
>                     > ...Pat C
>                     >
>                     > _______________________________________________
>                     > DPRGlist mailing list
>                     > DPRGlist at lists.dprg.org
>                     > http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>                     >
>
>                     -- 
>
>                     ........................................................................
>                     Murray Altheim <murray18 at altheim dot com>    
>                      = =  ===
>                     http://www.altheim.com/murray/  ===  ===
>                                                     = = ===
>                          In the evening
>                          The rice leaves in the garden
>                          Rustle in the autumn wind
>                          That blows through my reed hut.
>                                 -- Minamoto no Tsunenobu
>
>                     _______________________________________________
>                     DPRGlist mailing list
>                     DPRGlist at lists.dprg.org
>                     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>
>         _______________________________________________
>         DPRGlist mailing list
>         DPRGlist at lists.dprg.org
>         http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>
>     _______________________________________________
>     DPRGlist mailing list
>     DPRGlist at lists.dprg.org
>     http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org
>
>
> _______________________________________________
> DPRGlist mailing list
> DPRGlist at lists.dprg.org
> http://lists.dprg.org/listinfo.cgi/dprglist-dprg.org


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dprg.org/pipermail/dprglist-dprg.org/attachments/20211217/7b617a35/attachment.html>


More information about the DPRGlist mailing list