Код для отображения двоичного значения от 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;
}

, 👍-1

Обсуждение

Проводка кажется мне хорошей. Код, кажется, из [here](https://dronebotworkshop.com/shift-registers/), который я использовал раньше сам (хотя у меня есть жестко запрограммированный вывод clock inhibit). Работает ли это, когда вы тестируете сдвиговый регистр без датчиков, но с помощью кнопок или проводов?, @chrisl


2 ответа


Лучший ответ:

1

На приведенной выше схеме соединения указаны правильно. У меня был ужасный опыт работы с нерабочим вахтовым регистром. Некоторые 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);
}
,

0

Установите контакты clockIn и clockEnablePin на низкий уровень в функции настройки. Не манипулируйте ими в функции цикла. Вам не нужно использовать функции delayMicroseconds (), потому что 74HC165 намного быстрее, чем функции чтения/записи Arduino.

,

@user81882 Я отредактировал код, но все равно он не работает. Я думаю, что либо код неполон/ неверен, либо мне нужно добавить еще несколько соединений в регистр сдвига., @Dhruv Rastogi