Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: main.cpp
- Revision:
- 0:cb29cf2767cd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu Nov 07 11:07:51 2019 +0000
@@ -0,0 +1,146 @@
+#include "mbed.h"
+#include "RingBuffer.h"
+#include "SO1602A.h"
+#include "setup.h"
+
+// ---------- ピン設定 ---------- //
+AnalogIn y1(Z0);
+AnalogIn y2(Z1);
+AnalogIn y3(Z2);
+
+DigitalOut select1[]= {
+ DigitalOut(SELECT1_0),
+ DigitalOut(SELECT1_1),
+ DigitalOut(SELECT1_2),
+ DigitalOut(SELECT1_3),
+};
+DigitalOut select2[]= {
+ DigitalOut(SELECT2_0),
+ DigitalOut(SELECT2_1),
+ DigitalOut(SELECT2_2),
+ DigitalOut(SELECT2_3),
+};
+DigitalOut select3[]= {
+ DigitalOut(SELECT3_0),
+ DigitalOut(SELECT3_1),
+ DigitalOut(SELECT3_2),
+ DigitalOut(SELECT3_3),
+};
+DigitalOut uartSE(UART_SE);
+DigitalOut LED(LED3);
+//Serial uart(USBTX,USBRX); // パソコン用
+Serial uart(UARTTX,UARTRX);
+
+I2C i2c(SDA,SCL);
+SO1602A oled(i2c,0x78);
+
+// ------------------------------- //
+
+typedef union {
+ struct {
+ int s0 : 1;
+ int s1 : 1;
+ int s2 : 1;
+ int s3 : 1;
+ int : 4;
+ };
+ uint8_t all;
+} MP_Channel;
+
+#define BUFFER_SIZE 10
+char RS485Data[BUFFER_SIZE];
+RINGBUFFER::RingBuffer RS485uart(RS485Data,BUFFER_SIZE);
+
+static bool port_select[PORT_NUM] = {PORT_0,PORT_1,PORT_2,PORT_3,PORT_4,PORT_5,PORT_6,PORT_7};
+
+int read_data = 0;
+char send_data[PORT_NUM] = {0};
+bool ACflag = true;
+bool NCflag = true;
+
+void Transmit();
+float SensorRead(int pin);
+void SendDataUpdate(char send_data_[]);
+
+int main() {
+
+ uartSE = 1; //送信固定
+ uart.baud(BORATE);
+ uart.attach(Transmit,Serial::TxIrq);
+
+ while(1) {
+ for(int i = 0; i < PORT_NUM; i++) {
+ if(port_select[i] == true) { // ポートを使っていたら
+ NCflag = true;
+ ACflag = true;
+ send_data[i] = 0;
+ for(int j = 0; j < SENSOR_NUM; j++) {
+ read_data = SensorRead(sensor_number[i][j]);
+ send_data[i] += read_data * sensor_weight[j];
+ if(read_data) ACflag = false;
+ else NCflag = false;
+ }
+ if(ACflag) send_data[i] = AC_WEIGHT;
+ else if(NCflag) send_data[i] = NC_WEIGHT;
+ } else {
+ send_data[i] = NO_PORT;
+ }
+ }
+ SendDataUpdate(send_data);
+ }
+}
+
+void Transmit() {
+ __disable_irq();
+ //uart.printf("%d\n\r",RS485uart.GetData());
+ uart.putc(RS485uart.GetData());
+ __enable_irq();
+
+}
+
+void SendDataUpdate(char send_data_[]) {
+ __disable_irq();
+ if(!RS485uart.InAnyData()) {
+ RS485uart.PutData('S');
+ for(int i = 0; i < PORT_NUM; i++) {
+ RS485uart.PutData(send_data_[i]);
+ }
+ RS485uart.PutData('F');
+ }
+ __enable_irq();
+}
+
+float SensorRead(int pin) {
+ MP_Channel ch;
+ float read_data;
+ if(pin < 16) {
+ ch.all = pin;
+ select1[0] = ch.s0;
+ select1[1] = ch.s1;
+ select1[2] = ch.s2;
+ select1[3] = ch.s3;
+ wait_us(1);
+ read_data = y1.read();
+ } else if(pin < 32) {
+ ch.all = pin - 16;
+ select2[0] = ch.s0;
+ select2[1] = ch.s1;
+ select2[2] = ch.s2;
+ select2[3] = ch.s3;
+ wait_us(1);
+ read_data = y2.read();
+ } else if(pin < 48) {
+ ch.all = pin - 32;
+ select3[0] = ch.s0;
+ select3[1] = ch.s1;
+ select3[2] = ch.s2;
+ select3[3] = ch.s3;
+ wait_us(1);
+ read_data = y3.read();
+ } else {
+ read_data = 1.0;
+ }
+ return (read_data < THRESHOLD) ? 1 : 0;
+}
+
+