/***********************
// ----- OPENPLC pin
DIGITAL IN : 32, 33, 27, 14, 4 : %IX0.0 IX0.5
DIGITAL OUT : 5, 13, 12, 15, 2, 30 : %QX0.0 QX0.6
Analog In : 35, 34, 39, 36 : %IW0 – %IW3
Analog Out : 25, 26 : %QW0 – %QW1
----------------------
I2C pin
SCL : 22
SDA : 21
----------------------
//----------------------------------------------
#include <HardwareSerial.h>
#define SerialDebug Serial
#define RS485_TX_PIN 17
#define RS485_RX_PIN 16
#define RS485 Serial1
#define ESP01_TX_PIN 19
#define ESP01_RX_PIN 18
#define ESP01 Serial2
#define SDA_PIN 21
#define SCL_PIN 22
void setup(){
SerialDebug.begin(115200);
RS485.begin (19200, SERIAL_8N1, RS485_TX_PIN, RS485_RX_PIN);
ESP01.begin (57600, SERIAL_8N1, ESP01_TX_PIN, ESP01_RX_PIN);
// https://docs.espressif.com/projects/arduino-esp32/en/latest/api/i2c.html
Wire.setPins(SDA_PIN, SCL_PIN); // Set the I2C pins before begin
Wire.begin(); // join i2c bus (address optional for master)
}
***********************/
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Bonezegei_DS1307.h>
#include <HardwareSerial.h>
Bonezegei_DS1307 rtc(0x68);
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
// The pins for I2C are defined by the Wire-library.
// On an arduino UNO: A4(SDA), A5(SCL)
// On an arduino MEGA 2560: 20(SDA), 21(SCL)
// On an arduino LEONARDO: 2(SDA), 3(SCL), ...
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
char textBuffer[40];
#define INX0 32 // GPIO32 D2
#define INX1 33 // GPIO33 D3
#define INX2 27 // GPIO27 D4
#define INX3 14 // GPIO14 D5P
#define INX4 4 // GPIO4 D6P
//
#define OUTY0 5 // GPIO 5 A0
#define OUTY1 13 // GPIO13 D13
#define OUTY2 12 // GPIO12 D12
#define OUTY3 15 // GPIO15 D8
#define OUTY4 2 // GPIO2 D7
#define OUTBUZ 23 // GPIO23 A1
//
#define DAC_20mA 25 // GPIO25 D9P
#define DAC_10V 26 // GPIO26 D10P
#define ADC_20mA 35 // GPIO35 A2
#define ADC_10V 34 // GPIO34 A3
#define ADC_10K1 39 // GPIO39 A6
#define ADC_10K2 36 // GPIO36 A7
//-----------
#define PWM_PIN 19 // GPIO19 D11P
#define TXD1_PIN 19 // GPIO19 D11P
//-----------
#define RXD1_PIN 18 // GPIO18
#define TXD_PIN 17 // GPIO17 TXD
#define RXD_PIN 16 // GPIO16 TXD
//-----------
#define RS485_TX_PIN 17
#define RS485_RX_PIN 16
#define RS485 Serial1
#define ESP01_TX_PIN 19
#define ESP01_RX_PIN 18
#define ESP01 Serial2
//--------- ADC in 0-10V ,4-20mA ----------
float Vout0_10V = 0.00;
float Vin0_10V = 0.00;
float R1 = 3000.00; // resistance of R1 (3K)
float R2 = 800.00; // resistance of R2 (1K) // Rin(??)
int val0_10V = 0;
//
float I_420mA = 0.00; // I mA
float R_420mA = 150.00; // R ImA
//------------------------------------
void setup() {
Serial.begin(115200);
RS485.begin(19200, SERIAL_8N1, RS485_TX_PIN, RS485_RX_PIN);
ESP01.begin(57600, SERIAL_8N1, ESP01_TX_PIN, ESP01_RX_PIN);
pinMode(INX0,INPUT);
pinMode(INX1,INPUT);
pinMode(INX2,INPUT);
pinMode(INX3,INPUT);
pinMode(INX4,INPUT);
//
pinMode(OUTY0,OUTPUT); digitalWrite(OUTY0,LOW);
pinMode(OUTY1,OUTPUT); digitalWrite(OUTY1,LOW);
pinMode(OUTY2,OUTPUT); digitalWrite(OUTY2,LOW);
pinMode(OUTY3,OUTPUT); digitalWrite(OUTY3,LOW);
pinMode(OUTY4,OUTPUT); digitalWrite(OUTY4,LOW);
//
pinMode(OUTBUZ,OUTPUT);
digitalWrite(OUTYBUZ,HIGH); delay(100);
digitalWrite(OUTYBUZ,LOW); delay(100);
digitalWrite(OUTYBUZ,HIGH); delay(100);
digitalWrite(OUTYBUZ,LOW);
//
//
dacWrite(DAC_20mA, 0); //0-255
//delay(100);
//dacWrite(DAC_20mA, 0x3F); //0-255
//
dacWrite(DAC_10V, 0); //0-255
//delay(100);
//dacWrite(DAC_10V, 0x3F); //0-255
//
rtc.begin(); // DS1337
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);
display.clearDisplay();
display.display();
delay(500); // Pause for 2 seconds
// text display tests
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
display.println("TEST_ESP32_openPLC");
display.display();
delay(500);
}
void loop() {
if (rtc.getTime()) {
sprintf(textBuffer,"Time %02d:%02d:%02d ", rtc.getHour(), rtc.getMinute(), rtc.getSeconds());
Serial.println(textBuffer);
//
display.clearDisplay();
display.setCursor(0,0);
display.print(textBuffer);
//---- ADC in Read VR ---
display.setCursor(0,12);
display.printf("ADCVR1 = %d",analogRead(ADC_10K1) );
display.setCursor(0,24);
display.printf("ADCVR2 = %d",analogRead(ADC_10K2) );
//------ ADC in 0-10V ---
display.setCursor(0,36);
val0_10V = analogRead(ADC_10V); //reads the analog input ADC0-10V
Vout0_10V = (val0_10V * 3.30) / 4095.00; // formula for calculating voltage out i.e. V+, here 3.3V
Vin0_10V = Vout0_10V / (R2/(R1+R2));
display.printf("ADC 0-10V = %0.2f V",Vin0_10V);
//------ ADC in 0-20mA ---------
display.setCursor(0,48);
val0_10V = analogRead(ADC_20mA); //reads the analog input ADC 0-20mA
Vout0_10V = (val0_10V * 3.30) / 4095.00; // formula for calculating voltage out i.e. V+, here 3.3V
I_420mA = (Vout0_10V/R_420mA) * 1000;
display.printf("ADC 0-20mA = %0.2f mA",I_420mA );
//
display.display();
}
if(digitalRead(INX0) == 1) digitalWrite(OUTY0,HIGH); else digitalWrite(OUTY0,LOW);
if(digitalRead(INX1) == 1) digitalWrite(OUTY1,HIGH); else digitalWrite(OUTY1,LOW);
if(digitalRead(INX2) == 1) digitalWrite(OUTY2,HIGH); else digitalWrite(OUTY2,LOW);
if(digitalRead(INX3) == 1) digitalWrite(OUTY3,HIGH); else digitalWrite(OUTY3,LOW);
if(digitalRead(INX4) == 1) digitalWrite(OUTY4,HIGH); else digitalWrite(OUTY4,LOW);
delay(100);
}