Не работает

Тема в разделе "Arduino & Shields", создана пользователем Михаил123, 1 дек 2022.

  1. кусочек кода, где не работает 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;
            }
        }
    }
     
  2. Правильно ли условие?
    Код (C++):
    if (tim + 5000 > millis())
     
  3. Andy16

    Andy16 Нерд

    Код (Text):
        if (tim < millis())
        {
            tim = millis() + 5000;
     
  4. Asper Daffy

    Asper Daffy Иксперд

    На переполнение нарвётесь в полный рост! Нельзя так делать.
     
  5. Asper Daffy

    Asper Daffy Иксперд

    А с чего ему работать?
    Код (C++):
        if (tim + 5000 > millis())
        {
            tim = millis();
     
    Если не считать переполнения, то при таком коде (tim + 5000 > millis()) будет верно ВСЕГДА.
     
  6. Andy16

    Andy16 Нерд

    Через месяц? Я в Беларуси, у меня электричество пропадает три раза в неделю. :)
     
    ostrov нравится это.
  7. конечно, нет
     
  8. поляки воруют?
     
  9. parovoZZ

    parovoZZ Гуру

    он работает ровно так, как и написан. Всё ж таки лучше почитать книжку по основам си, а потом уже писать.
     
  10. Andy16

    Andy16 Нерд

    Электрики такие.
     
  11. User248

    User248 Гик

    Переменная 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();
     
     
    Последнее редактирование: 7 дек 2022