[Dprglist] Arduino Code Troubles

Rud Merriam rudmerriam at gmail.com
Fri Dec 17 14:06:55 PST 2021


Since you opened the door (LOL).

Ardino code is C++ so as a C++ pedant I'll suggest a different defensive 
approach... Macros are problematic. I think C allows the following.

enum Positions { // might do enum struct Positions : uint8_t {  US_LEFT 
= 0, US_MID  = 1, US_RIGHT = 2, IR_LEFT  = 3. IR_RIGHT = 4 }; const 
uint8_t TIME_DIFF {5}; const uint8_t SONAR_NUM {3}; const uint8_t IR_NUM 
{2}; const uint8_t BUFF_SIZE {SONAR_NUM + IR_NUM}; const uint8_t 
MAX_DISTANCE {200}; const uint8_t DIST_UNKNOWN {999);  uint32_t 
cm[BUFF_SIZE{0}; // will initialize entire array to 0

I'd change the names to be lower case the same as regular variables. 
Using an /enum struct/ can cause challenges since it doesn't convert to 
regular integers so must be cast: /uint8_t(US_LEFT)/. But it is safer if 
you want to enforce its use only as the enum.

-73 -
*Rud Merriam K5RUD*
/Mystic Lake Software/ <http://mysticlakesoftware.com/>

On 12/17/21 3:28 PM, John Gauthier via DPRGlist wrote:
> 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
>
>
>
> _______________________________________________
> 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/ed6e10fe/attachment.html>


More information about the DPRGlist mailing list