Добрый вечер! При использовании tone для пьезопищалки нарушается работа Ethernet-shilda на SPI и реле на пинах 22 - 35 (начинают без команды включаться). Почитал, что tone использует таймер и работа некоторых пинов может быть нарушена. У меня мега. Убрал с 5-го пина на 36. Ничего не изменилось. Причем происходит это нарушение аппаратно, если отключить провод от пищалки, а код оставить тот же, то все работает без нареканий. Приведу часть кода, так как он длинный Код (C++): #include <SPI.h> #include <Ethernet.h> #include "Wire.h" #define xPin A0 #define yPin A1 #define buttonPin 19 #define TONE 36 #define WATER_FLOW_IN 2 #define WATER_FLOW_OUT 3 #define T_WATER_L 22 #define T_WATER_R 23 #define T_AIR 24 #define PUMP 25 #define TEN 26 #define LIGHT 27 #define KRAN_IN 28 #define KRAN_OUT 29 #define KRAN_MIX 30 #define KRAN_BAK 31 #define WATER_LEVEL_BAK_LOW 32 #define WATER_LEVEL_BAK_HIGH 33 #define WATER_LEVEL_CUBE_LOW 34 #define WATER_LEVEL_CUBE_HIGH 35 void setup() { pinMode(xPin, INPUT); pinMode(yPin, INPUT); pinMode(buttonPin, INPUT_PULLUP); pinMode(T_WATER_L, INPUT); pinMode(T_WATER_R, INPUT); pinMode(T_AIR, INPUT); pinMode(TEN, OUTPUT); pinMode(PUMP, OUTPUT); pinMode(LIGHT, OUTPUT); pinMode(KRAN_IN, OUTPUT); pinMode(KRAN_OUT, OUTPUT); pinMode(KRAN_MIX, OUTPUT); pinMode(KRAN_BAK, OUTPUT); pinMode(WATER_LEVEL_BAK_LOW, INPUT_PULLUP); pinMode(WATER_LEVEL_BAK_HIGH, INPUT_PULLUP); pinMode(WATER_LEVEL_CUBE_LOW, INPUT_PULLUP); pinMode(WATER_LEVEL_CUBE_HIGH, INPUT_PULLUP); pinMode(WATER_FLOW_OUT, INPUT_PULLUP); pinMode(TONE, OUTPUT); digitalWrite(TEN, OFF); digitalWrite(PUMP, OFF); digitalWrite(LIGHT, OFF); digitalWrite(KRAN_IN, OFF); digitalWrite(KRAN_OUT, OFF); digitalWrite(KRAN_MIX, OFF); digitalWrite(KRAN_BAK, OFF); digitalWrite(TONE, LOW); Serial.begin(9600); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); Ethernet.begin(mac, ip); } music(1); attachInterrupt(0, flowIn, RISING); // активация расходомера на 2 пине (0) attachInterrupt(1, flowOut, RISING); // активация расходомера на 3 пине (1) attachInterrupt(4, clickButton, CHANGE); // активация клика на кнопку на 19 пине (4) } void loop() { } void music(int t) { switch(t) { case 1: //старт tone(TONE, 1760, 250); delay(250); tone(TONE, 1976, 250); delay(250); tone(TONE, 2093, 250); delay(250); noTone(TONE); break; case 2: //стоп tone(TONE, 2093, 250); delay(250); tone(TONE, 1976, 250); delay(250); tone(TONE, 1760, 250); delay(250); noTone(TONE); default: //клик tone(TONE, 2093, 250); delay(250); noTone(TONE); break; } }
Странный эффект. Пищалку между пином и землей? Попробуйте включить через резистор, достаточно большого сопротивления. Конденсатор по питанию добавить попробуйте.