Let's start with a hint:
- You you use millis() in the routine relayCallback() but set mytime and mytime2 immediately before the if clause. This way (millis()-mytime <100) will never become true:
// callback for Thread2
void relayCallback() {
mytime = millis();
if (((millis() - mytime) > 100) && (miss < hit)) {
digitalWrite(RELAY, HIGH);
digitalWrite(LED, HIGH);
Serial1.println("ON");
}
mytime2 = millis();
if (((millis() - mytime2) > 100) && (miss > hit)) {
digitalWrite(RELAY, LOW);
digitalWrite(LED, LOW);
Serial1.println("OFF");
}
}
To achieve the effect you should set the global variables inside the if-clause like this
// callback for Thread2
void relayCallback() {
if (((millis() - mytime) > 100) && (miss < hit)) {
mytime = millis();
digitalWrite(RELAY, HIGH);
digitalWrite(LED, HIGH);
Serial1.println("ON");
}
if (((millis() - mytime2) > 100) && (miss > hit)) {
mytime2 = millis();
digitalWrite(RELAY, LOW);
digitalWrite(LED, LOW);
Serial1.println("OFF");
}
}
Another issue, the line
hit+10;
does probably not do what you want ... If you want hit to be increased by 10 it should read
hit += 10;
I made just the minimum changes to your sketch required to make it compile and work (please check the SoftSerial pins ... ):
#include <Thread.h>
#include <ThreadController.h>
#include "SoftwareSerial.h"
int RELAY = 3;
int LED = 13;
int hit = 0;
int miss = 0;
uint32_t mytime = 0;
uint32_t mytime2 = 0;
String command = "0";
SoftwareSerial Serial1(4,5);
// ThreadController that will controll all threads
ThreadController controll = ThreadController();
//My Thread (as a pointer)
Thread* Thread1 = new Thread();
//His Thread (not pointer)
Thread Thread2 = Thread();
// callback for Thread1
void serialCallback(){
if (Serial.available() > 0) {
command = Serial.readString();
command.trim();
if (command == "X") {
hit += 10;
} else {
miss++;
}
Serial1.println(String(hit) + " " + String(miss));
} else {
//hit = 0;
}
}
// callback for Thread2
void relayCallback() {
if (((millis() - mytime) > 100) && (miss < hit)) {
mytime = millis();
digitalWrite(RELAY, HIGH);
digitalWrite(LED, HIGH);
Serial1.println("ON");
}
if (((millis() - mytime2) > 100) && (miss > hit)) {
mytime2 = millis();
digitalWrite(RELAY, LOW);
digitalWrite(LED, LOW);
Serial1.println("OFF");
}
}
void setup(){
Serial.begin(115200, SERIAL_8N1);
Serial.setTimeout(3);
Serial1.begin(9600); //DEBUG PORT
Serial1.setTimeout(3);
Serial.println("Start");
pinMode(LED, OUTPUT);
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);
digitalWrite(LED, LOW);
// Configure Thread1
Thread1->onRun(serialCallback);
Thread1->setInterval(1);
// Configure Thread2
Thread2.onRun(relayCallback);
Thread2.setInterval(1);
// Adds both threads to the controller
controll.add(Thread1);
controll.add(&Thread2); // & to pass the pointer to it
}
void loop(){
controll.run();
}
The tasks you have here could actually be done easily without threads ... If you like them you might make real use of their functionality. There is a working sketch on
https://wokwi.com/projects/331466515251462738
You can input the "X" in the serial command line after you started the sketch there.
And this makes use of the thread.setinterval() without millis() but using a boolean to avoid continous digitalWrite() ...
#include <Thread.h>
#include <ThreadController.h>
#include "SoftwareSerial.h"
int RELAY = 3;
int LED = 13;
int hit = 0;
int miss = 0;
boolean relaisOn = false;
String command = "0";
SoftwareSerial Serial1(4,5);
// ThreadController that will controll all threads
ThreadController controll = ThreadController();
//My Thread (as a pointer)
Thread* Thread1 = new Thread();
//His Thread (not pointer)
Thread Thread2 = Thread();
// callback for Thread1
void serialCallback(){
if (Serial.available() > 0) {
command = Serial.readString();
command.trim();
if (command == "X") {
hit += 10;
} else {
miss++;
}
Serial1.println(String(hit) + " " + String(miss));
} else {
//hit = 0;
}
}
// callback for Thread2
void relayCallback() {
if (miss < hit && !relaisOn) {
digitalWrite(RELAY, HIGH);
digitalWrite(LED, HIGH);
Serial1.println("ON");
relaisOn = true;
}
if (miss > hit && relaisOn) {
digitalWrite(RELAY, LOW);
digitalWrite(LED, LOW);
Serial1.println("OFF");
relaisOn = false;
}
}
void setup(){
Serial.begin(115200, SERIAL_8N1);
Serial.setTimeout(3);
Serial1.begin(9600); //DEBUG PORT
Serial1.setTimeout(3);
Serial.println("Start");
pinMode(LED, OUTPUT);
pinMode(RELAY, OUTPUT);
digitalWrite(RELAY, LOW);
digitalWrite(LED, LOW);
// Configure Thread1
Thread1->onRun(serialCallback);
Thread1->setInterval(1);
// Configure Thread2
Thread2.onRun(relayCallback);
Thread2.setInterval(100);
// Adds both threads to the controller
controll.add(Thread1);
controll.add(&Thread2); // & to pass the pointer to it
}
void loop(){
controll.run();
}
On Wokwi (with some Serial1 output directed to Serial):
https://wokwi.com/projects/331466752874512978