Hallo Zusammen,
ich habe momentan ein Programmierproblem…
Ich möchte mit einem Arduino UNO die Frequenz einer Gabellichtschranke, welche etwa maximal 40 Herz misst, messen und gleichzeitig soll an Pin 9 ein PWM Signal anliegen welches konstant gesendet werden soll.
Der Code um die Frequenz zu messen und das PWM Signal zu senden ist bereits vorhanden und funktioniert allerdings nur einzeln… Sobald ich die beiden Teile zusammenfüge wird zwar noch ein PWM Signal gesendet allerdings ist es sehr abgeschwächt weil der Arduino jetzt noch parallel mit der Frequenzmessung beschäftigt ist…
Hat jemand einen Lösungsvorschlag wie ich beides in den Sketch einfügen kann ohne dass sie diese beiden Aktivitäten im Weg stehen??
// String - Version: Latest
#include <WString.h>
#include <SoftwareSerial.h>
#include<TimeLib.h>
#include <FreqCount.h>
SoftwareSerial SerialHM(2, 3); // RX, TX
// Connect HM10 Arduino Uno
// TXD Pin 2
// RXD Pin 3
int inpin_FR = 8;
int outpin_PWM = 9;
int high_pwm;
unsigned long T;
double f;
unsigned long k;
double fsum;
long int frq;
int d;
int c;
int counter;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
// If the baudrate of the HM-10 module has been updated,
// you may need to change 9600 by another value
// Once you have found the correct baudrate,
// you can update it using AT+BAUDx command
// e.g. AT+BAUD0 for 9600 bauds
pinMode (inpin_FR, INPUT_PULLUP);
pinMode (outpin_PWM, OUTPUT);
SerialHM.begin(9600);
high_pwm=5;
counter=0;
}
void loop() {
sende_PWM(high_pwm);
T = pulseIn(inpin_FR, HIGH) + pulseIn(inpin_FR, LOW);
if (T==0) {
Serial.println("Timeout.");
}
else {
f=1/(double)T; // f=1/T
k++;
}
fsum+=f*1e6;
if(counter == 8 ){ // ungefähr 1 Sekunde mitteln
f = fsum/k*0.9925;
SerialHM.println(f, 0);
fsum=0.0;
k=0;
counter=0;
}
//Arduino an Bluetooth
if (Serial.available()>0) {
c = Serial.read();
SerialHM.println(c, DEC);
}
//Bluetooth über Arduino an Monitor
if (SerialHM.available()>0){
d = SerialHM.read();
if(d != 0)
{
//PWM Signal wird auf den aktuellen Wert gesetzt (1-100)
high_pwm = d;
//sende_PWM(d);
Serial.println(high_pwm);
}
}
counter++;
}
//Funktion zum ständigen Senden des PWM Signals
void sende_PWM(int new_high_pwm)
{
int low_pwm;
digitalWrite(outpin_PWM, HIGH);
delayMicroseconds(new_high_pwm);
low_pwm = 100-new_high_pwm;
digitalWrite(outpin_PWM, LOW);
delayMicroseconds(low_pwm);
}