Код для отображения двоичного значения от 1 датчика Холла A3144, соединенного со сдвиговым регистром 74HC165, когда магнит приближается к нему или отводится?
Я проверил свои соединения, и когда я подношу магнит близко к датчикам Холла, напряжение на них, которое составляет около 4,5 В, становится 0 В, а когда я удаляю магнит, датчик возвращается к 4,5 В. Это означает, что все датчики Холла реагируют на магниты, что делает мои соединения в порядке. Я хочу получить 0, когда магнит приближается к датчику, и 1, когда его убирают.
Приведенный ниже код показывает 11111111 непрерывно и не подвергается воздействию, даже если магнит приближается или убирается. Я ожидал, что код будет показывать 00000000 до тех пор, пока магнит не приблизится к какому-либо датчику. Если магнит поднести ближе к 1 - му датчику, то он должен был показать 10000000 и так далее.
int load = 7;
int clockEnablePin = 4;
int dataIn = 5;
int clockIn = 6;
void setup() {
Serial.begin(9600);
pinMode(load, OUTPUT);
pinMode(clockEnablePin, OUTPUT);
pinMode(clockIn, OUTPUT);
pinMode(dataIn, INPUT);
digitalWrite(clockEnablePin, LOW);
digitalWrite(clockIn, LOW);
}
void loop() {
//Запись импульса на вывод нагрузки
digitalWrite(load, LOW);
digitalWrite(load, HIGH);
//Получить данные из 74HC165
byte incoming = shiftIn(dataIn, clockIn, LSBFIRST);
// Печать на последовательный монитор
Serial.print("Pin States: \r\n");
Serial.println(incoming, BIN);
delay(200);
}
uint8_t shiftIn(uint8_t dataIn, uint8_t clockIn, uint8_t bitOrder) {
uint8_t value = 0;
uint8_t i;
for (i = 0; i < 8; ++i)
{
digitalWrite(clockIn, HIGH);
if (bitOrder == LSBFIRST)
{
value |= digitalRead(dataIn) << i;
}
else
{
value |= digitalRead(dataIn) << (7 - i);
}
digitalWrite(clockIn, LOW);
}
return value;
}
@Dhruv Rastogi, 👍-1
Обсуждение2 ответа
Лучший ответ:
На приведенной выше схеме соединения указаны правильно. У меня был ужасный опыт работы с нерабочим вахтовым регистром. Некоторые 74HC165 не работают должным образом(могут быть дубликатами). Итак, попробуйте купить в проверенном магазине.
Используйте этот код, чтобы получить ВЫСОКОЕ или НИЗКОЕ значение в качестве выходного. Вы можете изменить их на 1 или 0 согласно вашему требованию.
Я использовал этот код, и он отлично работает с 8 переключателями Холла, подключенными к одному регистру сдвига 74HC165. Не забудьте соединить свои контакты с вашим Arduino Uno, как показано в коде, или вы можете обновить свой код в соответствии с вашими соединениями сдвигового регистра с Arduino Uno. Вы можете увеличить количество входов, добавив в схему больше сдвигового регистра 74HC165, а также вам просто нужно обновить значение количества сдвиговых микросхем в приведенном ниже коде.
/* How many shift register chips are daisy-chained.
*/
#define NUMBER_OF_SHIFT_CHIPS 1
/* Width of data (how many ext lines).
*/
#define DATA_WIDTH NUMBER_OF_SHIFT_CHIPS * 8
/* Width of pulse to trigger the shift register to read and latch.
*/
#define PULSE_WIDTH_USEC 5
/* Optional delay between shift register reads.
*/
#define POLL_DELAY_MSEC 1
/* You will need to change the "int" to "long" If the
* NUMBER_OF_SHIFT_CHIPS is higher than 2.
*/
#define BYTES_VAL_T unsigned int
int ploadPin = 7; // Connects to Parallel load pin the 165
int clockEnablePin = 4; // Connects to Clock Enable pin the 165
int dataPin = 5; // Connects to the Q7 pin the 165
int clockPin = 6; // Connects to the Clock pin the 165
BYTES_VAL_T pinValues;
BYTES_VAL_T oldPinValues;
/* This function is essentially a "shift-in" routine reading the
* serial Data from the shift register chips and representing
* the state of those pins in an unsigned integer (or long).
*/
BYTES_VAL_T read_shift_regs()
{
long bitVal;
BYTES_VAL_T bytesVal = 0;
/* Trigger a parallel Load to latch the state of the data lines,
*/
digitalWrite(clockEnablePin, HIGH);
digitalWrite(ploadPin, LOW);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(ploadPin, HIGH);
digitalWrite(clockEnablePin, LOW);
/* Loop to read each bit value from the serial out line
* of the SN74HC165N.
*/
for(int i = 0; i < DATA_WIDTH; i++)
{
bitVal = digitalRead(dataPin);
/* Set the corresponding bit in bytesVal.
*/
bytesVal |= (bitVal << ((DATA_WIDTH-1) - i));
/* Pulse the Clock (rising edge shifts the next bit).
*/
digitalWrite(clockPin, HIGH);
delayMicroseconds(PULSE_WIDTH_USEC);
digitalWrite(clockPin, LOW);
}
return(bytesVal);
}
/* Dump the list of zones along with their current status.
*/
void display_pin_values()
{
Serial.print("Pin States:\r\n");
for(int i = 0; i < DATA_WIDTH; i++)
{
Serial.print(" Pin-");
Serial.print(i);
Serial.print(": ");
if((pinValues >> i) & 1)
Serial.print("HIGH");
else
Serial.print("LOW");
Serial.print("\r\n");
}
Serial.print("\r\n");
}
void setup()
{
Serial.begin(9600);
/* Initialize our digital pins...
*/
pinMode(ploadPin, OUTPUT);
pinMode(clockEnablePin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, INPUT);
digitalWrite(clockPin, LOW);
digitalWrite(ploadPin, HIGH);
/* Read in and display the pin states at startup.
*/
pinValues = read_shift_regs();
display_pin_values();
oldPinValues = pinValues;
}
void loop()
{
/* Read the state of all zones.
*/
pinValues = read_shift_regs();
/* If there was a chage in state, display which ones changed.
*/
if(pinValues != oldPinValues)
{
Serial.print("*Pin value change detected*\r\n");
display_pin_values();
oldPinValues = pinValues;
}
delay(POLL_DELAY_MSEC);
}
Установите контакты clockIn и clockEnablePin на низкий уровень в функции настройки. Не манипулируйте ими в функции цикла. Вам не нужно использовать функции delayMicroseconds (), потому что 74HC165 намного быстрее, чем функции чтения/записи Arduino.
@user81882 Я отредактировал код, но все равно он не работает. Я думаю, что либо код неполон/ неверен, либо мне нужно добавить еще несколько соединений в регистр сдвига., @Dhruv Rastogi
- C++ против языка Arduino?
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- устаревшее преобразование из строковой константы в 'char*'
- Запрограммировать ATMega328P и использовать его без платы Arduino.
- Разница между print() и println()
- Как исправить: Invalid conversion from 'const char*' to 'char*' [-fpermissive]
Проводка кажется мне хорошей. Код, кажется, из [here](https://dronebotworkshop.com/shift-registers/), который я использовал раньше сам (хотя у меня есть жестко запрограммированный вывод clock inhibit). Работает ли это, когда вы тестируете сдвиговый регистр без датчиков, но с помощью кнопок или проводов?, @chrisl