#include <mcp_can.h> //Bibliotehk für CAN_BUS SPI UND DISPLAY
#include <mcp_can_dfs.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <TimerOne.h>
const byte interruptPin = 13; //Extern InterruptPin
#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_RESET);
#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2
#define LOGO16_GLCD_HEIGHT 16
#define LOGO16_GLCD_WIDTH 16
#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
unsigned char flagRecv = 0; //flag can bus data rec
unsigned char flagopen = 0; //flag vavle open
long unsigned int rxID1 = 0x00000050; //rxID
long unsigned int txID1 = 0x14fa0003; //txID
unsigned char len = 0;
unsigned char buf[8];
unsigned char stmp1[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
unsigned char stmp2[8] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const int SPI_CS_PIN = 10;
float X=0,Y=0;
float P=0,T=0;
int ING=13;
//int T_Ref[23]={ 0,480,540,595,644,688,725,756,782,804,
// 822,837,849,858,867,873,879,883,887,890,
// 893,895,900};
int T_Ref[23]={0,541,609,671,726,775,817,852,882,906,
926,943,957,968,977,984,991,996,1000,1004,
1007,1009,1100}; //tem calculate
MCP_CAN CAN(SPI_CS_PIN); //Set CS pin for canbus
void setup() {
pinMode(ING,INPUT); //Extern Pin 13
//Serial.begin(9600);
while (CAN_OK != CAN.begin(CAN_1000KBPS)) // init can bus : baudrate = 500k//1000kbps
{}
CAN.init_Mask(0,1,0xffff00ff); //Mask defi
CAN.init_Filt(0,1,0x14fa0003); //filter defi
attachInterrupt(0,MCP2515_ISR, FALLING); // start interrupt
pinMode(9, OUTPUT); //pwm out put
Timer1.initialize(100); //pwm frequence
Timer1.pwm(9, 0); //sollwert of null set
pinMode(interruptPin, INPUT); //Extern interrupt set
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); //init
delay(2000);
display.clearDisplay();
}
void MCP2515_ISR() //canbus date receiver interrupt
{
flagRecv = 1; //flag set to 1
}
void vavle_open() { //vavle_open programm
Timer1.pwm(9, 819);
for(volatile int i=0;i<1000;i++) //4A for 4s hold
delayMicroseconds(4000);
for(volatile int i=819;i>150;i--) //4A to 0.6A rampdowm
{
Timer1.pwm(9, i);
delayMicroseconds(5000); //2s for rampdowm
}
}
void vavle_close() { //vavle_close
Timer1.pwm(9,0); //sollwert of null set
}
void loop()
{
if(flagRecv) //can bus receiver data handle
{
flagRecv = 0;
CAN.readMsgBuf(&len, stmp2);
}
stmp1[0]=digitalRead(ING); //Extern interrupt **not use hier
if(stmp2[0]==1&& flagopen==0) //vavle open signal come
vavle_open();
else if(stmp2[0]==0&&flagopen==1) //vavle close signal come
vavle_close();
flagopen=stmp2[0]; //vavle signal flag set
delay(10);
P_MESS(); //pressure measure
T_MESS(); //temp measure
display_zeigen(P,T); //P and T display
CAN.sendMsgBuf(txID1,0,8,stmp2); //P and T data transmit
//missing watchdog for H2 concentration
//missing safe shutdown program
}
void P_MESS(void) //Program for pressure measure
{
unsigned int A=0;
for(byte i=0;i<20;i++)
{
A=A+analogRead(A0);
delay(1);
}
X=(float)A/20.0;
X=constrain(X,102,922);
P=map(X,102,922,0,700);
P=constrain(P,0,700);
}
void T_MESS(void) //program for temp measure
{
unsigned int B=0;
for(byte i=0;i<20;i++)
{
B=B+analogRead(A2);
delay(1);
}
Y=(float)B/20.0;
for(byte i=0;i<22;i++)
{
if(T_Ref[0+i]<Y&&Y<=T_Ref[1+i])
T=-15+(5*i);
else
T=T;
}
}
void display_zeigen(unsigned int DRU, int TMP) //program for data display_zeigen
{
display.clearDisplay();
display.setTextColor(WHITE);
display.setCursor(5,10);
display.setTextSize(2.7);
display.print("P: ");display.print(DRU,DEC);display.println(" Bar");
display.setCursor(5,40);
display.print("T: ");display.print(TMP,DEC);display.println(" ^C");
display.display();
display.clearDisplay();
}
Hallo liebe Gemeinde,
im Rahmen meiner BA befassei ch mich seit kurzem mit Arduino Programmierung und komme bei folgendem Thema leider nicht weiter:
das ist ein Programm für die Anstreuerung einer Ventile. Wenn bug[0]==1 soll die Strom auf 4A gesetzt werden und 4 Sekunden halten. Danach soll er inerhalb von ca. 3 Sekunden auf 0,6A fallen. Ich will mein Programm zu abändern, dass man die Ventile jederzeit schließen kann.
Vielen Dank im Voraus.