[Dprglist] Arduino Code Troubles

Pat Caron patcaron at mail.com
Fri Dec 17 08:13:47 PST 2021


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 <paradug at gmail.com>
> *Sent: *Thursday, December 16, 2021 11:46 PM
> *To: *Chris Netter <netterchris at gmail.com>
> *Cc: *Pat Caron <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 <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
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.dprg.org/pipermail/dprglist-dprg.org/attachments/20211217/1a907a36/attachment.html>


More information about the DPRGlist mailing list