MakerMax Inc. / Mbed OS ion

Dependencies:   MCP342x ssd1306_library

Revision:
1:c410db7a0673
Parent:
0:fcf0df749468
--- a/main.cpp	Mon Dec 16 14:12:17 2019 +0000
+++ b/main.cpp	Mon Dec 16 14:38:54 2019 +0000
@@ -1,23 +1,206 @@
-/* mbed Microcontroller Library
- * Copyright (c) 2019 ARM Limited
- * SPDX-License-Identifier: Apache-2.0
- */
+/**
+ ******************************************************************************
+ * File Name          : MAIN.CPP
+ * Description        : DEMO CODE FOR THE ION HARDWARE KIT
+ * DATE               : DEC 15 2019
+ ******************************************************************************
+ ** This notice applies to any and all portions of this file
+ * that are not between comment pairs USER CODE BEGIN and
+ * USER CODE END. Other portions of this file, whether
+ * inserted by the user or by software development tools
+ * are owned by their respective copyright owners.
+ *
+ * COPYRIGHT(c) 2019 MAKERMAX INC.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *   1. Redistributions of source code must retain the above copyright notice,
+ *      this list of conditions and the following disclaimer.
+ *   2. Redistributions in binary form must reproduce the above copyright notice,
+ *      this list of conditions and the following disclaimer in the documentation
+ *      and/or other materials provided with the distribution.
+ *   3. Neither the name of MAKERMAX INC. nor the names of its contributors
+ *      may be used to endorse or promote products derived from this software
+ *      without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ ******************************************************************************/
+
 
 #include "mbed.h"
-#include "platform/mbed_thread.h"
+#include "mcp342x.h"
+#include "ssd1306.h"
+
+Serial device(USBTX, USBRX);  // tx, rx
+SSD1306 lcd (I2C_SDA, I2C_SCL);
+
+int16_t getAdcData(MCP342X *mcp3428, MCP342X::AdcChannel ch, MCP342X::SampleSetting s) {
+      //Configure channel and trigger.
+      mcp3428->setChannel(ch);
+      mcp3428->setSampleSetting(s);
+      mcp3428->trigger();
+ 
+      // polling data
+      MCP342X::Data data;
+      do {
+          wait_us(100000);
+          mcp3428->getData(&data);
+      } while(data.st == MCP342X::DATA_NOT_UPDATED);
+ 
+      return data.value;
+  }
+
+#define I2C_SPEED_100KHZ 100000
+#define PIN_SERIAL_TX   P0_4
+#define PIN_SERIAL_RX   P0_5 
+
+DigitalOut myled(LED1);
+AnalogOut aout(A2);
+AnalogOut aout2(D13);
+
+
+
+float voltage=0; //ch3
+float chg=0;  //ch1
+float dchg=0; //ch2
+float temp=0; //ch4
+float cshunt=0.2;
+float dshunt=0.2;
 
 
-// Blinking rate in milliseconds
-#define BLINKING_RATE_MS                                                    500
+int main() {
+ // Instanciate I2C
+  I2C i2c(I2C_SDA, I2C_SCL);
+  i2c.frequency(I2C_SPEED_100KHZ);
+
+// Serial output for debug. (optional)
+
+MCP342X mcp342x(&i2c, MCP342X::SLAVE_ADDRESS_68H);
+mcp342x.setConversionMode(MCP342X::ONE_SHOT); 
+
+    while(1) {
+        aout.write_u16(0);
+        aout2.write_u16(30000);  // 0 - 65500
+        HAL_Delay(100);
+
+// Supposes that the device is MCP3428, which has 4 channels.
+const uint8_t CHANNEL_NUM = 4;
+// Sampling setting. Ch1 is 12-bit, Ch2 is 14-bit, Ch3 is 16-bit, Ch4 is 16-bit.
+const MCP342X::SampleSetting sampleSetting[CHANNEL_NUM] = 
+{MCP342X::SAMPLE_15HZ_16BIT, MCP342X::SAMPLE_15HZ_16BIT,
+MCP342X::SAMPLE_15HZ_16BIT, MCP342X::SAMPLE_15HZ_16BIT};
+          // Data buffer.
+int16_t data[CHANNEL_NUM];
+          // Measures each channel.
+for (int i=0; i < CHANNEL_NUM; i++) {
+    data[i]=getAdcData(&mcp342x, (MCP342X::AdcChannel)i, sampleSetting[i]);
+ }
+          // Prints out the ADC results.
+device.printf("%d, %d, %d, %d\r\n", data[0], data[1], data[2], data[3]);
+
+chg=float(data[0]);    
+chg=chg/32767;
+chg=chg*2.048;
+chg=chg/cshunt;
+
+dchg=float(data[1]);
+dchg=dchg/32767;
+dchg=dchg*2.048;
+dchg=dchg/dshunt;
+
+voltage=float(data[2]);
+voltage=voltage/32767;
+voltage=voltage*2.048;
+voltage=voltage/0.3197;
 
 
-int main()
-{
-    // Initialise the digital pin LED1 as an output
-    DigitalOut led(LED1);
+temp=float(data[3]);
+temp=temp/32767;
+temp=temp*2.048;
+
+lcd.speed (SSD1306::Slow);  // set working frequency
+lcd.init();                   // initialize SSD1306
+lcd.cls();                    // clear frame buffer
+lcd.locate (2,1);             // set text cursor to line 3, column 1
+lcd.printf ("ch1=%f",chg);    // print to frame buffer
+lcd.locate (3,1);
+lcd.printf ("ch2=%f",dchg);
+lcd.locate (4,1);
+lcd.printf ("ch3=%f",voltage);
+lcd.locate (5,1);
+lcd.printf ("ch4=%f",temp);
+
+lcd.line (  6, 12, 114, 12, SSD1306::Normal); //
+lcd.line (114, 64, 114, 12, SSD1306::Normal); // Surrounds text with 
+lcd.line (114, 62,   6, 62, SSD1306::Normal); // a rectangle
+lcd.line (  6, 64,   6, 12, SSD1306::Normal); //
+//lcd.fill (255, 255);              // fills screen outside rectangle
+lcd.redraw();                 // updates actual display transferring frame buffer over I2C bus
+
+HAL_Delay(5000);
+aout2.write_u16(0);  // 0 - 65500
+aout.write_u16(30000);
+
+
+for (int i=0; i < CHANNEL_NUM; i++) {
+    data[i]=getAdcData(&mcp342x, (MCP342X::AdcChannel)i, sampleSetting[i]);
+ }
+          // Prints out the ADC results.
+device.printf("%d, %d, %d, %d\r\n", data[0], data[1], data[2], data[3]);
 
-    while (true) {
-        led = !led;
-        thread_sleep_for(BLINKING_RATE_MS);
+chg=float(data[0]);    
+chg=chg/32767;
+chg=chg*2.048;
+chg=chg/cshunt;
+
+dchg=float(data[1]);
+dchg=dchg/32767;
+dchg=dchg*2.048;
+dchg=dchg/dshunt;
+
+voltage=float(data[2]);
+voltage=voltage/32767;
+voltage=voltage*2.048;
+voltage=voltage/0.3197;
+
+
+temp=float(data[3]);
+temp=temp/32767;
+temp=temp*2.048;
+
+lcd.speed (SSD1306::Slow);  // set working frequency
+lcd.init();                   // initialize SSD1306
+lcd.cls();                    // clear frame buffer
+lcd.locate (2,1);             // set text cursor to line 3, column 1
+lcd.printf ("ch1=%f",chg);    // print to frame buffer
+lcd.locate (3,1);
+lcd.printf ("ch2=%f",dchg);
+lcd.locate (4,1);
+lcd.printf ("ch3=%f",voltage);
+lcd.locate (5,1);
+lcd.printf ("ch4=%f",temp);
+
+lcd.line (  6, 12, 114, 12, SSD1306::Normal); //
+lcd.line (114, 64, 114, 12, SSD1306::Normal); // Surrounds text with 
+lcd.line (114, 62,   6, 62, SSD1306::Normal); // a rectangle
+lcd.line (  6, 64,   6, 12, SSD1306::Normal); //
+//lcd.fill (255, 255);              // fills screen outside rectangle
+lcd.redraw();                 // updates actual display transferring frame buffer over I2C bus
+HAL_Delay(5000);
+
+
+
     }
 }
+
+