A ver de este modo
const byte ledpin = 13;
unsigned long Dt = 1000;
unsigned long ConT = 3000;
unsigned long intervalo = 1000;
unsigned long t = 0;
unsigned long palabra = 0;
unsigned long tiempoP = 0;
unsigned long timeMillis;
bool ledestado = LOW;
void setup() {
Serial.begin(9600);
pinMode(ledpin, OUTPUT);
}
void loop(){
timeMillis = millis();
if (timeMillis - t > Dt) {
Serial.print("Tiempo: ");
Serial.println(timeMillis);
t = timeMillis;
}
if (timeMillis - tiempoP >= intervalo) {
tiempoP = timeMillis;
if (ledestado == LOW)
ledestado = HIGH;
else
ledestado = LOW;
digitalWrite(ledpin, ledestado);
}
if (timeMillis - palabra >= ConT) {
palabra = timeMillis;
Serial.println("SE CUMPLE LOS 3 SEG.");
}
}
No hace falta que en cada consulta uses una variable para llevar el estado de millis(), solo cambia microsegundos.
Tus procesos no son tan precisos como para tomarte ese cuuidado.
Mira el resto de los cambios.
En lo ultimo trabajabas con ConT y no con palabra.