/ RCWL1601_I2C / arduino_oledtest / arduino_oledtest.ino
arduino_oledtest.ino
 1  // SPDX-FileCopyrightText: 2022 Limor Fried for Adafruit Industries
 2  //
 3  // SPDX-License-Identifier: MIT
 4  
 5  #include <Adafruit_I2CDevice.h>  // requires https://github.com/adafruit/Adafruit_BusIO
 6  #include <Adafruit_SSD1306.h>
 7  #include <Fonts/FreeSans9pt7b.h>
 8  
 9  #define SR04_I2CADDR 0x57
10  Adafruit_I2CDevice sonar_dev = Adafruit_I2CDevice(SR04_I2CADDR);
11  // dont have a i2c device on bus faster than 100KHz, doesnt like it!
12  Adafruit_SSD1306 display = Adafruit_SSD1306(128, 64, &Wire1); // connect to stemma qt - Wire1!
13  
14  
15  void setup() {
16    Serial.begin(115200);
17  
18    // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
19    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3D)) {
20      Serial.println(F("SSD1306 allocation failed"));
21      for(;;); // Don't proceed, loop forever
22    }
23    
24    display.display();
25    delay(1000);
26  
27    //while (!Serial);
28  
29    // Clear the buffer.
30    display.clearDisplay();
31    display.display();
32    display.setFont(&FreeSans9pt7b);
33    display.setTextSize(1);
34    display.setTextColor(SSD1306_WHITE);  
35      
36    if (! sonar_dev.begin(&Wire)) {
37      Serial.println("Could not find I2C sonar!");
38      while (1);
39    }
40    Serial.println("Found RCWL I2C sonar!");
41  }
42  
43  void loop() {
44    uint32_t distance = ping_mm();
45  
46    display.clearDisplay();
47    display.setCursor(0, 30);
48    display.print("I2C Sonar");
49    display.setCursor(0, 50);
50    
51    display.print("Ping: "); 
52    if (distance > 2) {
53      display.print(distance, DEC); display.println(" mm");
54    }
55  
56    Serial.print("Ping mm: "); Serial.println(distance);
57    
58    yield();
59    display.display();
60    delay(50);
61  }
62  
63  uint32_t ping_mm()
64  {
65    uint32_t distance = 0;
66    byte buffer[3];
67    buffer[0] = 1;
68    // write one byte then read 3 bytes
69    if (! sonar_dev.write(buffer, 1)) {
70      return 0;
71    }
72    delay(10);  // wait for the ping echo
73    if (! sonar_dev.read(buffer, 3)) {
74      return 0;
75    }
76    
77    distance = ((uint32_t)buffer[0] << 16) | ((uint32_t)buffer[1] << 8) | buffer[2];
78    distance /= 1000;
79    
80    if ((distance <= 1) || (distance >= 4500)) {   // reject readings too low and too high
81      return 0;
82    }
83  
84    return distance;
85  }