кусочек кода, где не работает if (tim + 5000 > millis()) почему же? таймер поломал совсем? TCCR1A = 0b00000011; // 10bit TCCR1B = 0b00000010; // x8 phase correct Код (C++): #include <Wire.h> // подключаем библиотеку "Wire" #include <iarduino_DHT.h> iarduino_DHT sensor(2); long tim = 0; int oldval1 = 0; // значение для передачи потенциометру int oldval2 = 0; int v = 0; long r = 0; void setup() { pinMode(9, OUTPUT); pinMode(10, OUTPUT); TCCR1A = 0b00000011; // 10bit TCCR1B = 0b00000010; // x8 phase correct //То всё работает корректно в диапазоне от 0 до 1023. Serial.begin(9600); Wire.begin(); } void loop() { if (tim + 5000 > millis()) { tim = millis(); switch(sensor.read()) { // читаем показания датчика case DHT_OK: Serial.println((String) "CEHCOP B KOMHATE: " + sensor.hum + "% - " + sensor.tem + "*C"); Wire.beginTransmission(2); Wire.write(3); Wire.write((int)sensor.hum); Wire.write((int)sensor.tem); Wire.endTransmission(); break; case DHT_ERROR_CHECKSUM: Serial.println( "CEHCOP B KOMHATE: HE PABEHCTBO KC"); break; case DHT_ERROR_DATA: Serial.println( "CEHCOP B KOMHATE: OTBET HE COOTBETCTB. CEHCOPAM 'DHT'"); break; case DHT_ERROR_NO_REPLY: Serial.println( "CEHCOP B KOMHATE: HET OTBETA"); break; default: Serial.println( "CEHCOP B KOMHATE: ERROR"); break; } } }
А с чего ему работать? Код (C++): if (tim + 5000 > millis()) { tim = millis(); Если не считать переполнения, то при таком коде (tim + 5000 > millis()) будет верно ВСЕГДА.
он работает ровно так, как и написан. Всё ж таки лучше почитать книжку по основам си, а потом уже писать.
Переменная tim должна быть типа unsigned long, потому что millis() возвращает число такого типа. Код (C++): unsigned long tim = 0; void loop() { if (millis() - tim > 5000) { tim = millis(); Или так: Код (C++): void loop() { static uint32_t tim = millis(); if (millis() - tim > 5000) { tim = millis(); Но лично я страхуюсь, и делаю так: Код (C++): void loop() { static uint32_t tim = millis(); if (uint32_t(millis() - tim) > 5000) { tim = millis();