Как подключить D1 mini и ATTINY85 по проводу передачи данных

Я пытаюсь соединить свой мини-модуль D1 и USB-модуль attiny85 вместе по проводу передачи данных, но я не знаю, как это сделать.

По сути, я хочу, чтобы D1 транслировал точку доступа с веб-страницей, которая при нажатии кнопки посылает сигнал на attiny85. D1 подключается через силовые провода к attiny85.

У меня есть отправляющий сигнал и настройка веб-сервера на D1, но я не знаю, как позволить attiny85 получить его.

Если это поможет, я использую проволоку.библиотека h на D1

(edit: извините за бездействие, просто не смог его протестировать)

, 👍0

Обсуждение

зачем вам нужно использовать ATtiny? что он делает такого, чего не может сделать D1?, @Juraj

Я использую USB-модуль attiny85 для отправки нажатий клавиш на компьютер, но если бы я использовал его как микроконтроллер, я бы вообще его не использовал., @circle guy


1 ответ


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

2

ATTinyCore, похоже, поставляется с реализацией проводной библиотеки, представляющей тот же интерфейс, что и в других пакетах Arduino board. Пакет damellis этого не делает, поэтому, если вы пытались использовать его, я бы посоветовал переключиться на ATTinyCore.

Для начала вы должны иметь возможность использовать пример Master Writer библиотеки ESP8266-Arduino Wire library с примером Slave Receiver библиотеки ATTinyCore. Чтобы было ясно, вам не нужно получать их из github, они должны быть доступны в меню Файл/Примеры. Поскольку интерфейс один и тот же, вы можете обнаружить, что не имеет значения, с какой платы вы берете пример.

Я не знаю, использовал ли я когда-либо эту проводную библиотеку в ATTinyCore; моя единственная память об использовании I2C slave без ATtiny85 кодировала ее напрямую, но я ожидаю, что она отлично работает. Хотя я могу попробовать сам подтвердить это.

На ATtiny85 вы будете использовать DIP/SOIC pin 7 (PB2) для сигнала SCL. И DIP/SOIC pin 5 (PB0) для сигнала SDA.

Если я попробую это сам позже, я обновлю это с более подробной информацией.

Более подробная информация

У меня нет D1 mini. Однако у меня есть этот клон NodeMCU. Согласно картам контактов, контакты D1 mini D1 и D2 такие же, как и на NodeMCU, то есть GPIO5 и GPIO4 соответственно. Я соединил его вместе, как показано здесь:

NodeMCU and ATTiny85 connected for I2C

Я нарисовал несколько линий в нижней части изображения, где угол камеры плохой. Меньшие изображения вставок предназначены только для того, чтобы показать лучший угол обзора. Желтые и белые провода, несущие "Проводные" данные I2C, подделываются просто потому, что они вышли из кадра.

Не воспринимайте "5V" на разрыве кабеля ISP слишком буквально, эта линия находится на уровне 3,3 В (от контакта NodeMCU 3,3 В).

ATtiny85 загрузил на него следующий код. Это просто пример подчиненного приемника ATTinyCore с удаленными ненужными комментариями и кодом для установки светодиода в зависимости от того, получает ли он ненулевой байт в транзакции I2C ("Провод"):

#include <Wire.h>

static const int LED_PIN = 4;
static const int SLAVE_ADDRESS = 0x08;

void setup() {
  Wire.begin(SLAVE_ADDRESS);
  Wire.onReceive(wire_receive);
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {}

void wire_receive(int howMany) {
  if (Wire.available()) {
    digitalWrite(LED_PIN, Wire.read());
  }        
}

Следующее было загружено на плату NodeMCU. Аналогично, полученный из примера ESP8266 Arduino Wire master-writer. Установите локальный светодиод ESP8266, когда он передает состояние на ATtiny85. В результате ATtiny85 и ESP8266 меняют свои светодиоды каждые 1 секунду вместе. Модуль NodeMCU подключен к тому, чтобы зажечь светодиод на низком уровне, ATtiny85-на ВЫСОКОМ, поэтому, когда один горит, другой нет.

#include <Wire.h>
#include <PolledTimeout.h>

#define SDA_PIN 4
#define SCL_PIN 5
const int16_t I2C_SLAVE_ADDRESS  = 0x08;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  Wire.begin(SDA_PIN, SCL_PIN);
}

void toggle_led() {
    static bool led_state;
  
    led_state = !led_state;    
    digitalWrite(LED_BUILTIN, led_state);
    Wire.beginTransmission(I2C_SLAVE_ADDRESS);
    Wire.write(led_state);
    Wire.endTransmission();
}


void loop() {
  using periodic = esp8266::polledTimeout::periodicMs;
  static periodic nextPing(1000);

  if (nextPing) {
    toggle_led();
  }
}
,